当前位置:网站首页>Implementing click on the 3D model in RenderTexture in Unity
Implementing click on the 3D model in RenderTexture in Unity
2022-07-31 15:22:00 【overgrown valley】
来自: 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
}
}
边栏推荐
- OPPO在FaaS领域的探索与思考
- STM32(十)------- SPI通信
- MySQL数据库操作
- 工程水文学名词解释总结
- Getting Started with TextBlock Control Basic Tools Usage, Get Started
- Deployment application life cycle and Pod health check
- org.apache.jasperException(could not initialize class org)
- 数据表插入数据insert into
- 使用 GraphiQL 可视化 GraphQL 架构
- WPF项目--控件入门基础用法,必知必会XAML
猜你喜欢
随机推荐
定时器的类型
TRACE32——C源码关联
自动化测试如何创造业务价值?
mysql黑窗口~建库建表
[CUDA study notes] First acquaintance with CUDA
基于极限学习机(ELM)进行多变量用电量预测(Matlab代码实现)
Doing things software development - the importance of law and understanding of reasonable conclusions
LeetCode二叉树系列——222.完全二叉树的节点个数
BGP综合实验(建立对等体、路由反射器、联邦、路由宣告及聚合)
Deployment application life cycle and Pod health check
vb中如何连接mysql_vb怎么连接数据库「建议收藏」
11 pinia使用
自适应控制——仿真实验三 用超稳定性理论设计模型参考自适应系统
The normal form of the database (first normal form, second normal form, third normal form, BCNF normal form) "recommended collection"
Synchronized和volatile 面试简单汇总
修改SQL语言实现Mysql 多表关联查询优化
MySQL数据库操作
org.apache.jasperException(could not initialize class org)
RecyclerView的高效使用第一节
Excel quickly aligns the middle name of the table (two-word name and three-word name alignment)