这可能更像是一个数学学科领域,但我希望它很简单,其他一些开发者可能知道。
情况:我有一架飞机游戏。我需要相对于平面方向的平面,偏航和滚动(围绕x,y,z旋转)。
问题:我可以使平面模型旋转,但旋转对于模型是全局的。例如,当飞机朝前时,应用CreateRotationZ()
工作正常,但如果模型指向上方(90度俯仰),则应用CreateRotationZ()
不会导致飞机滚动(带尊重飞机方向,它会使它偏航。
答案 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(),更适合您的需求, 参数是位置,前向矢量和向上矢量。