我有一个飞机物体。这个平面相对于摄像机是固定的(平面是摄像机的孩子,总是面向摄像机 - Fixed Plane)。
这架飞机上有一些RenderTexture。现在我想知道,鼠标光标下目前的UV坐标是什么。 以下脚本位于此平面对象上:
//....
_collider = gameObject.GetComponent<Collider>(); // Plane's mesh collider
//....
void FixedUpdate()
{
RaycastHit hit;
var p = UnityEngine.Input.mousePosition;
if (_collider.Raycast(Camera.main.ScreenPointToRay(p), out hit, 100f))
{
var meshCollider = hit.collider as MeshCollider;
var rend = hit.collider.GetComponent<Renderer>();
if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null)
return;
var pixelUV = hit.textureCoord;
pixelUV.x *= rend.material.mainTexture.width;
pixelUV.y *= rend.material.mainTexture.height;
Debug.Log("UV=[" + hit.textureCoord.x + ";" + hit.textureCoord.y + "]" + ", XY=[" + pixelUV.x + ";" + pixelUV.y + "]");
}
}
但我在日志中看到的坐标非常奇怪。首先,当我在视口中更改宽高比时,16:10中XY [51,466]的点在4:3中变为XY [95,464],依此类推。其次,偏移非常大,即使鼠标指针远离这个平面,我也会得到UV读数。 我无法弄清楚如何正确地进行光线投射。
无论屏幕大小如何,如何正确获取这些UV读数?
UPD: 我最终完全放弃了鼠标指针。如果你隐藏光标并且只看碰撞检测,上面的代码实际上效果很好。现在我在射线命中点显示一个非常小的球体,当你移动鼠标时,这个球体平滑地跟随平面:现在这是我的&#34;指针&#34;。它的效果非常好,甚至比真正的&#34;更好。指针:我的3d光标实际上跟随对象几何。由于此球体代表实际的光线投射点,因此精度非常高。
我真的很喜欢这种解决方法,但问题仍然存在。
答案 0 :(得分:0)
看看RaycastHit.textureCoord
。 (Link for Reference)
您可以使用以下内容获取RaycastHit
- 对象:
...
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
//use hit.textureCoord here
}
...
希望有所帮助。