2011-01-02 22 views
0

Wenn Sie eine Welt Projektionsmatrix von Maßstab, drehen, übersetzen Matrizen erstellen, dann muss die Übersetzungsmatrix die letzte in dem Prozess sein, richtig? Sonst skalieren oder rotieren Sie Ihre Übersetzungen. Müssen Skalierung und Rotation in einer bestimmten Reihenfolge ausgeführt werden?Erstellen einer Welt-Matrix

Im Moment habe ich bekam

std::for_each(objects.begin(), objects.end(), [&, this](D3D93DObject* ptr) { 
    D3DXMATRIX WVP; 
    D3DXMATRIX translation, rotationX, rotationY, rotationZ, scale; 
    D3DXMatrixTranslation(&translation, ptr->position.x, ptr->position.y, ptr->position.z); 
    D3DXMatrixRotationX(&rotationX, ptr->rotation.x); 
    D3DXMatrixRotationY(&rotationY, ptr->rotation.y); 
    D3DXMatrixRotationZ(&rotationZ, ptr->rotation.z); 
    D3DXMatrixScaling(&translation, ptr->scale.x, ptr->scale.y, ptr->scale.z); 
    WVP = rotationX * rotationY * rotationZ * scale * translation * ViewProjectionMatrix; 
}); 

Antwort

2

Sie sind richtig, dass die Reihenfolge Angelegenheiten im Denken. Matrixmultiplikation ist nicht kommutativ.

Wie für die spezifische Frage. Wenn Sie eine ungleichmäßige Skalierung durchführen, ist es sicherlich wichtig, in welcher Reihenfolge Sie die Transformationen anwenden. Wahrscheinlich möchten Sie zuerst die Skalierung durchführen, weil dann die skalierte Koordinate immer noch das ursprüngliche lokale Koordinatensystem ist. Wenn Sie den Baum größer, aber nicht breiter machen möchten, skalieren Sie die Y-Koordinate. Wenn Sie einen großen Baum auf der Seite eines Hügels wollen, würden Sie ihn dann nach Bedarf drehen.

Auf der anderen Seite kann Skalierung das Ergebnis einer anderen Interaktion sein. Der Charakter ist unter einer beweglichen Decke festgeklemmt und zerquetscht ihn. In diesem Fall muss das Zeichen in Position gedreht und dann nach unten skaliert werden.

Letztendlich bedeutet dies, dass Sie die Transformationen in der Reihenfolge ihres Auftretens anwenden müssen. Skaliere das Objekt in die gewünschte Form und führe dann die notwendigen Transformationen aus, um sie in die Welt zu bringen. Fügen Sie zusätzliche Schritte in der Mitte entsprechend Ihrem genauen Bedarf hinzu.

+0

Das resultierende Objekt erscheint im Raum und ist nur relativ zu sich selbst relativ. – Puppy