2016-07-20 6 views
2

Gibt es eine Möglichkeit, RectTransform in den ViewPort der Kamera in unity3d zu transportieren?Gibt es eine Möglichkeit, RectTransform in den ViewPort der Kamera in unity3d zu transportieren?

Ich habe versucht, es mehrmals zu tun, aber es hat kein Ergebnis. Ich möchte das Ansichtsfenster der Kamera genau in die Grenzen der richtigen RectTransform stellen.

Es ist mein Code:

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

Aber wie ich schon sagte, bevor es funktioniert nicht.

Edit 1:

Es funktioniert, aber es ist nicht auf zwei diff Maschinen arbeiten, wo ich arbeite. Vielleicht gibt es etwas mit einem dieser Berichte.

Vielleicht haben Sie dieses Problem bereits gelöst?

+0

welchen Kameratyp verwenden Sie? ist es Ortho oder Perspektive? –

+0

Ich benutze perspektivische Kamera –

+0

es ist unglaublich schwer, dies zu tun. – Fattie

Antwort

0

Ich hatte dieses Problem in einem, wenn meine früheren Projekte, wo die Kamera zu Welt Raum UI Canvases bewegt werden musste. Hier ist meine Implementierung:

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

Hallo! Ich neige dazu zu denken, dass ich nicht verständlich werde ... Meine Frage zu VIEWPORT der Kamera. Viewport, der recttransform entsprechen kann. –

+0

Entschuldigung. Vielleicht könnten Sie die RectTransformUtilities-Klasse überprüfen. – MyIsaak

Verwandte Themen