У вас есть позиция (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
, который вы используете.