Я пишу программу симулятора полета (похожую на Star fox 64) в XNA, и у меня возникла проблема с вращением. Моя идея состоит в том, чтобы иметь вектор для скорости и вектор для положения. Элементы управления, которые я позволяю, делают так, чтобы углы Эйлера вызывали проблемы, поэтому я хочу использовать кватернионы.
Я пока не очень знаком с графическим рендерингом, но я подумал, что мог бы использовать Quaternion.createFromAxisAngle (vector, roll) (roll - это вращение вокруг моего вектора скорости), но он работает неправильно. В основном, когда я пытаюсь повернуть тангаж или рыскание, ничего не происходит. Когда я катаюсь, это работает, но не так, как я ожидал. Это правильное использование метода createFromAxisAngle? Благодарю.
Вот код обновления позиции для моего корабля:
public override void UpdatePositions()
{
float sinRoll = (float)Math.Sin(roll);
float cosRoll = (float)Math.Cos(roll);
float sinPitch = (float)Math.Sin(pitch);
float cosPitch = (float)Math.Cos(pitch);
float sinYaw = (float)Math.Sin(yaw);
float cosYaw = (float)Math.Cos(yaw);
m_Velocity.X = (sinRoll * sinPitch - sinRoll * sinYaw * cosPitch - sinYaw * cosPitch);
m_Velocity.Y = sinPitch * cosRoll;
m_Velocity.Z = (sinRoll * sinPitch + sinRoll * cosYaw * cosPitch + cosYaw * cosPitch);
if (m_Velocity.X == 0 && m_Velocity.Y == 0 && m_Velocity.Z == 0)
m_Velocity = new Vector3(0f,0f,1f);
m_Rotation = new Vector3((float)pitch, (float)yaw, (float)roll);
m_Velocity.Normalize();
//m_QRotation = Quaternion.CreateFromYawPitchRoll((float)yaw,(float)pitch,(float)roll); This line works for the most part but doesn't allow you to pitch up correctly while banking.
m_QRotation = Quaternion.CreateFromAxisAngle(m_Velocity,(float)roll);
m_Velocity = Vector3.Multiply(m_Velocity, shipSpeed);
m_Position += m_Velocity;
}