Wie konvertiere ich vom globalen Koordinatenraum in einen lokalen Raum?

13

Wenn ein Objekt mit dem Namen angegeben wird EntityA, möchte ich einen lokalen Koordinatenraum definieren, in dem die Position des EntityAUrsprungs, sein Richtungsvektor die X-Achse und die Normalen des Richtungsvektors die Y-Achse sind:

bildliche Beschreibung desselben

Wie finde ich angesichts der globalen Koordinaten die Position einer anderen Entität im EntityAlokalen Raum?

Ein Beispiel: EntityADie globale Position von ist (50,50) und die von EntityBist (80,90). Wie ist dann die Position EntityBim EntityAlokalen Raum?

EDIT: Bitte gehen Sie einfach in der Mathematik.

Aviv Cohn
quelle

Antworten:

21

Angenommen, Sie wissen, was die Welttransformationsmatrix für das Objekt A ist, dann müssen Sie nur die Inverse dieser Matrix konstruieren und haben, was Sie brauchen.

Angenommen , die Rotation, Skalierung und Umsetzungsmatrizen des Objekts A verwendete , um es zu globalem Raum ist R , S und T ist. Sie werden diese wie multiplizieren

S * R * T = W

Nehmen Sie nun W und finden Sie irgendwie das inverse W ^ -1 . Die Umkehrung einer Matrix ist diejenige Matrix, die genau das Gegenteil bewirkt. Das Produkt der Matrix mit ihrer Inversen ist immer die Identitätsmatrix.

W * W ^ -1 = I

also W ^ -1 = I / W ;

Wenden Sie nun diese inverse Matrix als Welttransformation auf die Szene an, und jedes Objekt befindet sich in den gewünschten Koordinaten.

Informationen zur Matrixmultiplikation finden Sie auf dieser Seite. Informationen zur Identitätsmatrix finden Sie hier.

Hier ist eine weitere Seite, auf der Sie die Matrizen finden, die Sie benötigen, um W zu erstellen .

In der obigen Frage sollten Sie die Verschiebung in der x-Achse als 50, die Verschiebung in der y-Achse als 50, keine Skalierung in einer der beiden Achsen und eine von Ihnen nicht angegebene Rotation annehmen.

Der Lichtfunke
quelle
Danke für die Antwort, aber ich verstehe eigentlich nicht viel davon. Nicht sehr gut in Mathe. Mit ist eine Matrix? Was meinen Sie mit 'Rotations-, Skalierungs- und Translationsmatrizen'?
Aviv Cohn
Eine Matrix ist eine sehr kompakte Methode zur Darstellung einer Reihe miteinander verbundener Zahlen oder Objekte. In der Computergrafik werden sie häufig für Berechnungen verwendet. Überprüfen Sie den letzten Link in der Antwort, um zu erfahren, was ich unter Rotationsübersetzung und Skalierung von Matrizen verstehe. Andernfalls können Sie die Methode von ashes999 verwenden, um Ihr Problem zu lösen. Dies wird jedoch die Drehung und Skalierung von EntityA nicht berücksichtigen, sofern vorhanden.
The Light Spark
9

Ich habe dies in der Vergangenheit eher mit Trigonometrie als mit Matrizen gemacht (ich bin ein Matrix-Noob). Die Antwort von Ashes999 ist auf halbem Weg. Ermitteln Sie den relativen Vektor und drehen Sie ihn dann um die Umkehrung des Winkels von EntityA.

   relativeX = B.x - A.x
   relativeY = B.y - A.y
   rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
   rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX
Elliot
quelle
2
+1 Trigonometrie ist viel intuitiver und benutzerfreundlicher als Matrizen.
Ramchandra Apte
Was ist mit der Waage? Wann wenden Sie es an?
Llamageddon,
Entschuldigung, meinte Rotation.
Llamageddon
6

Lassen Sie mich versuchen, Ihnen irgendetwas zwischen der Antwort von The Light Spark und der Antwort von Elliot zu sagen, denn nach dem, was ich gelesen habe, suchen Sie wirklich nach einem Algorithmus, dem Sie folgen können, und nicht nur nach Mathematik.

