1

アニメ化されたオブジェクトのコレクションを含む単一のメッシュ (建物) に関する質問があります (これらのオブジェクトは完全な建物を構成し、構築時に地面からさまざまな速度と回転で上昇します)。

メッシュ内のアニメートされたオブジェクトにはすべて、独自の位置と回転のアニメーション トラックがあります。3DS Max から ASE としてエクスポートし、独自のフォーマットに変換して、ゲーム エンジンで使用します。

したがって、現時点では、メッシュ内のすべてのアニメーション化されたオブジェクトのアニメーション化された位置を正常に表示できます。次のことを行います。

スケール、回転、および移動変数は、建物の変換情報です。これは、すべてのサブオブジェクトに有効です。pos 変数は、建物の中心に対するサブオブジェクトの位置を示します。

foreach (GeometricObject geoObject in mesh.GeoObjects)
{
  Vector3 pos = geoObject.AnimationData.PositionTrack[(int)m_keyFrameTime];
  Vector3 translatedPos = new Vector3(translation.X + pos.X, 
                                      translation.Y + pos.Y, 
                                      translation.Z + pos.Z)
  _eRenderer.ActiveCamera.World = Matrix.CreateScale(scale) *
                    Matrix.CreateFromQuaternion(rotation) *
                    Matrix.CreateTranslation(translatedPos);
}

これにより、アニメートされた建物 (地面から立ち上がる) が完全に表示され、すべてのサブオブジェクトが正しい位置に配置されます。

ここで、サブオブジェクトを回転させようとすると問題が発生します。かなりの数の異なるアプローチを試みましたが、サブオブジェクトを回転させた後、サブオブジェクトの移動は常に混乱しているようです。これは私が現在持っているものですが、まだめちゃくちゃです:

foreach (GeometricObject geoObject in mesh.GeoObjects)
{
  Vector3 pos = geoObject.AnimationData.PositionTrack[(int)m_keyFrameTime];
  Vector3 translatedPos = new Vector3(translation.X, translation.Y, translation.Z)

  Matrix rotateSubObjects; 
  rotateSubObjects = Matrix.CreateTranslation(new Vector3(pos.X, pos.Y, pos.Z));
  rotateSubObjects *= Matrix.CreateFromQuaternion(geoObject.AnimationData.RotationTrack[(int)m_keyFrameTime]);

  _eRenderer.ActiveCamera.World = Matrix.CreateScale(scale) *
                    Matrix.CreateFromQuaternion(rotation) *
                    Matrix.CreateTranslation(translatedPos) *
                                  rotateSubObjects;
}

サブオブジェクトを原点を中心に回転させるには、サブオブジェクトを原点に戻し、次にワールド位置に戻す必要があるかもしれないと読みましたが、この場合の方法がわかりません。

私はアイデアがありません。どんな助けもいただければ幸いです!よろしく、リアーン。

4

1 に答える 1

5

あなたが探している変換はこれです:

Matrix positionRotationMatrix = Matrix.CreateTranslation(-parentPosition) 
                               * Matrix.CreateFromQuaternion(parentRotation) 
                               * Matrix.CreateTranslation(parentPosition);
Vector3 translation = Vector3.Transform(parentPosition + relativePosition,
                               positionRotationMatrix);

新しいサブオブジェクトの位置 (translation変数)を使用してワールド マトリックスを定義します。

Matrix worldMatrix = Matrix.CreateScale(scale)
                * Matrix.CreateFromQuaternion(rotation)
                * Matrix.CreateFromQuaternion(parentRotation)
                * Matrix.CreateTranslation(translation);

実証するために、ここに立方体 (親) がその位置を中心に回転し、その位置と回転が親の位置と回転に関連して定義されている矢印があります。矢印は立方体の回転に従い、Z 軸を中心に独立して回転します。

ここに画像の説明を入力

デモンストレーションに使用される値:

parentPosition = Vector3(-1.1f, 0f, -2); //cube
relativePosition = Vector3(0, 0, -3); //arrow
parentRotation = Quaternion.CreateFromRotationMatrix(
                       Matrix.CreateRotationZ(angle) 
                     * Matrix.CreateRotationY(angle) 
                     * Matrix.CreateRotationX(0.5f));
rotation = Quaternion.CreateFromYawPitchRoll(0f, 0f, angle);
angle += 0.05f;
于 2012-12-15T16:12:28.080 に答える