XNA-相对于世界移动旋转相机(视图)

时间:2012-11-07 16:19:29

标签: c# xna

所以我一直试图让这个工作,但到目前为止没有运气,希望你能提供帮助。问题是我的项目中有一个摄像头,用户可以用鼠标和按钮自由移动。 目前是这样的: move = new Vector3(0, 0, -1) * moveSpeed; move = new Vector3(0, 0, 1) * moveSpeed; ... 然后我只需将移动矢量添加到cameraPos矢量: cameraPos += move

然后问题是如果我旋转相机然后尝试移动,例如向下移动,它将不会直接向下移动但是以某个角度移动。我假设这是由于在本地轴上移动。但我想做的是在世界轴上移动。这样的事情是可能的,还是我必须以某种方式计算角度,然后在多个轴上移动?

祝你好运!

编辑: 我正在旋转相机,其中 cameraPos 是相机的当前位置, rotation 是相机的当前旋转。这是旋转相机的代码:

void Update()
{
    ...
    if(pressed)
    {
        int newY = currentY - oldY;
        pitch -= rotSpeed * newY;
    }
    Rotate();
}

void Rotate()
{
    rotation = Matrix.CreateRotationX(pitch);
    Vector3 transformedReference = Vector3.Transform(cameraPos, rotation);
    Vector3 lookAt = cameraPos + transformedReference;
    view = Matrix.CreateLookAt(cameraPos, lookAt, Vector3.Up);

    oldY = currentY;
}

我希望这更具可读性。

2 个答案:

答案 0 :(得分:2)

我能够通过使用:

来解决这个问题
Vector3 v;
if (state.IsKeyDown(Keys.Up))
   v = new Vector3(0, 0, 1) * moveSpeed;
... //Other code for moving down,left,right

if (state.IsKeyDown(Keys.V))
    view *= Matrix.CreateRotationX(MathHelper.ToRadians(-5f) * rotSpeed); //Multiplying view Matrix to create rotation

view *= Matrix.CreateTranslation(v); //Multiplying view Matrix to create movement by Vector3 v

答案 1 :(得分:0)

我想你已经在Vector3中保存了你正在看的方向。用以下方法替换您的方法:

direction.Normalize();
var move = direction * moveSpeed;
cameraPos += move;