О функции LookAt()
Мне нужно реализовать кватернион для вращения камеры. Перед реализацией кватерниона я использую LookAt(&eye, &at, &up) для выражения координат камеры (vpn, vup, ...).
vec3 eye = vec3(0.0,0.0,-10.0);
vec3 to = vec3(0.0,0.0,0.0); // initial
vec3 up = vec3(0.0,1.0,0.0);
vec3 d = to - eye;
и при отображении обратного вызова.
m = LookAt(eye,to,up);
glUniformMatrix4fv(ModelView,1,GL_TRUE,m);
и добавить вращение (это все еще евклидово вращение и клавиатура)
case 'a':
temp = RotateX(1.0) * vec4(d,0);
temp1 = RotateX(1.0) * vec4(up,0);
d = vec3(temp.x, temp.y, temp.z);
up = vec3(temp1.x, temp1.y, temp1.z);
eye = to - d;
break;
case 'd':
temp = RotateY(1.0) * vec4(d,0);
temp1 = RotateY(1.0) * vec4(up,0);
d = vec3(temp.x, temp.y, temp.z);
up = vec3(temp1.x, temp1.y, temp1.z);
eye = to - d;
break;
Итак, мой вопрос, функция LookAt только делает координаты камеры? Есть ли матрица вращения, чтобы сделать координаты камеры? Как вы видите, я поворачиваю камеру с помощью некоторого вращения, которого нет в LookAt, я сделаю это вращение с помощью кватерниона. Однако LookAt() использует некоторую ротацию, я буду реализовывать кватернионную версию LookAt, чтобы избежать блокировки карданного подвеса.
1 ответ
Все, что делает LookAt, это перевод T (так, чтобы новый источник находился в точке глаза), за которым следует вращение R. Вращение определяется путем построения ортонормированного базиса из 3 векторов (направление, определяемое вектором от глаза к центру, непосредственно указан верхний вектор и правый вектор, который определен перпендикулярно обоим). Окончательная трансформация, произведенная LookAt, будет R*T.
Вы можете использовать LookAt без каких-либо проблем с блокировкой карданного подвеса, если вы правильно указали свои входные векторы, но вы также можете описать вашу камеру с помощью вектора положения (определяющего T) и кватерниона ориентации (определяющего R), и вам вообще не придется использовать LookAt,