Я хочу уточнить вещи с помощью параметров gluPerspective
, я знаю , что они определяют диапазон по оси z для всех объектов - поэтому объекты ближе или ближе, чем ближний/дальний, будут обрезаны алгоритмы отсечения. И когда давайте скажем near = 0,1 и far = 100 * winWid, мы ничего не видим, потому что объекты находятся за кулером (а камера по умолчанию равна (0.0, 0.0, 0.0)
, а система координат пользователя OpenGL правая), поэтому мы вызываем (см. код ниже) translate(0.0, 0.0, -winWid)
для перемещения назад объектами оси z, чтобы разместить их перед камерой. Но если мы установим far = -100 * winWid; все работает так же, как с положительным большим значением.Перспективная проекция (неправильно понимаемая gluPerspective)
Так что меняется, когда это отрицательно?
Почему в этом случае ничего не подрезано?
#include <gl/glut.h>
#include <math.h>
const float winWid = 1000.0f;
const float winHei = 800.0f;
GLfloat cube_side = 200.0f;
GLfloat ALPHA = 0.7f;
void render();
void updateDisplay()
{
render(cubeAngle, rotx, roty, rotz);
}
void drawCube(const GLfloat& a)
{
glBegin(GL_QUADS);
// back face
glColor4f(0.0f, 1.0f, 0.0f, ALPHA);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, a, 0.0f);
glVertex3f(a, a, 0.0f);
glVertex3f(a, 0.0f, 0.0f);
// and other cube faces here ...
glEnd();
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
drawCube(cube_side);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_ALPHA);
glutInitWindowSize(winWid, winHei);
glutInitWindowPosition(100, 100);
glutCreateWindow("window");
glutDisplayFunc(updateDisplay);
glEnable(GL_DEPTH_TEST); // depth buffer setup
glEnable(GL_BLEND); // transparency setup
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(55.0f, winWid/winHei, 0.1f, 100*winWid);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0f, 0.0f, -winWid); // move back to see drawing objects
glRotatef(75.0f, -1.0f, 0.0f, 0.0f); // make z+ axis point up to emphasize 3D (wihout this rotate z+ points towards the viewer)
glutMainLoop();
return 0;
}
Почему 'gluPerspective (55.0, winWid/winHei, 0.1, -1.0);' делает объекты видимыми в поле зрения и 'gluPerspective (55.0, winWid/winHei, 0.1, 1.0);' не делает этого ?? – ampawd
Потому что это не работает. gluPerspective возвращает действительную и рабочую матрицу проекции при вводе положительных значений ближнего и дальнего значения. (Или оба отрицательных, которые теоретически также должны быть разработаны). Подумайте об этом как о лучевой проекции. Все лучи проходят через источник. Теперь, как будет выглядеть усечка, если происхождение находится между ближней и дальней плоскостью? Многие предположения работают только в том случае, если это не так (например, fov было бы трудно определить). – BDL
Хмм хорошо, кажется, я сейчас понимаю это лучше – ampawd