Unity:在光标下确定Plane的UV

时间:2018-01-28 14:27:44

标签: c# unity3d raycasting

我有一个飞机物体。这个平面相对于摄像机是固定的(平面是摄像机的孩子,总是面向摄像机 - 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光标实际上跟随对象几何。由于此球体代表实际的光线投射点,因此精度非常高。

我真的很喜欢这种解决方法,但问题仍然存在。

1 个答案:

答案 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
    }
   ...

Source

希望有所帮助。