创建关于前向矢量的旋转

时间:2012-01-18 15:40:21

标签: vector matrix xna rotation xna-4.0

这可能更像是一个数学学科领域,但我希望它很简单,其他一些开发者可能知道。

情况:我有一架飞机游戏。我需要相对于平面方向的平面,偏航和滚动(围绕x,y,z旋转)。

问题:我可以使平面模型旋转,但旋转对于模型是全局的。例如,当飞机朝前时,应用CreateRotationZ()工作正常,但如果模型指向上方(90度俯仰),则应用CreateRotationZ()不会导致飞机滚动(带尊重飞机方向,它会使它偏航。

2 个答案:

答案 0 :(得分:1)

在对象/实体/船上有一个位置(Vector3)和旋转(矩阵),然后您可以使用以下代码示例在其任何一个本地轴上移动或旋转它。

例如,您想要将飞机滚动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的经过时间。

答案 1 :(得分:0)

使用Matrix.CreateWorld(),更适合您的需求, 参数是位置,前向矢量和向上矢量。

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