1

在我的 windows phone 应用程序中,我想使用屏幕触摸输入来旋转 3d 模型。

问题是;

起初一切都很好,我可以使用触摸移动模型,但是当我通过 X 轴的旋转使对象上下颠倒时,Y 轴的旋转就会反转。那是因为我的世界轴也发生了变化。我尝试了很多方法。

第一个:

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

第二:

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

第三:

  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 回答