3D-Grafikverarbeitung - So berechnen Sie die Modelview-Matrix

8

Ich habe Probleme, die Mathematik zu verstehen, um vom Objektraum in den Raum zu konvertieren. Ich mache das in Hardware und ich habe die Atranspose-Matrix unten:

Atranspose =

%Vor%

Dann, um den Punkt zu finden, den wir tun würden:

%Vor%

aber ich bin mir nicht sicher, ob das stimmt.

Es könnte auch

sein %Vor%

Kann mir bitte jemand das erklären? Ich kann nichts online darüber finden, das nicht direkt OpenGL-Code-bezogen ist. Ich möchte einfach die Mathematik hinter der Umwandlung von Punkten von Objektkoordinaten in Augenkoordinaten verstehen.

    
slimbo 27.04.2011, 01:08
quelle

2 Antworten

12

Diese Antwort ist wahrscheinlich viel länger als es sein muss. Springe zu den unteren 2 Absätzen oder so, wenn du bereits die meisten Matrix-Mathe verstehst.

Es könnte am einfachsten sein, mit einem eindimensionalen Problem zu beginnen. In 1D haben wir Punkte auf einer Linie. Wir können sie skalieren oder übersetzen. Berücksichtigen Sie drei Punkte i, j, k und die Transformationsmatrix M .

%Vor%

Wenn wir mit M multiplizieren, erhalten wir:

%Vor%

Wenn wir also s und t Werte zuweisen, erhalten wir verschiedene Transformationen auf unserem 1D-Dreieck. Die Skalierung ändert den Abstand zwischen den "Punkten", während die reine Translation sie in Bezug auf den Ursprung verschiebt und den Abstand konstant hält:

%Vor%

Es ist wichtig zu beachten, dass die Reihenfolge der Transformationen kritisch ist. Diese 1D Transformationen skalieren und dann übersetzen. Wenn Sie zuerst übersetzen würden, wäre der "Punkt" eine andere Entfernung vom Ursprung, und der Skalierungsfaktor würde sich dadurch anders auswirken. Aus diesem Grund werden die Transformationen oft in getrennten Matrizen gehalten, so dass die Reihenfolge klar ist.

Wenn wir uns zu 2D bewegen, erhalten wir Matrix N :

%Vor%

Diese Matrix wird 1) einen Punkt skalieren, indem Sie sx, sy , 2) den Punkt um den Ursprung um a drehen Grad und dann 3 übersetzen Sie den Punkt um tx, ty . Beachten Sie, dass diese Matrix unter der Annahme konstruiert wird, dass Punkte als Spaltenvektoren dargestellt werden und dass die Multiplikation als Np erfolgt. Wie datenwolf sagte, wenn Sie eine Reihenvektor-Darstellung von Punkten verwenden möchten, aber die gleiche Transformation anwenden, können Sie alles transponieren und die Reihenfolge vertauschen. Dies ist eine allgemeine Eigenschaft der Matrixmultiplikation: (AB) ^ T = (B ^ T) (A ^ T) .

Das heißt, wir können über Transformationen in Bezug auf Objekt-, Welt- und Augenkoordinaten sprechen. Wenn das Auge am Ursprung der Welt sitzt und nach unten auf die negative Z-Achse der Welt schaut, mit + x nach rechts und + y nach oben und das Objekt, ein Würfel, sitzt 10 Einheiten nach unten -z (zentriert auf der z Achse), mit der Breite von 2 entlang der Welt x, Tiefe von 3 entlang der z, und der Höhe von 4 entlang der Welt y. Wenn das Zentrum des Würfels das lokale Bezugssystem des Objekts ist und seine lokalen Achsen sich bequem mit den Achsen der Welt ausrichten. Dann sind die Ecken der Box in Objektkoordinaten die Variationen von [+/-1,+/-2,+/-1.5]^T . Der nahe, obere, rechte (aus dem Blickwinkel des Auges) Vertex hat Objektkoordinaten [1,2,1.5]^T , in Weltkoordinaten ist der gleiche Vertex [1,2,-8.5]^T ( 1.5-10 = -8.5). Aufgrund dessen, wo das Auge ist, auf welche Weise es zeigt, und der Tatsache, dass wir unser Auge auf die gleiche Weise wie OpenGL definieren, hat dieser Scheitelpunkt die gleichen Augenkoordinaten wie Weltkoordinaten . Lassen Sie uns also das Auge so bewegen und drehen, dass das x des Auges rechts (rt) und das y des Auges hoch und das -z des Auges ist look (lk) und das Auge wird auf [eyeright(ex) eyeup(ey) eyelook(ez)]^T positioniert. Da wir Objektkoordinaten in Augenkoordinaten transformieren möchten (was bedeutet, dass wir das Auge als Ursprung behandeln), nehmen wir die Umkehrung dieser Transformationen und wenden sie auf die Objektscheitelpunkte an (nachdem sie in Weltkoordinaten umgewandelt wurden). Also werden wir haben:

