Уточните glFrustum и почему я не вижу изображение

в настоящее время мой glFrustum установлен как

glFrustum(0, 100.0, 0, 100.0, -50, 50);

И мое изображение представляет собой прямоугольный куб с размерами:
Почему я не вижу изображение, когда размер формы меньше, чем окно просмотра?

//top
glBegin(GL_POLYGON);
glVertex3f(25, 60, 25);
glVertex3f(75, 60, 25);
glVertex3f(75, 60, -25);
glVertex3f(25, 60, -25);
glEnd();

//bottom
glBegin(GL_POLYGON);
glVertex3f(25, 55, 25);
glVertex3f(75, 55, 25);
glVertex3f(75, 55, -25);
glVertex3f(25, 55, -25);
glEnd();

//front
glBegin(GL_POLYGON);
glVertex3f(25, 55, 25);
glVertex3f(75, 55, 25);
glVertex3f(75, 60, 25);
glVertex3f(25, 60, 25);
glEnd();

//back
glBegin(GL_POLYGON);
glVertex3f(25, 60, -25);
glVertex3f(75, 60, -25);
glVertex3f(75, 55, -25);
glVertex3f(25, 55, -25);
glEnd();

0

Решение

Аргументы этого glFrustum() звонок недействителен:

glFrustum(0, 100.0, 0, 100.0, -50, 50);

nearVal, который является 5-м параметром, должен быть положительным. От справочная страница:

nearVal, farVal: укажите расстояния до плоскостей отсечения ближней и дальней глубины. Оба расстояния должны быть положительными.

Представьте их как расстояния от камеры в направлении, куда она указывает. Значение -50.0 поместит ближнюю плоскость отсечения позади камеры, что недопустимо.

Чтобы заставить это работать, сохраняя тот же диапазон, вы можете изменить это, например:

glFrustum(0.0, 100.0, 0.0, 100.0, 50.0, 150.0);

Без каких-либо дополнительных преобразований камера указывает от начала координат на отрицательную ось Z. Поскольку мы сместили ближнее и дальнее расстояние на 100,0 по сравнению с исходным кодом, вам необходимо соответствующим образом сместить объект, что соответствует переводу -100,0 в направлении z. Для этого вы можете либо изменить координаты своих вершин, либо применить преобразование как часть преобразования вида модели:

glPushMatrix();
glTranslatef(0.0f, 0.0f, -100.0f);
// draw calls
glPopMatrix();

Также обратите внимание, что первые 4 параметра вашего glFrustum() звонок несколько нетрадиционный. Они определяют несимметричный усеченный конус. Результат будет выглядеть так, как будто камера находится над углом вашего окна. Хотя это совершенно законно, вероятно, это будет выглядеть странно. Гораздо чаще встречается симметричный усеченный контур, что означает, что левый / правый и верхний / нижний имеют одинаковое абсолютное значение каждый с противоположными знаками. Например:

glFrustum(-50.0, 50.0, -50.0, 50.0, 50.0, 150.0);

Чтобы соответствовать этому, вам нужно разместить координаты x / y вашей геометрии вокруг начала координат.

5

Другие решения


По вопросам рекламы [email protected]