1

MicrosoftのWebサイトで、XNAの3Dワールドで一人称カメラを回転および移動させる方法に関するチュートリアルに従いました。しかし、カメラをY軸に沿って回転させると、カメラが回転/向いている方向には移動せず、代わりに、元の方向を向いているかのように移動します。

これが私のコードです:

static Vector3 avatarPosition = new Vector3(0, 0, 0);
static Vector3 cameraPosition = avatarPosition;
Vector3 cameraReference = new Vector3(10, 0, 0);
// Create a vector pointing the direction the camera is facing.
Matrix world = Matrix.CreateWorld(new Vector3(0, -1, 0), Vector3.Forward, Vector3.Up);
Matrix rotationMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(0));
int Rot = 0;
Vector3 worldVector = new Vector3(5,-2, 0);
Matrix view, proj;
Vector3 cameraLookat;
Update()
{
    world = Matrix.CreateWorld(worldVector, Vector3.Forward, Vector3.Up);
    if (IsKeyDown(Keys.W))
        avatarPosition += new Vector3(0.2f, 0f, 0);
    if (IsKeyDown(Keys.S))
        avatarPosition += new Vector3(-0.2f, 0f, 0);
    if (IsKeyDown(Keys.A))
        avatarPosition += new Vector3(0f, 0f, -0.2f);
    if (IsKeyDown(Keys.D))
        avatarPosition += new Vector3(0f, 0f, 0.2f);

    if (IsKeyDown(Keys.Left))
        Rot += 1;
    if (IsKeyDown(Keys.Right))
        Rot += -1;

    rotationMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(Rot));
    // Create a vector pointing the direction the camera is facing.
    Vector3 transformedReference = Vector3.Transform(cameraReference, rotationMatrix);
    // Calculate the position the camera is looking at.
    cameraLookat = transformedReference + cameraPosition;
    // Set up the view matrix and projection matrix.
    view = Matrix.CreateLookAt(cameraPosition, cameraLookat, new Vector3(0.0f, 1.0f, 0.0f));

    proj = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), graphics.GraphicsDevice.Viewport.AspectRatio,
                                          0.1f, 1000);
    cameraPosition = avatarPosition;
 }

誰かがカメラが回転したように動かない理由を教えてもらえますか?それとも誰かが私にそれを作るためのいまいましいコードを教えてくれませんか?

4

1 に答える 1

2

私はあなたが経験している問題がコードのこの領域から来ているようです:

if (IsKeyDown(Keys.W))
    avatarPosition += new Vector3(0.2f, 0f, 0);
if (IsKeyDown(Keys.S))
    avatarPosition += new Vector3(-0.2f, 0f, 0);
if (IsKeyDown(Keys.A))
    avatarPosition += new Vector3(0f, 0f, -0.2f);
if (IsKeyDown(Keys.D))
    avatarPosition += new Vector3(0f, 0f, 0.2f);

avatarPositionをx軸またはz軸に沿って直接変換するのではなく、transformedReference変数のように見える方向を使用する必要があります。

たとえば、カメラが向いている方向に進むには、次のようにします。

if (IsKeyDown(Keys.W))
    avatarPosition += transformedReference;

ただし、transformedReference変数は正規化されているように見えるため、アバターを希望の距離だけ移動できない場合があります。その場合は、次のような定数MOVEMENT_SPEEDを掛けるだけです。

if (IsKeyDown(Keys.W))
    avatarPosition += transformedReference * MOVEMENT_SPEED;
于 2013-02-03T07:23:22.213 に答える