2016-07-20 3 views
2

Есть ли способ транспортировки RectTransform в камеру ViewPort в unity3d?Есть ли способ транспортировки RectTransform в камеру ViewPort в unity3d?

Раньше я пытался сделать это несколько раз, но у него нет результата. Я хочу сделать видовое окно камеры точно в пределах надлежащего прямоугольного преобразования.

Существует мой код:

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); 
} 

Но, как я уже говорил, что не работает.

Edit 1:

Он работает, но он не работает на два дифф машин, где я работаю. Может быть, есть что-то с одним из этих исправлений.

Возможно, вы уже решили эту проблему?

+0

какой тип камеры вы используете? это Орто или Перспектива? –

+0

Я использую перспективную камеру –

+0

, это невероятно сложно сделать. – Fattie

ответ

0

У меня была эта проблема в одном случае, если мои предыдущие проекты, в которых камера должна была перемещаться на холсты мирового пространства. Вот моя реализация:

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; 
    } 
} 
+0

Привет! Я склонен думать, что я становлюсь непонятным ... Мой вопрос о VIEWPORT камеры. Видовое окно, которое может соответствовать прямому преобразованию. –

+0

Извинения. Возможно, вы можете проверить класс RectTransformUtilities. – MyIsaak

Смежные вопросы