2011-11-06 12 views
5

すべてのオブジェクトの変換が親に対して相対的な私の3Dゲームのシーングラフを作成しようとしています。グラフの各ノードには、Rotation、Scaling、およびTranslationベクトルがあります。絶対的な変換に対する3D

相対変換行列を組み合わせてオブジェクトの絶対的な変換を得る正しい方法は何ですか?あなたのソリューションについても説明できれば嬉しいです。ここ


それは間違って行うの例である:この場合、

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

、親ノードが回転する:
これは実際には溶液であることが判明尺度変更または移動された場合、子供は同じ量に変換されますが、これは正しい動作です! しかし、子供は自分の起源の周りだけを回転し、親の起源の周りを移動しません。


用途:

四輪での車のモデルがあります。車輪は車の原点の周りに相対的に配置されています。実際の車輪のように車輪は回転できます。私が今車を回転させると、車輪は常にその車に取り付けられたままでいるべきです。この場合、車はルートで、車輪は子ノードです。

もう1つの例は、太陽系のモデルです。惑星は自分の軸を中心に回転し、太陽の周りを移動し、月は惑星の周りを移動します。

+0

私の最初のアイデアは、私はそれが実際には解決策ではないと考えていたことを思い出します。私はこれを解決するために過去数時間を費やしました。 * facepalm * 皆さん、迅速で正確なヘルプに感謝します! – Lucius

答えて

3

あなた、私はあなたにそれを壊すことを憎むが、それは間違っていないのです「それは間違って行う方法」。むしろ、それは不完全です。親子関係から独立して、こうした仕事をする必要があります。

ここにその例があります:ホイールはあなたが言及したように車に取り付けられています。車を平行移動または回転させると車輪に触れる必要はありません。車両と同じ場所にあります車にはです。しかし、実際の世界でホイールの新しい場所を取得しようとすると、ツリーの下を移動して、行列の変形を適用する必要があります。それはすべて動作しますよね?

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

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

+0

私はこれを最善の答えとして選びます。私の元のアプローチは正しかった、なぜ私はそれが間違っていると思ったのか分かりません(D:)あなたは太陽系の回転についても正しくあります。どうもありがとうございました! – Lucius

+0

太陽が回転すると、この行列代数で惑星も回転します。フォワード運動学.. – stefan

+0

@Stefan明らかに、太陽は太陽系の子であるべきです。なぜなら、惑星は、原点を中心にしているからです。 – corsiKa

1

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

親の起源を中心に回転させることは、単純な行列スタックで実現できるものだとは思いません。私はあなたが親から子どもまで伝播することしかできないと思います。

親の絶対的な起点からのオフセットに基づいて相対的な回転と変換を設定することもできますが、単純に行列スタックにプッシュするよりはるかに多くの計算が必要です。ここで

は、同様の質問です:に関して Getting absolute position and rotation from inside a scene graph?

+0

ありがとう!また修正してください! :) – Lucius

1

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

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

車上の車輪の場合、空間内の車の位置、車に対する車の原点、および中立位置に対する車輪の向きの3つの変換が含まれます。これらを左から右の順番で適用してください(逆も同様です)。 4つの車輪を描くには、まず車の変形を適用し、次に現在の変形を覚えてから、位置と向きの変換を順番に適用し、それぞれの後に記憶された車の変換に戻ります。

+0

この回答が私の質問に完全に合致するかどうかはわかりません。しかし、まだ、私はまだこの違いについて知らなかったので、ありがとう! :) – Lucius

+0

私はこれらがデフォルトであると信じており、必要に応じてそれらを反転することができます。少なくとも私はあなたがOpenGLでできることを確信しています。 –

+0

@user Marcelosの答えは、何十万人(おそらく何百万人も)の開発者が使用しているフレームワークがたくさんあり、そのうちの1つを使用してあなたのシステム。彼らはあなたに多くの時間のデバッグをするだけでなく(自分で作るよりもずっと時間がかかることに注意してください)、あなたの履歴書には非常に有益なスキルがあります! – corsiKa

関連する問題