Они достигаются путем применения ряда команд glTranslate, glRotate (которые представляют положение и ориентацию камеры) перед рисованием сцены. (технически вы вращаете всю сцену!)
Существуют служебные функции, такие как gluLookAt, которые как-то абстрагируют некоторые подробности об этом.
Для простоты предположим, что у вас есть два вектора, представляющих вашу камеру: положение и направление.
gluLookAt принимает позицию, пункт назначения и вектор вверх.
Если вы реализуете векторный класс, destinaion = position + direction
должен дать вам точку назначения.
Опять же, чтобы упростить задачу, можно предположить, что вектор повышения всегда равен (0,1,0)
Затем, перед рендерингом чего-либо в вашей сцене, загрузите матрицу идентификации и вызовите gluLookAt
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );
Тогда начните рисовать ваши объекты
Вы можете позволить пользователю простираться, слегка изменив положение вправо или влево. Поворот немного сложнее, так как вы должны повернуть вектор направления. Предполагая, что вращается камера, а не какой-то объект на сцене.
Одна проблема, если у вас есть только вектор направления «вперед», как вы его перемещаете? где справа и слева?
Мой подход в этом случае состоит в том, чтобы просто взять перекрестное произведение «направления» и (0,1,0).
Теперь вы можете перемещать камеру влево и вправо, используя что-то вроде:
position = position + right * amount; //amount < 0 moves to the left
Вы можете двигаться вперед, используя «вектор направления», но IMO лучше ограничить движение горизонтальной плоскостью, поэтому получайте вектор вперед так же, как мы получили правильный вектор:
forward = cross( up, right )
Если честно, это отчасти хакерский подход.
Надлежащий подход заключается в использовании более «сложной» структуры данных для представления «ориентации» камеры, а не только прямого направления. Тем не менее, поскольку вы только начинаете, хорошо делать все по одному.