%Vor%

Genauer gesagt, für unseren Interessenpunkt haben wir:

%Vor%

Aus praktischen Gründen habe ich die Übersetzung getrennt, die die Drehung des Auges beeinflusst. Eigentlich, jetzt wo ich so viel geschrieben habe, könnte dies der Punkt der Verwirrung sein. Die Matrix, die Sie angegeben haben, wird sich drehen und dann übersetzen. Ich nahm an, dass die Übersetzung des Auges in Weltkoordinaten lag. Aber wie du es in deiner Frage geschrieben hast, führt es die Übersetzung in Augenkoordinaten durch. Ich habe auch lk negiert, weil wir das Auge so definiert haben, dass es auf der negativen z-Achse nach unten schaut, aber um eine Standard-Rotationsmatrix zu erstellen, möchten wir positive Werte verwenden.

Wie auch immer, ich kann weitermachen, aber vielleicht beantwortet das schon deine Frage.

Fortsetzung:

Erklären Sie das Obige ein wenig weiter, das Trennen der Augentransformation in zwei Komponenten macht es auch viel einfacher, das Gegenteil zu finden. Es ist leicht zu sehen, dass, wenn die Übersetzung tx das Auge relativ zu den Objekten in der Welt bewegt, wir die gleichen relativen Positionen zwischen dem Auge und den Punkten in der Welt beibehalten können, indem wir alles in der Welt verschieben -tx und halten Sie das Auge stationär.

Betrachten Sie auch die Ausrichtung des Auges, wie sie durch die Standard-Ansicht rechts , hoch und definiert ist:

%Vor%

Das Erstellen einer Rotationsmatrix, die diese drei Vektoren in eine neue Richtung zeigt, ist einfach.Wir richten nur unsere drei neuen Achsen rt , hoch , lk (als Spaltenvektoren) ein:

%Vor%

Es ist leicht zu sehen, dass, wenn Sie d_rt, d_up und d_lk erweitern und mit der obigen Matrix multiplizieren, Sie die rt , up und lk erhalten zurück jeweils. Also haben wir die Transformation angewendet, die wir wollten. Um eine richtige Rotation zu sein, müssen die drei Vektoren orthonormal sein. Dies ist wirklich nur eine Veränderung der Grundlagen. Aufgrund dieser Tatsache können wir die Umkehrung dieser Matrix ziemlich bequem finden, indem wir ihre Transponierte nehmen. Das habe ich oben gemacht. Wenn Sie diese transponierte Matrix auf alle Punkte in Weltkoordinaten anwenden und das Auge ruhig lassen, behalten die Punkte die gleiche Position relativ zum Auge bei, als ob sich das Auge gedreht hätte.

Zum Beispiel:

Zuweisen (in Weltkoordinaten):

%Vor%

    
JCooper 27.04.2011, 16:13
quelle
1

Wenn Sie ATranspose in der zweiten Variante transponieren, d. h.

%Vor%

BTW, ^T bedeutet transponieren, also meinte der ursprüngliche Autor wahrscheinlich

%Vor%

und neu geschrieben

%Vor%

dann sind alle diese Formulierungen gleich richtig.

    
datenwolf 27.04.2011 09:46
quelle

Tags und Links