2012-09-15 6 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;