我有个平面物体。这个平面相对于照相机是固定的(平面是照相机的子平面,总是对着相机-- 固定平面)。
这架飞机上有一些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中有on 51,466的点变成on 95,464,4:3,依此类推。第二,偏移量太大了,即使鼠标指针离这个平面很远,我也能得到紫外线读数。我想不出怎么才能把这件事做好。
无论屏幕大小如何,如何正确获取这些紫外线读数?
UPD:我最终完全放弃了鼠标指针。如果您隐藏游标,只需查看碰撞检测,上面的代码实际上运行良好。现在我在光线中点显示一个非常小的球,当你移动鼠标时,这个球平滑地跟随平面表面:现在这是我的“指针”。它运行得非常好,甚至比“真实”指针更好:我的3D光标实际上遵循物体的几何学。由于这个球体代表的是实际的射线投射命中点,所以精度很高。
我真的很喜欢这个解决办法,但问题仍然存在。
https://stackoverflow.com/questions/48487397
复制相似问题