2011-01-02 14 views
0

スケールからワールド投影行列を構築するときは、行列を回転させて平行移動すると、変換行列はプロセスの最後でなければなりません。そうでない場合は、翻訳を拡大または回転させます。スケールと回転は特定の順序で行う必要がありますか?世界の行列を構築する

は、今私はあなたが順序が重要と考えで正しい

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; 
}); 

答えて

2

を持っています。行列の乗算は可換ではありません。

特定の質問については、不均一なスケーリングを実行している場合は、変換を適用する順序が重要です。スケーリングされた座標は元のローカル座標系であるため、スケーリングを最初に行うことをお勧めします。ツリーをより大きくしたいが幅を広げたくないときは、Y座標をスケーリングします。丘の側に大きな木が欲しい場合は、必要に応じて回転させます。

一方、スケーリングは他のやり取りの結果である可能性があります。キャラクターは動いている天井の下にくっついていて、彼を蹴っている。その場合、キャラクターを回転させてから下にスケーリングする必要があります。

最終的には、変換が発生した順に適用する必要があることを意味します。オブジェクトを目的のシェイプにスケールし、必要に応じて必要な変形を行ってワールドに配置します。あなたの正確な必要性に応じて、途中で余分なステップを追加してください。

+0

結果のオブジェクトはスペースに表示され、効果的にはそれ自身との相対的なものです。 – Puppy

関連する問題