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

カメラの方向を考慮して移動ベクトルを変更する方法を教えてください...?

4

2 に答える 2

1

移動ベクトルにカメラの回転行列、またはその逆数を掛けます (逆数だと思います)。これはビュー マトリックスと同じですが、翻訳はありません。カメラを平面に固定したい場合は、後でそれぞれのコンポーネントをゼロにして、おそらく新しいベクトルを正規化する必要があります。私は XNA API に詳しくないので、どのメソッドを使用すればよいか正確にはわかりません。ビュー マトリックスから回転マトリックスを抽出できる場合もあれば、原点との違い (lookAt-positions) を確認する必要がある場合もあります。

于 2012-09-15T15:40:58.453 に答える
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;
于 2012-09-15T16:11:30.787 に答える