Это простая задача.Для работы с камерой вам нужно всего 3 вектора: положение, относительный LookAt и относительный вектор Up
После того, как вы настроите эти 3, вы можете задать их для gluLookAt следующим образом:
gluLookAt(camera.eye.x,camera.eye.y,camera.eye.z,
camera.lookAt.x,camera.lookAt.y,camera.lookAt.z,
camera.up.x,camera.up.y,camera.up.z);
don 'Не запутайтесь, camera.look - это реалистичный LookAt, добавленный с вектором глаза:
camera.lookAt = camera.eye + camera.rLookAt;
Так что это должно в основном охватывать настройку камеры.Следующее основное задание с камерой движется.Это благодаря относительной простой задаче LookAt, так как вы обновляете только глазной вектор.Возможно, вы захотите обновить также абсолютный LookAt, но это тот же фрагмент кода, который я показал выше.
Наконец, вы захотите повернуть представление.Хитрость в том, что вы можете использовать 3 интерпретации - матрицы, 3 угла или кватернины.Поскольку углы легко понять (с другой стороны, они имеют худшую производительность и страдают от блокировки карданного подвеса), я покажу вам, как это сделать.Я не буду описывать, что такое блокировка карданного подвеса, вы можете использовать Google, но чтобы избежать этого, нам нужно ограничить число поворотов.Мы будем использовать полные 360 ° для горизонтального, но только 180 ° для вертикального вращения.Если вы посмотрите на систему координации openGl, мы можем определить горизонтальные повороты вокруг оси Y и вертикальной оси X вокруг оси.Для вращения вектора в приложении мы используем следующие 2 кода:
vector3f vector3f::rotateX(const float &radians)
{
float t_y = y;
y = t_y*cos(radians) + z*sin(radians);
z = t_y*-sin(radians) + z*cos(radians);
return *this;
}
vector3f vector3f::rotateY(const float &radians)
{
float t_x = x;
x = t_x*cos(radians) + z*-sin(radians);
z = t_x*sin(radians) + z*cos(radians);
return *this;
}
Вы можете видеть, что я скопировал это из моего кода.vector3f - это просто класс, заключающий в себе все о трехмерных векторах.x, y и z являются открытыми членами, определяющими вектор.
Так что если вы хотите, чтобы высота тона была в основном rotateX и yaw rotateY.Для обновления вашей камеры вам нужно повернуть оба относительных вектора LookAt и Up, вычислить абсолютный LookAt и передать их в gluLookAt.Вот и все ..
PS: Не правда, что мало кто программирует opengl на OSX.Я никогда не запускал OSX, но openGl, как кроссплатформенный, определенно по-прежнему популярен.
PSS: я забыл упомянуть, никогда не добавляю ротации.Лучше добавлять углы, и каждый раз, когда вы поворачиваете установленные векторы в положение по умолчанию и вращаетесь с этим абсолютным углом:
rLookAt.set(0,0,-1);
rLookAt.rotateX(rotations.x);
rLookAt.rotateY(rotations.y);
lookAt = eye + rLookAt;
up.set(0,1,0);
up.rotateX(rotations.x);
up.rotateY(rotations.y);