私はMolehillから始めており、Matrix3Dの把握に多くの問題を抱えています。私の最初の問題は、単一のモデルの方向を記述するMatrix3Dをどのように管理するかです。
これを行うには、Matrix3D.appendRotation()を使用します。ただし、追加する順序に応じて、異なる結果が得られます(明らかに、グローバル空間で一度に1つずつ回転しているため)。私はこれが一般的な問題であることを知っています、私は3Dソフトウェアモデリングでそれに遭遇しました。しかし今回は、プログラムで修正する必要があります。これは私が助けを必要としているところです。
まず、混乱が生じた場合に備えて、写真の問題は次のとおりです。
ステップ1:モデルをレンダリングします。
ステップ2a:X軸を中心に回転させます。正解です!
ステップ2b:Z軸を中心に回転させます。正解です!
したがって、モデルのX軸とZ軸を中心に回転する場合は、次のようにします。
しかし、悲しい顔、私はこれを取得します:
問題がわかります。グローバル空間で一度に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()メソッドがあるように見えます。まだわかりません...何時間もの試行錯誤から誰かが私を救ってください!