Я пытаюсь получить эффект проекции вне оси, где содержимое экрана изменяется в соответствии с положением пользователя. Это похоже на то, что здесь делается в этом видео:
http://www.youtube.com/watch?feature=player_embedded&v=Jd3-eiid-UwДостижение проекции вне оси
Я не уверен, почему проекция вне оси является подходящим методом для достижения вышеупомянутого эффекта. Есть два метода, которые, как мне кажется, здесь: 1) Использование glFrustum, 2) Использование lookAt()
В приложении выше «камера» в основном перемещается в соответствии с положением пользователя. В glFrustum
координаты (left
, right
, bottom
, top
, near
, far
) для перспективной проекции даются, чтобы изменить объекты на экране, как они будут появляться в другом положении, когда пользователь перемещается.
В то же время, я считаю, что это очень похоже на перевод камеры с положением пользователя, а затем дает gluLookAt(centerPosition)
для камеры до lookAt
центра. Но я не получил необходимого эффекта от этого и хотел знать, почему это происходит.
В чем разница между выше двух?
Проекция внеосевое достигается за счет следующих в OpenGL:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(fNear*(-fFov * ratio + headX),
fNear*(fFov * ratio + headX),
fNear*(-fFov + headY),
fNear*(fFov + headY),
fNear, fFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(headX*headZ, headY*headZ, 0, headX*headZ, headY*headZ, -1, 0, 1, 0);
glTranslatef(0.0,0.0,headZ);
Какова точка gluLookAt (...) выше, а не когда я пытаюсь использовать камеру и был просто давая ему lookAt point
в качестве центра экрана?
С вашим подходом 'glFrustum' вы получаете перекошенную усечку. С вашим подходом 'gluLookAt' вы этого не делаете. –
@sftrabbit: Не могли бы вы объяснить это чуть подробнее. Я действительно пытался это понять, но я мало что могу понять с моими небольшими знаниями. Почему перекошенная матрица дает больше иллюзии 3D-перспективы, чем изменение lookAt? – user1240679
Посмотрите на диаграмму справа. У вас есть плоскость просмотра (маленький серый квадрат), выровненный перпендикулярно «экрану». Однако это неверно для этого случая. Если вы используете стандартную перспективную проекцию, а затем используете 'gluLookAt', плоскость просмотра будет ориентирована так, чтобы ее нормаль указывала на центр« экрана ». Подход 'glFrustum' поддерживает плоскость просмотра перпендикулярно. –