2015-08-03 4 views
0

Я хочу уточнить вещи с помощью параметров 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; 
} 

ответ

1

Отрицательные значения далеко плоскости не поддерживаются gluPerspective. В документации говорится:

zFar: Определяет расстояние от зрителя до дальней плоскости отсечения (всегда положительное). (source)

По умолчанию камера в OpenGL смотрит вдоль отрицательной оси z. Таким образом, видимая область - [-near, -far] в мировых координатах. В вашем примере кода объект находится в z = -1000, а видимый диапазон - от [-0.01, -100 * 1000], что означает, что объект явно отображается.

Еще одна вещь, которую следует упомянуть, - это точность глубинного буфера: это в основном определяется диапазоном, заданным nearPlane и farPlane. Предполагая, что у вас есть точность 16 бит (может быть более или менее в зависимости от настройки), можно сохранить 2^16 разных значений глубины. Это означает, что с вашей установкой объекты могут быть относительно далеко друг от друга и по-прежнему рассматриваться как находящиеся на одной глубине. Вы можете подумать о том, действительно ли этот огромный диапазон глубины необходим для приложения.

+0

Почему 'gluPerspective (55.0, winWid/winHei, 0.1, -1.0);' делает объекты видимыми в поле зрения и 'gluPerspective (55.0, winWid/winHei, 0.1, 1.0);' не делает этого ?? – ampawd

+0

Потому что это не работает. gluPerspective возвращает действительную и рабочую матрицу проекции при вводе положительных значений ближнего и дальнего значения. (Или оба отрицательных, которые теоретически также должны быть разработаны). Подумайте об этом как о лучевой проекции. Все лучи проходят через источник. Теперь, как будет выглядеть усечка, если происхождение находится между ближней и дальней плоскостью? Многие предположения работают только в том случае, если это не так (например, fov было бы трудно определить). – BDL

+0

Хмм хорошо, кажется, я сейчас понимаю это лучше – ampawd

Смежные вопросы