Я пишу программу симулятора полета (похожую на 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;
}