2011-10-25 8 views
6

私はThe Hazy MindのXNAチュートリアルに従っています。位置(Vector3)と回転(Quaternion)を持つ基本オブジェクトがあります。オブジェクトモデルは、チュートリアルのカメラ実装からこの Class Diagramブロックの6辺を回転する

のように見える、私はローテーションのコピーを作成し、メソッドを回転フィーチャーと私のBlockオブジェクトが6を作成し、オブジェクト

public virtual void Rotate(Vector3 axis, float angle) 
{ 
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation); 
} 

public virtual void Revolve(Vector3 target, Vector3 axis, float angle) 
{ 
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle)); 

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target; 

    Rotate(axis, angle); 
} 

上でそれらを実装しましたクワッドのインスタンスと各クワッドオブジェクトのrenderメソッドを呼び出しますが、私は、テクスチャブロックは次のように探して形成するために、各クワッドに割り当てられたオフセットと回転があります。 Block rendered by 6 Quad objects

をそして今、我々は、私のブロック上で回転を呼び出し、実際の問題を抱えていますオブジェクトectはオブジェクト自体の回転を変更させ、Quadオブジェクトは回転しません。したがって、私はBlockオブジェクトに新しいRotate関数を実装しました。

public override void Rotate(Vector3 axis, float angle) 
{ 
    for (int i = 0; i < mySides.Length; i++) 
    { 
     Quad side = mySides[i]; 
     side.Revolve(this.Position, axis, angle); 
    } 
} 

しかし、これはここに見られるように、私に期待される結果が得られませんでした:

Block object rotated

間違った解決策

以下のソリューションが動作しますが、非常に一般的ではありませんし、 どの軸を回転させたいのかをチェックし、すべての面(クォードオブジェクト)を正しい方向に回転させるif文の束です。

適切な解決策

代わりに私が作ることができるクワッドのレンダリングは、Blockオブジェクト(親)の回転に依存するオブジェクトが、私はこれを行う方法のわかりませんよ。

3番目と最後のオプションは、Rotateメソッドで各Quadオブジェクトの回転と位置を正しい値に更新することです。これは、私も同様に行う方法がわかりません。

質問

だから、私は何のために求めていることは、この上でいくつかのアイデアや考えで、おそらくいくつかのリンクおよび/または好ましくは視覚的な方法では、XNAで四元数を使用する方法を説明するチュートリアル。

乾杯は、あなたが何をすべき

答えて

2

:)あなたの入力を楽しみにして、あなたはこれを言及し、クワッドのレンダリングは、親の回転に依存するオブジェクト作ります。

これはあなたのような階層システムではかなり簡単です。レンダラーがブロックをレンダリングするときに、ブロックの変換をマトリックスに格納する必要があります。BlockWorldとしましょう。各Quadをレンダリングするときは、Quadのローカル変換をBlockWorldで乗算します。