Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: rampionОтветов: 3

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

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

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

copengl

Ответы

Ответ 1 · рейтинг 5 · shea241

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

Ответ 2 · рейтинг 3 · Martin

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

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

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

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

Ответ 3 · рейтинг 1 · Jeff Hill

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы