2012-09-15 178 views
1

美好的一天。我正在开发一款fps游戏,并且我在相机方面有问题,或者因为移动成本太高,因为它在执行移动时不会将相机位置放大... 我试图将它修复成几个不同的方式,但我想我只是不明白所需要的数学:(根据相机方向改变运动

总之,这里的代码:

static public void UpdateCharacterPositionAndCamera(float time) 
    { 
     //mouse look update 
     float rotationSpeed = 3f; 
     if (Input.mouseState != Input.mouseStatePrevious) 
     { 
      float xDifference = Input.mouseState.X - Display.gd.Viewport.Width/2; 
      float yDifference = Input.mouseState.Y - Display.gd.Viewport.Height/2; 
      yRotation -= rotationSpeed * xDifference * time; 
      xRotation -= rotationSpeed * yDifference * time; 
      Mouse.SetPosition(Display.gd.Viewport.Width/2, Display.gd.Viewport.Height/2); 
     } 

     //camera 
     Vector3 cameraPosition = playerPos; 
     Vector3 cameraReference = new Vector3(0f, 0f, -1f); 
     Matrix rotationMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(yRotation)) * Matrix.CreateRotationX(MathHelper.ToRadians(xRotation)); 
     Vector3 transformedReference = Vector3.Transform(cameraReference, rotationMatrix); 
     Vector3 cameraLookat = cameraPosition + transformedReference; 
     viewMatrix = Matrix.CreateLookAt(cameraPosition, cameraLookat, new Vector3(0.0f, 1.0f, 0.0f)); 
     projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Display.gd.Viewport.AspectRatio, 0.1f, 2500.0f); 

     //movement 
     float moveSpeed = 5.0f; 
     Vector3 moveVector = new Vector3(0, 0, 0); 
     if (Input.keyState.IsKeyDown(Keys.Up) || Input.keyState.IsKeyDown(Keys.W)) 
      moveVector += new Vector3(0, 0, -1); 
     if (Input.keyState.IsKeyDown(Keys.Down) || Input.keyState.IsKeyDown(Keys.S)) 
      moveVector += new Vector3(0, 0, 1); 
     if (Input.keyState.IsKeyDown(Keys.Right) || Input.keyState.IsKeyDown(Keys.D)) 
      moveVector += new Vector3(1, 0, 0); 
     if (Input.keyState.IsKeyDown(Keys.Left) || Input.keyState.IsKeyDown(Keys.A)) 
      moveVector += new Vector3(-1, 0, 0); 
     if (Input.keyState.IsKeyDown(Keys.Q)) 
      moveVector += new Vector3(0, 1, 0); 
     if (Input.keyState.IsKeyDown(Keys.Z)) 
      moveVector += new Vector3(0, -1, 0); 
     playerPos += moveVector * moveSpeed; 
    } 

你能告诉我如何改变移动矢量所以需要摄像机的方向进入账户...?

回答

1

将移动矢量乘以相机旋转矩阵或其逆(我认为是逆),它与vi相同ew矩阵,但没有翻译。如果你想将摄像机固定在飞机上,那么你需要在之后将相应的部件归零,也许规格化新的矢量。 我不熟悉XNA API,所以我不能确切地告诉你使用哪些方法。您可能能够从视图矩阵中提取旋转矩阵,或者您可能需要查看来自原点的差异(lookAt-positios)。

+0

是的,它的作品!但是有一个问题:(当我转身时它反转X轴......所以它变得下来,反之亦然,或者不是当我转身时,而是当我将0,0,0边界穿过X或Z的负值(“Y”只是为了提供信息) – NewProger

+0

或者不是......我想到了它,它只是在某种程度上同时发生在不同的轴上时,使得变换在某种程度上不正确。 – NewProger

0

艾利是如何我通常做:

//movement 
    Matrix camWorld = Matrix.Invert(view); 

    Vector3 moveVector = Vector3.Zero; 
    ... 
    if(...keys.Up... or ...keys.W...) 
     moveVector += camWorld.Forward; 
    if(... keys.right or ... keys.D...) 
     moveVector += camWorld.Right; 
    ... 
    moveVector.Normalize(); 
    PlayerPos += moveVector * moveSpeed;