Unity鼠标点选RenderTexture里渲染的3D模型

公司的产品有个功能:在主相机之外,另有一个摄像机来渲染不同的3D模型,然后把摄像机的RenderTexture赋值给一个 rawImage.texture,作为2D的UGUI来显示。(应用场景:模型结构展示,模型库管理,商品列表中展示商品模型等等)

现在有了新的需求:

  1,实现鼠标在rawImage上面左键拖拽是旋转模型,中键拖拽是移动模型,滚轮滚动是缩放。

  2,实现鼠标点选模型的不同部分(比如汽车模型的门、窗、轮胎等)。

  需求1的实现思路就是,在渲染相机上挂上鼠标交互控制的脚本,然后在rawImage接收到交互事件(Enter,Exit,BeginDrag,EndDrag)时,打开或关闭相机控制脚本中对应的(移动\缩放\旋转)开关,

因为大家用的框架可能都不一样,具体代码要根据自己项目底层的UI事件处理接口和相机控制接口来编写,这里就不细说了。

  需求2的实现的核心点是:在模型的不同部分上添加碰撞体,然后把鼠标在rawImage上面交互的坐标转换到渲染相机的viewport。

下面是关键代码:

 1 //data是鼠标在rawImage上交互的PointEventData数据
 2 //rectTransform是RenderTexture所在的rawImage的RectTransform
 3 //rtCamera是渲染3D模型的摄像机
 4 //返回的obj就是轮胎,窗、门等物体
 5 private GameObject __GetHitObj(PointerEventData data)
 6 {
 7     GameObject obj = null;
 8     var pos = (data.position - (Vector2)rectTransform.position) / rectTransform.lossyScale - rectTransform.rect.position;
 9     var rate = pos / rectTransform.rect.size;
10     var ray = rtCamera.ViewportPointToRay(rate);
11     RaycastHit raycastHit;
12     if (Physics.Raycast(ray, out raycastHit))
13     {
14         //Debug.Log(raycastHit.transform.name);
15         obj = raycastHit.transform.gameObject;
16     }
17     return obj;
18 }

 

posted @ 2020-05-26 18:35  zerozabuu  阅读(917)  评论(0编辑  收藏  举报