2013-05-27 2 views
1

Я пытался достичь 3D-перспективы сцены в соответствии с положением пользователя. Я читал об асимметричном усечении, чтобы достичь искажения, когда пользователь не смотрит с оси.Скошенная усечка не искажающая сцена

Код я использовал, чтобы сделать проекцию вне оси является:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
    glFrustum(frustumLeft, frustumRight, frustumBottom, frustumTop, frustumNear, frustumFar); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, headZ); 
drawWalls(); 

Когда пользователь смотрит на оси, сцена выходит, который можно сделать, как: enter image description here

Когда усеченный был сдвинут вне оси, сцена появляется, как рисунок: enter image description here

Однако, как я ожидал, что несколько пришло по линии следующего изображения (achi используя gluLookAt и асимметричную усечку). http://i40.tinypic.com/9uteh3.png

Для вышеуказанной программы я использовал асимметричную усечку только для указания объема просмотра и изменения параметров (2-е изображение) только для того, чтобы сцена выглядела как немного переведенная (без искажений). Мне интересно, правильно ли это поведение или если я что-то пропустил и не получил искажения (например, 3-го изображения) в сцене, которые должны были быть там. Не следует ли перекосить усеченный кость, чтобы дать мне искаженную сцену?

+0

Проблема во втором изображении заключается в том, что вы не изменили положение глаз. Когда я опубликовал [ваш другой вопрос] (http://stackoverflow.com/questions/16723674/skewed-frustum-off-axis-projection-for-head-tracking-in-opengl), граница экрана должна остаются в одинаковых трехмерных положениях внутри усеченного конуса. Поэтому, если вы перемещаете голову влево, вам нужно сдвинуть уклон вправо и наоборот. –

+0

@AndreasHaferburg: перемещение глаз на ту же величину, с которой сдвиг усеченного костяка от центра дает мне необходимый эффект (т. Е. Соответствие между плоскостью плоскости и плоскостью экрана не теряется). И перемещение «глаз» произойдет с «gluLookAt», который не будет вращать всю сцену и дает эффект правильной внеосевой проекции (изменение перспективы по позиции пользователя). – user1240679

+0

'gluLookAt' поворачивает сцену , матрица M [в документации] (http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml) состоит из единичных векторов f, s и u, которые являются осями вращающаяся система координат. Вам нужно только переместить камеру, что эквивалентно переводу остальной части сцены, только в другом направлении. Я поставил несколько скриншотов в другом вопросе. –

ответ

1

усеченные, как перспективный вид, за исключением того, что вид в перспективе всегда симметричен , если вы сделаете усеченный асимметричным он покажет вам то же эффект, как и в изображении 2. теперь, что случилось с 2-го образом является то, что он имеет больший объем просмотра с левой стороны по сравнению с правой стороной, поэтому, если изображение находится посередине, оно сдвинется вправо. пример, как показано здесь, image-frustum больше объема вправо по сравнению с левым, поэтому он будет выглядеть как объект, сдвинутый влево, потому что теперь правый объем занимает больше места.

Если мы изменим положение камеры или там, где она увидит, изменится симметрия нашего объекта. Как если бы вы двигали головой влево или вправо по оси x, симметрия экрана вашего компьютера изменилась бы.

+0

Означает ли это, что для достижения искажения (как на третьем изображении) мне придется использовать 'gluLookAt'? При использовании 'gluLookAt' вместе с glFrustum мне удалось получить требуемый аутплей с другого взгляда, поэтому я думаю, что это правильный путь? – user1240679

+0

[link] (http://www.songho.ca/opengl/files/gl_transform15.png) вот как асимметричная усечка выглядит как – MShoaib91

+0

Умм. Возможно, здесь я немного замешана. Я ссылаюсь на искажение как результат, полученный на третьем изображении, что фактически дает эффект изменения перспективы сцены при просмотре с другой точки. Однако, как вы указали в вышеприведенном комментарии, мне пришлось бы сделать асимметричную усечку, которая искажала бы 3D-мир. В вышеприведенном сообщении 2-е изображение, где я на самом деле сделал это, например, асимметричную усечку, почему она не выглядит искаженным 3D-миром? Или слово «искажение», которое я неправильно использую здесь? – user1240679

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