1

Windows Phone アプリケーションで、スクリーン タッチ入力を使用して 3D モデルを回転させたいと考えています。

問題は;

最初は問題なく、タッチでモデルを動かせるのですが、X軸の回転でオブジェクトを上下逆さまにすると、Y軸の回転が反転してしまいます。それは私の世界軸も変わったからです。私は多くの方法を試しました。

1位:

Matrix world = Matrix.Identity *Matrix.CreateRotationY( somerotation);
world = world * Matrix.CreateRotationX( somerotation );
world *= Matrix.CreateTranslation(0, 0, 0);

2番目:

    Matrix world = Matrix.Identity * Matrix.CreateFromYawPitchRoll(somerotation,somerotation,0);
world *= Matrix.CreateTranslation(0, 0.0f, zoomXY);

3番目:

  Matrix world = Matrix.Identity *Matrix.CreateFromQuaternion(Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0),somerotation));
    world *= Matrix.CreateFromQuaternion(Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), somerotation));
    world *= Matrix.CreateTranslation(0,0,0);

4位

Matrix world = Matrix.Identity;
            world = Matrix.CreateFromAxisAngle(Vector3.Up,somerotation);
            world *= Matrix.CreateFromAxisAngle(Vector3.Right,somerotation);
            world *= Matrix.CreateTranslation(0, 0,0);

結果は同じです..今、私の心は制御不能に回転しています.

回転後に変化しない静的軸を使用するにはどうすればよいですか? または他の提案はありますか?

ありがとう。

4

1 に答える 1

1

問題は、あなたの数学に問題がないことです。2 番目の軸の動きが逆になっているのは、反対方向から見たときの正しい動きであるためです。これは、もう一方の軸を回転させた結果です。

フレームごとにゼロから固定軸を中心とした回転を作成するのではなく、いくつかの現在の方向ベクトル (上と右、前と左) を保存し、それらの方向に関する小さな増分回転を永続的なワールド マトリックスに適用してみてください。もちろん、方向にも同じ変更を適用する必要があります。

そうすれば、マトリックスが現在どの方向を向いていても、常にそれを基準にして、行きたい方向に回転できます。

編集(コード用):

class gameclass
{
Vector3 forward = Vector3.UnitZ;    //persistent orientation variables
Vector3 left    = -1 * Vector3.UnitX;
Vector3 up      = Vector3.UnitY

Matrix world = Matrix.Identitiy;

InputClass inputputclass;           //something to get your input data

void Update()
{
Vector3 pitch = inputclass.getpitch();          //vertical swipe
forward = Vector3.transform(forward,
    Matrix.CreateFromAxisAngle(left, pitch));
up      = Vector3.transform(up,
    Matrix.CreateFromAxisAngle(left, pitch));

Vector3 yaw = inputclass.getyaw();              //horizontal swipe

forward = Vector3.transform(forward,
    Matrix.CreateFromAxisAngle(up, yaw));
left    = Vector3.transform(left,
    Matrix.CreateFromAxisAngle(up, yaw));

forward.Normalize(); left.Normalize(); top.Normalize();  //avoid rounding errors

world = Matrix.CreateWorld(
    postition                     //this isn't defined in my code
    forward,
    up);
}


}

自由で球状の回転を実現するのは簡単ではありません。:)

于 2012-08-15T22:12:07.140 に答える