当前位置:网站首页>Unity中实现点选RenderTexture中的3D模型
Unity中实现点选RenderTexture中的3D模型
2022-07-31 15:11:00 【幽满谷】
来自: https://blog.csdn.net/zhaojunkuan/article/details/113344129
重写RawImage,两种情况,一种是UI有专门的UI相机,一种是没有专门的UI相机
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Lylibs
{
public class LyRawImage : RawImage, IPointerClickHandler
{
// 点击RawImage时,相对RawImage自身的坐标
private Vector2 ClickPosInRawImg;
// 预览映射相机
private Camera PreviewCamera;
private Camera UICamera;
private Canvas canvasa;
protected override void Start()
{
// 初始获取预览映射相机
if (PreviewCamera == null)
{
PreviewCamera = GameObject.Find("PreviewCamera").transform.GetComponent<Camera>();
}
if (UICamera == null)
{
UICamera = GameObject.Find("UICamera").transform.GetComponent<Camera>();
}
if (canvasa == null)
{
canvasa = GameObject.Find("Canvas").transform.GetComponent<Canvas>();
}
}
void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
{
//GetRawImageObj(eventData, rectTransform, PreviewCamera);
CheckDrawRayLine(canvasa, eventData.position, this, PreviewCamera, UICamera);
}
#region UI不绑定相机
/// <summary>
/// 通过点击RawImage中映射的RenderTexture画面,对应的相机发射射线,得到物体
/// </summary>
/// <param name="data">rawimage点击的数据</param>
/// <param name="rawImgRectTransform">rawimage的recttransfotm</param>
/// <param name="previewCamera">生成rendertexture中画面的相机</param>
/// <returns>返回射线碰撞到的物体</returns>
private GameObject GetRawImageObj(PointerEventData data, RectTransform rawImgRectTransform, Camera previewCamera)
{
GameObject obj = null;
var pos = (data.position - (Vector2)rawImgRectTransform.position) / rawImgRectTransform.lossyScale - rawImgRectTransform.rect.position;
var rate = pos / rawImgRectTransform.rect.size;
var ray = previewCamera.ViewportPointToRay(rate);
RaycastHit raycastHit;
if (Physics.Raycast(ray, out raycastHit))
{
Debug.Log(raycastHit.transform.name);
obj = raycastHit.transform.gameObject;
}
return obj;
}
#endregion
#region UI有专门的UI相机
/// <summary>
/// 射线投射
/// </summary>
/// <param name="canvas">画布</param>
/// <param name="mousePosition">当前Canvas下点击的鼠标位置</param>
/// <param name="previewImage">预览图</param>
/// <param name="previewCamera">预览映射图的摄像机</param>
private void CheckDrawRayLine(Canvas canvas, Vector3 mousePosition, RawImage previewImage, Camera previewCamera, Camera UiCamera)
{
Vector2 ClickPosInRawImg;
// 将UI相机下点击的UI坐标转为相对RawImage的坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, mousePosition, UiCamera, out ClickPosInRawImg))
{
//获取预览图的长宽
float imageWidth = previewImage.rectTransform.rect.width;
float imageHeight = previewImage.rectTransform.rect.height;
//获取预览图的坐标,此处RawImage的Pivot需为(0,0),不然自己再换算下
float localPositionX = previewImage.rectTransform.localPosition.x;
float localPositionY = previewImage.rectTransform.localPosition.y;
//获取在预览映射相机viewport内的坐标(坐标比例)
float p_x = (ClickPosInRawImg.x - localPositionX) / imageWidth;
float p_y = (ClickPosInRawImg.y - localPositionY) / imageHeight;
//从视口坐标发射线
Ray p_ray = previewCamera.ViewportPointToRay(new Vector2(p_x, p_y));
RaycastHit p_hitInfo;
if (Physics.Raycast(p_ray, out p_hitInfo))
{
//显示射线,只有在scene视图中才能看到
Debug.DrawLine(p_ray.origin, p_hitInfo.point);
// Debug.Log(p_hitInfo.transform.name);
}
}
}
#endregion
}
}
边栏推荐
- button控件的使用
- ASP.NET Core 产生连续 Guid
- Nuget package and upload tutorial
- 01 邂逅typescript,环境搭建
- Ubantu专题4:xshell、xftp连接接虚拟机以及设置xshell复制粘贴快捷键
- Message queue data storage MySQL table design
- UnityShader入门学习(一)——GPU与Shader
- 使用 Chainlink Keepers 实现智能合约函数的自动化执行
- element-plus虚拟表格virtual-list组件中是怎么实现清理lodash.memoize缓存的?
- Small test knife: Go reflection helped me convert Excel to Struct
猜你喜欢
如何进行需求分析评审
Getting started with UnityShader (1) - GPU and Shader
[CUDA study notes] First acquaintance with CUDA
STM32(十)------- SPI通信
LeetCode二叉树系列——110.平衡二叉树
分成两栏后文字顺序混乱的问题解决【写期刊论文时】
The paper manual becomes 3D animation in seconds, the latest research of Wu Jiajun of Stanford University, selected for ECCV 2022
工程流体力学复习
2021 OWASP TOP 10 Vulnerability Guide
UnityShader入门学习(一)——GPU与Shader
随机推荐
R语言计算时间序列数据的移动平均值(滚动平均值、例如5日均线、10日均线等):使用zoo包中的rollmean函数计算k个周期移动平均值
Efficient use of RecyclerView Section 2
Ubantu专题4:xshell、xftp连接接虚拟机以及设置xshell复制粘贴快捷键
工程水文学名词解释总结
ASP.NET Core 产生连续 Guid
工程力学复习资料
UnityShader入门学习(三)——Unity的Shader
QGIS 加载WMS数据,重新投影
定时器的类型
Linux查看redis版本(查看mongodb版本)
NC | 斯坦福申小涛等开发数据可重复分析计算框架TidyMass
Excel quickly aligns the middle name of the table (two-word name and three-word name alignment)
工程流体力学复习
Getting started with UnityShader (3) - Unity's Shader
charles进行弱网测试(app弱网测试怎么做)
乡村基冲刺港交所:5个月期内亏2224万 SIG与红杉中国是股东
力扣:714. 买卖股票的最佳时机含手续费
Word表格转到Excel中
Jmeter常用的十大组件
Excel快速对齐表格的中姓名(两个字姓名和三个字姓名对齐)