О функции 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,

Другие вопросы по тегам