6

3Dゲームのシーングラフを作成しようとしています。このグラフでは、すべてのオブジェクトの変換がその親に相対的です。グラフの各ノードには、回転、スケーリング、および平行移動のベクトルがあります。

オブジェクトの絶対変換を取得するために相対変換行列を組み合わせる正しい方法は何ですか?解決策についても説明していただければ幸いです。


これは間違った方法の例です:
これが実際に解決策であることが判明しました:

Matrix GetAbsoluteTransformation()
{
    if (!this.IsRoot())
    {
        return this.Transformation * this.Parent.GetAbsoluteTransformation();
    }
    else
    {
        return this.Transformation;
    }
}

この場合、親ノードを回転、スケーリング、または移動すると、子は同じ量だけ変換されます。これは正しい動作です。 ただし、子は自分の原点を中心に回転するだけで、親の原点を中心に移動することはありません。


アプリケーション:

4輪の車種があります。ホイールは、車の原点の周りに相対的に配置されます。ホイールは、実際のホイールと同じように回転できます。今、車を回転させると、車輪は常に車に取り付けられたままになります。この場合、車はルートであり、ホイールは子ノードです。

別の例は、太陽系のモデルです。惑星はそれ自身の軸の周りを回転し、太陽の周りを動き、そして衛星は惑星の周りを動きます。

4

3 に答える 3

4

あなたの「それをどうやって間違えるか」に関して、私はあなたにそれを壊すことを嫌います、しかしそれは間違っていません。むしろ、それは不完全です。あなたは親子関係とは無関係にそれらの種類の仕事をする必要があります。

その一例を次に示します。あなたが言ったように、ホイールは車に取り付けられています。車を平行移動または回転させる場合、車輪に触れる必要はありません。車輪は車に対して同じ場所にあります。ただし、「実世界」でホイールの新しい位置を取得しようとすると、ツリーをトラバースして、行列変換を適用する必要があります。それはすべてうまくいきますよね?

オブジェクトを回転すると、そのオブジェクトは自身の原点を中心に回転します。したがって、ホイールはおそらくy軸を中心に回転し、惑星はz軸を中心に回転しているはずです。しかし今、あなたが「太陽の周り」で惑星を動かす必要があるならば、あなたは完全に異なる何かをしている。これは個別に計算する必要があります。それは、あなたがすでに持っている同じマッチのいくつかを使用することによってそれが緩和されないということではありませんが(私は自分で数学をしなければ確かに言うことはできませんが)、それは完全に異なります。

オブジェクトの状態を実際に変更することを検討しています。それがシーングラフの美しさです!シーングラフがない場合は、メインシーンに至るまでさまざまな値をすべて把握してから、あらゆる種類の計算を行う必要があります。ここでは、惑星の周りを移動し(天体力学をグーグルで検索できます)、星に対して惑星を移動するために、三角法と代数を少し実行する必要があります。次回メインシーンが惑星がどこにあるかを尋ねるとき、それはシーングラフを下るだけです!:-D

于 2011-11-06T21:47:31.903 に答える
1

これは正しい動作だと思います。

親の原点を中心に回転することは、単純なマトリックススタックで実現できるものではないと思います。親から子にしか伝わらないと思います。

代わりに、親の絶対原点からのオフセットに基づいて相対的な回転と変換を設定してみることができますが、それは単にマトリックススタックにプッシュするよりもはるかに多くの計算です。

同様の質問があります:シーングラフの内側から絶対位置と回転を取得しますか?

于 2011-11-06T21:42:52.937 に答える
1

OpenGLとDirect3Dのどちらを使用しているかによって異なります。OpenGLでは、変換は右から左に適用されますが、Direct3Dでは、変換は左から右に適用されます。これらは両方とも変換システムを設計するための完全に有効な方法ですが、それはあなたがそれらについて異なって考える必要があることを意味します。

OpenGLのシステムで考えるのが最も簡単だと思いますが、その逆です。変換が右から左に適用されるときにオブジェクトの頂点がどのように移動するかを考える代わりに、オブジェクトの座標系が左から右の順序で変換されることを想像します。各変換は、ワールドではなく、新しいローカル座標系を基準にして適用されます。

車のホイールの場合、3つの変換が含まれます。空間内の車の位置、車に対するホイールの原点、およびニュートラル位置に対するホイールの向きです。これらを左から右の順序で適用するだけです(Direct3Dの場合はその逆)。4つの車輪を描画するには、最初に車の変換を適用し、次に現在の変換を記憶し、次に位置と方向の変換を順番に適用し、それぞれの後に記憶された車の変換に戻ります。

于 2011-11-06T21:47:44.307 に答える