OpenGL multiple Matrix-Transformationen

8

Ich habe einen einfachen Vertex-Shader für Modelle

%Vor%

und ich gebe dort modelMatrix

%Vor%

wo transMat zum Positionieren, scaleMat zum Vergrößern des ganzen Bildes und rotMat zum Drehen des ganzen Terrains. Alles in Ordnung, während BaseMat Koordinaten des Modells auf Gelände

ist %Vor%

Wenn ich aber auch versuche, das Modell durch die eigene Modellskala zu vergrößern (Modell hat nullbasierte Koordinaten, zum Beispiel die Baumwurzeln bei (0, 0, 0))

%Vor%

Modelle nicht nur vergrößert, sondern auch Koordinaten ändern und nicht mehr auf dem Gelände platziert. Ist es möglich, eine Modellmatrix mit Skalierung, Rotation, Translation, einer weiteren Translation, Skalierung und Rotation des Modells zu erstellen? Oder sollte ich etwas anderes machen? Matrixmathematik aus GLScene und scheint funktioniert gut.

Bearbeiten : Ich kann proper order nicht mit Matrizen verwenden, indem ich zuerst skaliere, weil ich das habe


Die Struktur des Terrains besteht aus Kacheln mit 64x64 Brocken, die jeweils Basiskoordinaten haben. Um es zusammenzusetzen, muss ich zuerst jeden Block in die richtige Position übersetzen und erst dann skalieren, um das Bild zu vergrößern und mit der Maus zu drehen. Jedes Modell hat auch eine dem Terrain zugewiesene absolute Position. Ich sollte das Modell skalieren und drehen (Modifikatoren des eigenen Modells) und es auf die richtige Position im Gelände bringen. transMat (um Kacheln und Modelle in der Mitte des Bildschirms zu platzieren), scaleMat und rotMat für Terrain und Modelle. Aber lokale scMat und trMat sind für das vergrößerte Modell und stellen es an die richtige Stelle.

Wenn ich Terrain so lasse, wie es mit rotMat * scaleMat * transMat funktioniert, aber Modelle als rotMat * transMat * trMat * scaleMat * scMat benutze, habe ich das
ein bisschen näher

Edit2 : Vertex-Shader wurde auf

geändert %Vor%

und übergeben

%Vor%

Jetzt funktioniert es wie erwartet, danke für Hilfe.

    
user2091150 19.09.2013, 15:09
quelle

1 Antwort

7

Sie müssen die Skalierung vor der Übersetzung anwenden. Die richtige Reihenfolge, in der Matrizen angewendet werden, ist

%Vor%

(Sie können die Rotation und die Übersetzung in bestimmten Fällen ändern, je nachdem, was Sie drehen möchten, aber im Allgemeinen wird das so sein) Also, wenn Sie mehr von ihnen kombinieren möchten, müssen Sie es so machen;

%Vor%

BEARBEITEN

Sie haben also Modelle mit einer Grundpositionsdrehung und Skalierung auf Ihrem Gelände. Und Sie möchten von Zeit zu Zeit andere Transformationen hinzufügen. Sie benötigen viele Matrizen. Berechnen Sie TranslationMatrix2 von den Basiskoordinaten auf dem Gelände Ihrer Modelle. Dein CreateTranslationMatrix(AffineVectorMake(pos.x, pos.y, pos.z)) sollte in Ordnung sein. Die Grundskala und Rotation Ihres Modells auf dem Gelände sollte auch in RotationMatrix2 und ScaleMatrix2 sein. Diese drei Matrixen halten die Grundskalierungsposition und -ausrichtung jedes Ihrer Modelle auf dem Gelände. Ihre endgültige Modellmatrix wird

sein %Vor%

Wenn Sie sie skalieren oder von dieser Position aus verschieben möchten, können Sie mit der Formel neue Transformationen mit denen kombinieren. Angenommen, Sie möchten eine zweite Skalierung und eine neue Rotation und eine neue Translation anwenden, deren Matrizen ScaleMatrix1 , RotationMatrix1 und TranslationMatrix1 sind. Ihre endgültige Modellmatrix lautet:

%Vor%

EDIT2

Wenn Sie diese Struktur Ihres Geländes beibehalten wollen, müssen Sie die Position der Modelle mit der für das Gelände verwendeten Maßstabsmatrix skalieren. Berechnen Sie dann von dieser Position aus die Übersetzungsmatrix Ihres Modells. Verwenden Sie die gemeinsame Rotationsmatrix und die eigene Skalierung des Modells, beispielsweise

%Vor%     
darius 19.09.2013, 15:34
quelle

Tags und Links