Полигоны отсекаются ближней или дальней плоскостью объема просмотра.
Если вы не зададите матрицу проекции, то пространство просмотра, пространство клипа и нормализованное пространство устройства будут одинаковыми. Нормализованное пространство устройств представляет собой уникальный куб, левый нижний край которого равен (-1, -1, -1), а правый верхний край далеко от (1, 1, 1). Вся геометрия, которая не находится внутри этого куба, обрезается.
а>
На самом деле вы рисуете четырехугольник со стороной 1. Одна вершина четырехугольника находится в начале координат (0, 0, 0). Четырехугольник вращается вокруг исходной точки с помощью glRotate
. Поскольку длина диагонали четырехугольника равна sqrt(2.0)
, одна вершина повернутого четырехугольника отсекается либо ближней, либо дальней плоскостью.
Если вы создадите и повернете четырехугольник с центром (0, 0, 0), он не будет обрезан, потому что длина от центра до каждой вершины равна sqrt(2.0)/2.0
. То есть меньше 1 (расстояние до ближней и дальней плоскости от центра объема просмотра)
glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(-0.5f, 0.0f, -0.5f);
glVertex3f( 0.5f, 0.0f, -0.5f);
glVertex3f( 0.5f, 0.0f, 0.5f);
glVertex3f(-0.5f, 0.0f, 0.5f);
glEnd();
соответственно
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(atan(0.5f) * 180.0f / PI, 1.0f, 0.0f, 0.0f);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);
glTranslate(-0.5f, 0.0f, -0.5f);
glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
В качестве альтернативы вы можете установить ортографическую проекцию, которая увеличивает объем просмотра на glOrtho
:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(atan(0.5f) * 180.0f / PI, 1.0f, 0.0f, 0.0f);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
person
Rabbid76
schedule
30.06.2020