2013-05-07 2 views
1

Я пытаюсь получить эффект проекции вне оси, где содержимое экрана изменяется в соответствии с положением пользователя. Это похоже на то, что здесь делается в этом видео:
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 центра. Но я не получил необходимого эффекта от этого и хотел знать, почему это происходит.

enter image description here

В чем разница между выше двух?

Проекция внеосевое достигается за счет следующих в 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 в качестве центра экрана?

+0

С вашим подходом 'glFrustum' вы получаете перекошенную усечку. С вашим подходом 'gluLookAt' вы этого не делаете. –

+0

@sftrabbit: Не могли бы вы объяснить это чуть подробнее. Я действительно пытался это понять, но я мало что могу понять с моими небольшими знаниями. Почему перекошенная матрица дает больше иллюзии 3D-перспективы, чем изменение lookAt? – user1240679

+0

Посмотрите на диаграмму справа. У вас есть плоскость просмотра (маленький серый квадрат), выровненный перпендикулярно «экрану». Однако это неверно для этого случая. Если вы используете стандартную перспективную проекцию, а затем используете 'gluLookAt', плоскость просмотра будет ориентирована так, чтобы ее нормаль указывала на центр« экрана ». Подход 'glFrustum' поддерживает плоскость просмотра перпендикулярно. –

ответ

3

Я не уверен, почему проекция вне оси является подходящим методом для достижения вышеуказанного эффекта.

Поскольку экран дисплея соответствует ближней плоскости усеченного конуса. Когда вы двигаете головой, вы будете смотреть на экран вне оси. Таким образом, вы должны воспроизвести это, сделав то же самое с уклоном проекции.

Использование lookAt, однако, приведет к повороту сцены, при которой теряется соответствие между плоскостью плоскости и плоскостью экрана.

+0

+1 Хороший способ объяснить это. –

Смежные вопросы