Как переместить 3D-объект в XNA? - PullRequest
1 голос
/ 11 февраля 2012

Я хочу переместить 3D-модель автомобиля, когда я нажимаю клавишу со стрелкой влево или вправо, я меняю угол, когда я нажимаю стрелку вверх, когда машина едет.

Это код в методе обновления:

float dirX = (float)Math.Sin(angle);
float dirY = (float)Math.Cos(angle);

if (Keyboard.GetState().IsKeyDown(Keys.Up))
        {
            position += new Vector3(-dirX, dirY, 0);

            if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                angle += 0.015f;
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                angle -= 0.015f;
            }
        }

Это расчетная часть, но, очевидно, мне также нужно двигать машину по экрану. Я хочу, чтобы автомобиль двигался вперед, а не вверх, поэтому я решил повернуть его на 90 градусов по оси X, а также хочу повернуть автомобиль, когда нажимаю левую или правую клавиши.

Я написал этот код:

world = Matrix.CreateTranslation(position) * Matrix.CreateRotationY(angle) * Matrix.CreateFromAxisAngle(Vector3.UnitX, MathHelper.ToRadians(-90));

Этот код не работает, кто-нибудь может сказать мне, как я могу его переместить?

1 Ответ

3 голосов
/ 14 февраля 2012

Вы должны знать, что ваша ось Y на самом деле "вверх", а не "вперед" (согласно соглашениям).Хотя у этой проблемы есть много решений, самый быстрый способ исправить это:

float dirX = (float)Math.Sin(angle);
float dirZ = (float)Math.Cos(angle);

position += new Vector3(dirX, 0, dirZ); 

Затем вы должны умножить свои матрицы преобразования в правильном порядке:

Scale * Rotation * Translation

Что в вашем случаепереводится как:

// this will rotate car around the Y axis, and then translate it to correct location
world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);

Одно предложение, сделайте так, как предложено A-Type, и используйте направление * speed.

...