Problemstellung: Wenn Sie eine Position A (50, 50)und eine Überschrift haben (da Sie keine angegeben haben, werde ich diese als bestätigen y = 2 * x + 25), finden Sie, wo B (80, 90)sich die relative APosition und die Überschrift befinden.

Was Sie tun möchten, ist eigentlich ziemlich einfach. 1) Wechseln Sie Azum Ursprung Ihres Systems. Dies bedeutet einfach, dass die Local-to- AValues ​​die globalen Positionswerte minus den globalen Positionswerten von sindA . Awird (0, 0)und Bwird (30, 40).

1.1) Die Überschrift muss ebenfalls verschoben werden. Dies ist eigentlich sehr einfach, da der y-Achsenabschnitt in lokaler AHinsicht immer 0 ist und sich die Steigung nicht ändert, also haben wir y = 2 * xals Überschrift.

2) Nun müssen wir die vorherige Überschrift auf die X-Achse ausrichten. Wie machen wir das? Der einfachste Weg, dies konzeptionell zu tun, besteht darin, die x, y-Koordinaten in ein Polarkoordinatensystem umzuwandeln. Das Polarkoordinatensystem umfasst Rden Abstand zu einem Ort und phieinen Drehwinkel von der x-Achse. Rist definiert als sqrt(x^2 + y^2)und phiist definiert alsatan(y / x) . In den meisten Computersprachen wird heutzutage eine atan2(y, x)Funktion definiert, die genau das Gleiche tut atan(y/x), jedoch so, dass die Ausgabe in der Regel zwischen -180 und 180 Grad und nicht zwischen 0 und 360 Grad liegt, aber beide funktionieren.

B so wird R = sqrt(30^2 + 40^2) = sqrt(2500) = 50 und phi = atan2(40, 30) = 53.13in grad.

Ebenso ändert sich nun die Überschrift. Dies ist etwas schwierig zu erklären, aber da die Überschrift per Definition immer durch unseren Ursprung verläuft A, müssen wir uns keine Sorgen um die RKomponente machen. Überschriften werden immer in Form vonphi = C , wo Ceine Konstante ist . In diesem Fall phi = atan(2 * x / x) = atan(2) = 63.435Grad.

Jetzt können wir das System drehen, um die Überschrift auf die X-Achse des lokalen ASystems zu verschieben. Ähnlich wie beim Übergang Azum Ursprung des Systems müssen wir nur phidie Überschrift von allen phiWerten im System subtrahieren . Also das phivonB wird 53.13 - 63.435 = -10.305Grad.

Schließlich müssen wir die Polarkoordinaten wieder in x, y-Koordinaten umwandeln. Die Formel für diese Transformation lautet X = R * cos(phi)und Y = R * sin(phi). Dafür Bbekommen wir X = 50 * cos(-10.305) = 49.2und Y = 50 * sin(-10.305) = 8.9soB in Ortskoordinaten Anah dran (49,9).

Hoffentlich hilft das und ist leicht genug in der Mathematik, damit Sie folgen können.

Brian Drozd
quelle
1

Sie müssen die Position von Entität A im globalen Raum (x1, y1, θ) kennen, wobei θ die Ausrichtung relativ zur x-Achse ist.

So konvertieren Sie die EntityB-Position von einer globalen Koordinate (x2, y2) in eine lokale Koordinate (x2 ', y2'):


  1. Ausdrücke verwenden

Global zu lokal

x2' = (x2-x1)cosθ + (y2-y1)sinθ

y2' = -(x2-x1)sinθ + (y2-y1)cosθ

Lokal zu Global

x2 = x2'cosθ - y2'sinθ + x1

y2 = x2'sinθ + y2'cosθ + y1

  1. Matrizen verwenden:

    R = [cosθ   -sinθ
    
         sinθ    cosθ]
    
    A = [x1
         y1]
    
    B_global = [x2
                y2]
    
    B_local = [x2' 
               y2']

Global zu lokal

    B_local = inv(R) x (B_global - A)

Lokal zu Global

    B_global = R x B_local + A
Nino Pereira
quelle
-2

Um es einfach auszudrücken: Entität B würde einen Verweis auf Entität A benötigen. Sie müssten dann die Differenz zwischen der Position A der Entität und der Position B der Entität ermitteln.

Lucas
quelle
3
Ich verstehe nicht, wie dies die Frage beantwortet.
Anko