有没有一种方法可以将RectTransform传输到unity3d的摄像机ViewPort中?

我曾经尝试过几次,但是没有结果。
我想使摄像机的视口恰好在正确的recttransform范围内。

有我的代码:

    public static Rect RectTransformToCameraViewport(RectTransform rectTransform)
{
    float leftDownCornerX = (rectTransform.anchoredPosition.x - rectTransform.sizeDelta.x / 2);
    float leftDownCornerY = (rectTransform.anchoredPosition.y - rectTransform.sizeDelta.y / 2);

    Vector3 leftCorner = new Vector3(leftDownCornerX, leftDownCornerY, 0);
    Vector3 viewPortLeftCorner = new Vector3(leftCorner.x / Screen.width, leftCorner.y / Screen.height, 0);

    float viewportWidth = Mathf.Abs(rectTransform.sizeDelta.x / Screen.width);
    float viewportHeight = Mathf.Abs(rectTransform.sizeDelta.y / Screen.height);

    return new Rect(0.5f + viewPortLeftCorner.x, 0.5f + viewPortLeftCorner.y, viewportWidth, viewportHeight);
}


但是正如我之前所说,它不起作用。

编辑1:

它可以工作,但是不能在我工作的两个差异计算机上工作。也许其中一个与某些直肠有关。

也许您已经解决了这个问题?

最佳答案

如果以前的项目需要将相机移到世界空间UI画布上,我就会遇到这个问题。这是我的实现:

private static void CalculateCameraTransform(Canvas canvas, float fov, out Vector3 pos, out Quaternion rot)
    {
        var rectTransform = canvas.GetComponent<RectTransform> ();
        var corners = new Vector3[4]; rectTransform.GetWorldCorners(corners);
        var normal = GetNormalPlane(corners[0], corners[1], corners[2]);
        var distance = Mathf.Cos(fov * 0.5f * Mathf.Deg2Rad) * Vector3.Distance(corners[0], corners[2]) * 0.5f;

        pos = canvas.transform.position + normal * distance;
        rot = Quaternion.LookRotation(-normal);
    }

    private static Vector3 GetNormalPlane(Vector3 a, Vector3 b, Vector3 c)
    {
        var dir = Vector3.Cross(b - a, c - a);
        var norm = Vector3.Normalize(dir);
        return norm;
    }
}

关于c# - 有没有一种方法可以将RectTransform传输到unity3d的摄像机ViewPort中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38479059/

10-12 01:24