Поэтому в настоящее время я использую кватернионы для хранения и изменения ориентации объектов в моей сцене OpenGL, а также ориентации камеры. При прямом вращении этих объектов (т.е. говоря, что я хочу повернуть величину Z камеры вокруг оси Z, или я хочу повернуть объект X вокруг оси X, а затем перевести его T вдоль его локальной оси Z), я имею никаких проблем, так что я могу только предположить, что мой основной код вращения правильный.
Тем не менее, сейчас я пытаюсь реализовать функцию, позволяющую сделать мою камеру на орбите произвольной точкой в пространстве, и у меня довольно трудные времена. Вот то, что я до сих пор придумал, но это не работает (это происходит в классе Camera).
//Get the inverse of the orientation, which should represent the orientation
//"from" the focal point to the camera
Quaternion InverseOrient = m_Orientation;
InverseOrient.Invert();
///Rotation
//Create change quaternions for each axis
Quaternion xOffset = Quaternion();
xOffset.FromAxisAngle(xChange * m_TurnSpeed, 1.0, 0.0, 0.0);
Quaternion yOffset = Quaternion();
yOffset.FromAxisAngle(yChange * m_TurnSpeed, 0.0, 1.0, 0.0);
Quaternion zOffset = Quaternion();
zOffset.FromAxisAngle(zChange * m_TurnSpeed, 0.0, 0.0, 1.0);
//Multiply the change quats into the inversed orientation quat
InverseOrient = yOffset * zOffset * xOffset * InverseOrient;
//Translate according to the focal distance
//Start with a vector relative to the position being looked at
sf::Vector3<float> RelativePos(0, 0, -m_FocalDistance);
//Rotate according to the quaternion
RelativePos = InverseOrient.MultVect(RelativePos);
//Add that relative position to the focal point
m_Position.x = m_FocalPoint->x + RelativePos.x;
m_Position.y = m_FocalPoint->y + RelativePos.y;
m_Position.z = m_FocalPoint->z + RelativePos.z;
//Now set the orientation to the inverse of the quaternion
//used to position the camera
m_Orientation = InverseOrient;
m_Orientation.Invert();
В конечном итоге происходит то, что камера вращается вокруг какой-то другой точки — конечно, не объекта, но, по-видимому, и не самого себя, как если бы она вращалась в пространстве по спиральной траектории.
Так что это явно не способ обойти камеру вокруг точки, но что это?
Сначала я должен был работать с камерой в сферических координатах и при необходимости конвертировать в кватернионы.
Учитывая следующие предположения:
Вот как рассчитать некоторые важные значения:
Теперь в вашей симуляции вы можете работать на шаг / рыскание, которые довольно интуитивно понятны. Если вы хотите выполнить интерполяцию, преобразуйте до и после тангажа + рыскания в кватернионы и выполните кватернионную сферическую линейную интерполяцию.
Других решений пока нет …