Создать вращение вокруг вектора вперед - PullRequest
0 голосов
/ 18 января 2012

Это, вероятно, больше предметная область по математике, но я надеюсь, что она достаточно проста, чтобы кто-нибудь другой разработчик мог знать.

Ситуация: у меня игра в самолет. Мне нужно наклонить, сдвинуть и повернуть (повернуть вокруг x, y, z) плоскость относительно ориентации плоскости.

Проблема: я могу заставить модель самолета вращаться, однако повороты являются глобальными для модели. Например, когда плоскость направлена ​​вперед, применение CreateRotationZ() работает нормально, но если модель направлена ​​вверх (шаг 90 градусов), применение CreateRotationZ() не приводит к повороту плоскости (относительно плоскостей). ориентация), это вызывает его рыскание.

Ответы [ 2 ]

1 голос
/ 19 января 2012

У вас есть позиция (Vector3) и вращение (Matrix) на вашем объекте / объекте / корабле, и затем вы можете использовать следующий пример кода для перемещения или поворота его по любой из его локальных осей.

Например, вы хотите повернуть самолет на 45 градусов (это вращение вокруг вектора прямой, о котором вы спрашивали):

Entity plane = new Entity();
plane.Roll(MathHelper.PiOver4);

Или наклонить самолет на 90 градусов:

plane.Pitch(MathHelper.PiOver2);    

А вот пример кода

public class Entity
{
    Vector3 position = Vector3.Zero;
    Matrix rotation = Matrix.Identity;

    public void Yaw(float amount)
    {
        this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Up, amount);
    }

    public void YawAroundWorldUp(float amount)
    {
        this.rotation *= Matrix.CreateRotationY(amount);
    }

    public void Pitch(float amount)
    {
        this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Right, amount);
    }

    // This is the specific method you were asking for in the question title
    public void Roll(float amount)
    {
        this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Forward, amount);
    }

    public void Strafe(float amount)
    {
        this.position += this.rotation.Right * amount;
    }

    public void GoForward(float amount)
    {
        this.position += this.rotation.Forward * amount;
    }

    public void Jump(float amount)
    {
        this.position += this.rotation.Up * amount;
    }

    public void Rise(float amount)
    {
        this.position += Vector3.Up * amount;
    }
}

Если вам нужно плавное движение, вы должны использовать его с очень небольшими приращениями и использовать затраченное время в своих вычислениях для amount, который вы используете.

0 голосов
/ 19 января 2012

Используйте Matrix.CreateWorld (), лучше для того, что вы хотите, параметры - это положение, вектор вперед и вектор вверх.

http://msdn.microsoft.com/en-us/library/bb975261.aspx

...