OpenGL — камера, вращающаяся вокруг точки с кватернионами

Поэтому в настоящее время я использую кватернионы для хранения и изменения ориентации объектов в моей сцене 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();

В конечном итоге происходит то, что камера вращается вокруг какой-то другой точки — конечно, не объекта, но, по-видимому, и не самого себя, как если бы она вращалась в пространстве по спиральной траектории.

Так что это явно не способ обойти камеру вокруг точки, но что это?

4

Решение

Сначала я должен был работать с камерой в сферических координатах и ​​при необходимости конвертировать в кватернионы.

Учитывая следующие предположения:

  • У камеры нет рулона
  • Точка, на которую вы смотрите, это [x, y, z]
  • У вас есть рыскание, углы тангажа
  • [0, 1, 0] «вверх»

Вот как рассчитать некоторые важные значения:

  • Вектор представления: v = [vx, vy, vz] = [cos (yaw) * cos (шаг), sin (шаг), -in (yaw) * cos (шаг)]
  • Местоположение камеры: p = [x, y, z] — r * v
  • Правильный вектор: перекрестное произведение v с [0, 1, 0]
  • Вектор вверх: перекрестное произведение v с правым вектором
  • Ваш кватернион вида [0, vx, vy, vz] (это вектор вида с 0 w-компонентой)

Теперь в вашей симуляции вы можете работать на шаг / рыскание, которые довольно интуитивно понятны. Если вы хотите выполнить интерполяцию, преобразуйте до и после тангажа + рыскания в кватернионы и выполните кватернионную сферическую линейную интерполяцию.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]