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 }