Как я могу предотвратить деформацию при вращении вокруг прямой видимости в OpenGL? - PullRequest
4 голосов
/ 17 сентября 2008

Я нарисовал эллипс в плоскости XZ и немного установил мою перспективу по оси Y и обратно по Z, глядя на центр эллипса под углом 45 градусов, используя gluPerspective (), чтобы установить мой просмотр фруструм.

ellipse

Unrotated, the major axis of the ellipse spans the width of my viewport. When I rotate 90-degrees about my line-of-sight, the major axis of the ellipse now spans the height of my viewport, thus deforming the ellipse (in this case, making it appear less eccentric).

image

Что мне нужно сделать, чтобы предотвратить эту деформацию (или, по крайней мере, учесть ее), поэтому вращение вокруг линии обзора сохраняет воспринимаемую большую ось эллипса (в этом случае, заставляя его выходить за пределы окна просмотра)

Ответы [ 3 ]

5 голосов
/ 17 сентября 2008

Похоже, вы используете 1.0 в качестве аспекта, когда вызываете gluPerspective (). Вы должны использовать ширину / высоту. Например, если ваш видовой экран имеет размер 640x480, вы должны использовать 1,33333 в качестве аргумента аспекта.

3 голосов
/ 17 сентября 2008

Согласно спецификации OpenGL:

void gluPerspective( GLdouble fovy,
                     GLdouble aspect,
                     GLdouble zNear,
                   GLdouble zFar )

Формат должен зависеть от ширины и высоты вашего окна. Конкретно ширина делится на высоту (но не делите на ноль).

Возможно, вы используете 1 в качестве аспекта, который не является точным, если ваше окно не является квадратом.

1 голос
/ 17 сентября 2008

Похоже, параметр аспекта в вашем вызове gluPerspective нуждается в настройке. См. Страница человека . Если бы ваше окно было физически квадратным, соотношение сторон было бы равно 1, и ваша проблема исчезла бы. Однако ваше окно имеет прямоугольную форму, поэтому область просмотра должна быть не квадратной.

Установите соотношение сторон для window_width / window_height, и ваш эллипс должен выглядеть правильно. Обратите внимание, что вам нужно будет обновлять это всякий раз, когда размер окна изменяется; если вы используете GLUT, установите glutReshapeFunc и пересчитайте там матрицу проекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...