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

StackOverflow https://stackoverflow.com/questions/79360

  •  09-06-2019
  •  | 
  •  

Вопрос

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

ellipse

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

rotated ellipse

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top