Transformation des coordonnées Unity lors de la transformation.

Unity Coordinate Transformation Transform



Ursprünglicher Link
Als ich an einem Projekt arbeitete, gab es eine Anforderung. Sie müssen eine Verschiebungsanimation für das Operationsobjekt der Benutzeroberfläche ausführen und es in ein anderes Referenzobjekt verschieben. Da die UI-Struktur komplizierter ist, sind das Operationsobjekt und das Referenzobjekt untergeordnete Objekte unter verschiedenen übergeordneten Objekten, was die Konvertierung lokaler Koordinaten und Weltkoordinaten umfasst. Überprüfte die API und stellte fest, dass Unity die entsprechende Schnittstelle bereitgestellt hat, nämlich Transform.TransformPoint. Solange das Konzept der relativen Koordinaten geklärt ist, ist es sehr einfach, damit umzugehen.

Wie in der Abbildung gezeigt, wurden 4 GameObjects (Cubes) erstellt. Mein Ziel ist es nun, obj4 mit obj1 zu überlappen, ohne das übergeordnete Objekt von obj4 zu ändern. Da obj4 ein untergeordnetes Element von obj3 ist, sind die im Inspektorfenster angezeigten Koordinaten von obj4 relativ zu den lokalen Koordinaten von obj3. Wenn Sie möchten, dass sich obj4 mit obj1 überlappt, ist dies auf die Berechnung lokaler Koordinaten beschränkt, und es ist unmöglich, das gewünschte Ergebnis zu erzielen.

Wir müssen das gewünschte Ergebnis erzielen, indem wir in das Weltkoordinatensystem konvertieren und dann zurück in das lokale Koordinatensystem konvertieren.



Da obj1 unser Ziel ist, lauten seine Weltkoordinaten relativ zu dem Objekt, das wir bewegen möchten:
V1 = Zielobjekt.transform.TransformPoint (Operation object.transform.localPosition)



Die Weltkoordinaten wurden gefunden und konvertieren dann die relativen Weltkoordinaten in die lokalen Koordinaten des Operationsobjekts:
Operationsobjekt. transform.InverseTransformPoint (v1)



Das Ergebnis sind nun die lokalen Koordinaten, die erforderlich sind, damit sich obj4 und obj1 überlappen.
Um den Test zu erleichtern, wurde ein einfacher Editor geschrieben, um zu beweisen, dass die Schlussfolgerung korrekt ist.

Der endgültige Testcode lautet wie folgt:

using UnityEngine using System.Collections using System.Collections.Generic public class InversePosition : MonoBehaviourpublic List<Transform> posList [HideInInspector] public Transform selectTransform [HideInInspector] public Transform targetTransform void Start()Print()public void Print()// The world coordinates of the operated obj Debug.Log(string.Format('World coordinates of the selected object ({00}]: {1}', selectTransform.name, selectTransform.transform.position)) // The local coordinates of the operated obj Debug.Log(string.Format('Local coordinates of the selected object ({00}]: {1}', selectTransform.name, selectTransform.transform.localPosition)) // World coordinates of the target obj Debug.Log(string.Format('The world coordinates of the target object ({0}}: {1}', targetTransform.name, targetTransform.transform.position)) // Local coordinates of the target obj Debug.Log(string.Format('Local coordinates of the target object ({0}): {1}', targetTransform.name, targetTransform.transform.localPosition)) // The world coordinates of the target obj relative to the operation obj (trabsform.TransformPoint) Vector3 v4 = targetTransform.transform.TransformPoint(selectTransform.localPosition) Debug.Log(string.Format('The world coordinates (TransformPoint) of the target obj relative to the selected obj: {00}', v4)) // The final position of the operation target Debug.Log(selectTransform.transform.InverseTransformPoint(v4)) } }

Zusammenfassend lässt sich sagen, dass ein bestimmtes Unterobjekt an die Position verschoben wird, wenn eine Zielposition bestimmt werden kann. Beide können durch zweistufige Transformation von tranform.TransformPoint und transform.InverseTransformPoint erhalten werden.