C# 根据相机方向改变运动

C# 根据相机方向改变运动,c#,vector,3d,xna,camera,C#,Vector,3d,Xna,Camera,你好。我正在做一个fps游戏,我有一个相机的问题,或与运动的价格。。。因为它在执行移动时不需要调整摄像机的位置。。。 我试着用几种不同的方法来解决这个问题,但我想我只是不懂需要的数学:( 不管怎样,代码如下: static public void UpdateCharacterPositionAndCamera(float time) { //mouse look update float rotationSpeed = 3f; i

你好。我正在做一个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;
    }

你能告诉我如何更改移动向量,使其考虑摄像机方向吗?

将移动向量乘以摄像机旋转矩阵,或其逆矩阵(我认为是逆矩阵)。它与视图矩阵相同,但没有平移。如果要将摄影机固定到平面上,则需要在之后将各个分量归零,并可能对新向量进行规格化。
我不熟悉XNA API,因此我无法确切地告诉您使用哪种方法。您可能能够从视图矩阵中提取旋转矩阵,或者您可能需要查看与原点的差异(lookAt positios)。

将移动向量乘以摄影机旋转矩阵,或者其逆矩阵(我认为是逆矩阵)。它与视图矩阵相同,但没有平移。如果要将摄影机固定到平面上,则需要在之后将各个分量归零,并可能对新向量进行规格化。
我不熟悉XNA API,因此无法确切告诉您使用哪种方法。您可能可以从视图矩阵中提取旋转矩阵,或者您可能需要查看与原点的差异(注视位置)。

我通常是这样做的:

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

我通常是这样做的:

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

是的,它是有效的!但有一个问题:(当我旋转时,它反转X轴…所以向上变为向下,反之亦然。或者更确切地说,不是当我旋转时,而是当我在X或Z方向穿过0,0,0边界变成负数(“Y”向上只是为了提供信息).或者不是…我想出来了。当变换同时发生在不同的轴上时,它会使变换变得不正确…是的,它是有效的!但有一个问题:(当我旋转时,它反转X轴…所以向上变为向下,反之亦然。或者更确切地说,不是当我旋转时,而是当我在X或Z(“Y”)中将0,0,0边界变为负值时或者不…我想出来了。当变换同时发生在不同的轴上时,它会使变换变得不正确。。。