根据摄像机方向改变运动

时间:2012-09-15 15:28:00

标签: c# vector 3d xna camera

美好的一天。我正在制作一个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;
    }

你能告诉我如何更改移动矢量,以便考虑相机方向......?

2 个答案:

答案 0 :(得分:1)

将移动矢量乘以相机旋转矩阵或其反转(我认为它是反向的)。它与视图矩阵相同,但没有翻译。如果要将摄像机固定到平面上,则需要将相应的组件归零,并可能将新矢量标准化。 我不熟悉XNA API,因此我无法确切地告诉您使用哪种方法。您可以从视图矩阵中提取旋转矩阵,或者您可能需要查看原点的差异(lookAt-positios)。

答案 1 :(得分:0)

aere是我通常如何做到的:

   //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;