Я пытался достичь 3D-перспективы сцены в соответствии с положением пользователя. Я читал об асимметричном усечении, чтобы достичь искажения, когда пользователь не смотрит с оси.Скошенная усечка не искажающая сцена
Код я использовал, чтобы сделать проекцию вне оси является:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(frustumLeft, frustumRight, frustumBottom, frustumTop, frustumNear, frustumFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, headZ);
drawWalls();
Когда пользователь смотрит на оси, сцена выходит, который можно сделать, как:
Когда усеченный был сдвинут вне оси, сцена появляется, как рисунок:
Однако, как я ожидал, что несколько пришло по линии следующего изображения (achi используя gluLookAt и асимметричную усечку). http://i40.tinypic.com/9uteh3.png
Для вышеуказанной программы я использовал асимметричную усечку только для указания объема просмотра и изменения параметров (2-е изображение) только для того, чтобы сцена выглядела как немного переведенная (без искажений). Мне интересно, правильно ли это поведение или если я что-то пропустил и не получил искажения (например, 3-го изображения) в сцене, которые должны были быть там. Не следует ли перекосить усеченный кость, чтобы дать мне искаженную сцену?
Проблема во втором изображении заключается в том, что вы не изменили положение глаз. Когда я опубликовал [ваш другой вопрос] (http://stackoverflow.com/questions/16723674/skewed-frustum-off-axis-projection-for-head-tracking-in-opengl), граница экрана должна остаются в одинаковых трехмерных положениях внутри усеченного конуса. Поэтому, если вы перемещаете голову влево, вам нужно сдвинуть уклон вправо и наоборот. –
@AndreasHaferburg: перемещение глаз на ту же величину, с которой сдвиг усеченного костяка от центра дает мне необходимый эффект (т. Е. Соответствие между плоскостью плоскости и плоскостью экрана не теряется). И перемещение «глаз» произойдет с «gluLookAt», который не будет вращать всю сцену и дает эффект правильной внеосевой проекции (изменение перспективы по позиции пользователя). – user1240679
'gluLookAt' поворачивает сцену , матрица M [в документации] (http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml) состоит из единичных векторов f, s и u, которые являются осями вращающаяся система координат. Вам нужно только переместить камеру, что эквивалентно переводу остальной части сцены, только в другом направлении. Я поставил несколько скриншотов в другом вопросе. –