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.
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
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:
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%