8

私はMolehillから始めており、Matrix3Dの把握に多くの問題を抱えています。私の最初の問題は、単一のモデルの方向を記述するMatrix3Dをどのように管理するかです。

これを行うには、Matrix3D.appendRotation()を使用します。ただし、追加する順序に応じて、異なる結果が得られます(明らかに、グローバル空間で一度に1つずつ回転しているため)。私はこれが一般的な問題であることを知っています、私は3Dソフトウェアモデリングでそれに遭遇しました。しかし今回は、プログラムで修正する必要があります。これは私が助けを必要としているところです。

まず、混乱が生じた場合に備えて、写真の問題は次のとおりです。

ステップ1:モデルをレンダリングします。

開始位置

ステップ2a:X軸を中心に回転させます。正解です!

X軸回転

ステップ2b:Z軸を中心に回転させます。正解です!

Z軸回転

したがって、モデルのX軸とZ軸を中心に回転する場合は、次のようにします

希望するXZ回転

しかし、悲しい顔、私はこれを取得します:

ここに画像の説明を入力してください

問題がわかります。グローバル空間で一度に1つずつ回転を追加しています。オブジェクトのローカル空間で回転する必要があります。これを行う方法や、何を検索する必要があるのか​​(用語など)がわかりません。コードは単純です(そして間違っています):

modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);

Vector3D軸定数を使用する代わりに、modelZRot、modelXRot、そして最終的にはmodelYRotの代わりに、正規化されたベクトルと...ええと...を使用したいと思います。上記の目的のタイプの回転を適用するためのベストプラクティスの解決策を誰かに教えてもらえますか?

更新:「本」(YouTubeではKhanAcademy)をヒットし、ここでこのプレゼンテーションを開始して1日を過ごしました:3D回転行列の数学私は自分の希望に非常に近い一種の「見る」方法に出くわしました解決。残念ながら、私はそれを50%しか理解していません。私はまだ誰かがこのトピックにいくつかの光を当てることができることを願っています!

var angleOfRotation:Number = Math.PI / 2; //90 degrees...
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at... 
//normalize the vector!
axisOfRotation.normalize();
var x:Number = axisOfRotation.x;
var y:Number = axisOfRotation.y;
var z:Number = axisOfRotation.z;
var c:Number = Math.cos(angleOfRotation);
var s:Number = Math.sin(angleOfRotation);
var t:Number = 1 - c;

//Graphics Gems (Glassner, Academic Press, 1990). 
modelLocalMatrix = new Matrix3D(new <Number>[
  t * (x * x) + c,   t * x * y - s * z,   t * x * z + s * y,   0, 
  t * x * y + s * z,   t * (y * y) + c,   t * y * z - s * x,   0, 
  t * x * z - s * y,   t * y * z + s * x,   t * (z * z) + c,   0, 
  0,           0,           0,           1
]);

物事は、これはかなり不格好なようです。特に、Vector3Dの回転角は4番目(w)の値である必要があるためです。さらに重要なことに、Matrix3DにはすでにlookAt()メソッドがあるように見えます。まだわかりません...何時間もの試行錯誤から誰かが私を救ってください!

4

1 に答える 1

2

わかりました、私は基本的にこれを行う方法を理解しました。それは私が作ったよりもずっと簡単です。また、Matrix3D APIのレビューにも役立ちました(いくつかの素晴らしい機能があります!)。

まず、モデルをローカル軸上で回転させるために使用したソースコード:

var raw:Vector.<Number> = modelLocalMatrix.rawData;
var right:Vector3D = new Vector3D(raw[0], raw[1], raw[2]);
var up:Vector3D = new Vector3D(raw[4], raw[5], raw[6]);
var out:Vector3D = new Vector3D(raw[8], raw[9], raw[10]);

modelLocalMatrix.appendRotation(modelXRot, right);
modelLocalMatrix.appendRotation(modelYRot, up);
modelLocalMatrix.appendRotation(modelZRot, out);

「上」、「右」、および「外」の正規化されたベクトルは、私の元の投稿のリンクで説明されています。これらは基本的にモデルのピッチ、ヨー、およびロール軸です。オブジェクトを初期化するとき、これらのベクトルはVector3D.X_AXIS、Y_AXIS、およびZ_AXISと同じであると言えば十分です。より良い方法があるかもしれませんが、Matrix3D.rawDataプロパティを使用してそれらを抽出しました。

これで、これらの軸のいずれかに沿って選択して回転できますが、回転するとすぐに、他の2つの軸の方向が変わります。意味あり。モデルが回転し、その「右」、「上」、「前方」が異なります。したがって、モデルの「右」軸を中心に回転することから始めて(これは、グローバルX_AXISと同じように開始することを忘れないでください)、モデルを「外」軸で回転させたい場合は、モデルのローカル軸からモデルを取得する必要があります。マトリックス。明らかに、それはもはやグローバルZ_AXISと同じではありません。Matrix3D.identity()を呼び出さないことに注意してください。そうすると、モデルの軸がリセットされます。これは私のレンダリングループでは問題ありません、ただし、変換と回転を適用する前にすべての行列をリセットしていたため、コード(および考え方)を少し変更する必要がありました。modelXRot、modelYRot、およびmodelZRotは、回転値を度単位で格納することに注意してください。

これが誰かに役立つことを願っています。このような単純な解決策に共通する問題がどこにも見つからなかったとは信じられません。とにかく、それは確かに私がやりたいことをしているようです。

于 2011-11-23T13:04:59.013 に答える