Я пытаюсь создать класс для управления камерой в OpenGL.
У меня есть три способа изменить угол наклона камеры.
Методы принимают параметр с плавающей точкой для использования в качестве количества вращения, которое нужно добавить.
Код в этих методах, где мне нужна помощь. Вращения хранятся в Vector3.
Пока для метода изменения высоты тона у меня есть:
void changePitch(float degrees)
{
float rads = MathHelp::degreesToRadians(degrees);
m_rotation.x += cos(m_rotation.y) * rads;
}
Это насколько я мог получить сам. Это вроде работает, камера смотрит вверх и вниз, смотря вверх или вниз по оси z, а не смотря вниз по оси x. Я попытался добавить вращение z:
m_rotation.z += sin(m_rotation.y) * rads;
Но это не очень хорошо.
Предположим, у вас есть upVector
, lookAtVector
а также rightVector
Трехмерные векторы, направленные вверх, смотря в направлении и вправо от вашей камеры. Затем, чтобы правильно увеличить шаг, вы должны сделать следующие вычисления:
void changePitch(angle) {
angle = DegreeToRadian(angle);
// Rotate lookAtVector around the right vector
// This is where we actually change pitch
lookAtVector = Normalize3dVector(viewDir * cos(angle) + UpVector * sin(angle));
// Now update the upVector
upVector = CrossProduct(rightVector, lookAtVector);
}
В вышеприведенном фрагменте названия произвольно используемых функций не требуют пояснений.
Других решений пока нет …