Как я могу предотвратить деформацию при вращении вокруг линии прямой видимости в OpenGL?

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

ellipse

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

повернутый эллипс

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


person rampion    schedule 17.09.2008    source источник


Ответы (3)


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

person shea241    schedule 17.09.2008
comment
Ах, я делил ширину окна на высоту в обратном вызове glutReshapeFunc(), чтобы получить соотношение сторон, но я забыл сначала преобразовать ширину в число с плавающей запятой. Бада-бинг, бада-бум, ошибка округления. Спасибо. - person rampion; 17.09.2008

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

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

Аспект должен быть функцией ширины и высоты вашего окна. В частности, ширина делится на высоту (но следите за делением на ноль).

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

person Martin    schedule 17.09.2008

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

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

person Jeff Hill    schedule 17.09.2008