6

The Hazy MindによるXNAチュートリアルに従っていますが、Position(Vector3)とRotation(Quaternion)を持つベースオブジェクトがあります。オブジェクトモデルは次のようになります クラス図

チュートリアルのカメラの実装から、RotationメソッドとRevolveメソッドのコピーを作成し、それらをオブジェクトに実装しました。

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);
}

私のBlockオブジェクトはQuadの6つのインスタンスを作成し、各Quadオブジェクトでrenderメソッドを呼び出します。各Quadにオフセットと回転を割り当てて、次のようなテクスチャブロックを形成します。 6つのQuadオブジェクトによってレンダリングされたブロック

そして今、実際の問題があります。BlockオブジェクトでRotateを呼び出すと、オブジェクト自体の回転が変更され、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);
    }
}

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

ブロックオブジェクトが回転しました

間違った解決策

次の解決策は機能しますが、あまり一般的ではなく、制限されます。回転させたい軸をチェックし、すべての側(Quadオブジェクト)を正しい方向に回転させる一連のifステートメント。

適切な解決策

または、QuadオブジェクトのレンダリングをBlockオブジェクト(その親)の回転に依存させることもできますが、これを行う方法がわかりません。

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

質問

だから私が求めているのは、これに関するいくつかのアイデアや考え、おそらくXNAでQuaternionsを使用する方法を説明するいくつかのリンクやチュートリアルです(できれば視覚的な方法で)。

乾杯、あなたの入力を楽しみにしています:)

4

1 に答える 1

2

あなたがすべきこと、そしてあなたはこれについて言及しましたが、Quadオブジェクトのレンダリングを親の回転に依存させます。

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

于 2011-10-25T21:26:18.530 に答える