настройка перспективной проекции opengl

У меня возникла проблема с настройкой проекции просмотра. Я рисую куб с вершинами (0, 0, 0) (0, 0, 1) (0, 1, 1) (0, 1, 0) (1, 0, 0) (1, 1, 0) (1, 1, 1) и (1, 0, 1). Вот как я инициализирую представление:

void initGL(int x,int y, int w, int h)
{
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowPosition( x, y );
    glutInitWindowSize( w, h );
    glutCreateWindow( "CSE328 Project 1" );

    glutDisplayFunc(draw);
    glFrontFace(GL_FRONT_AND_BACK);
    glMatrixMode(GL_PROJECTION);
    glFrustum(-10.0, 10.0, -10.0, 10.0, 2.0, 40.0);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(10, 10, 10, 0.5, 0.5, 0, 0, 1.0, 0);
    glutMainLoop();
}

По какой-то причине куб заполняет весь экран. Я пытался изменить значения методов усеченной пирамиды и взгляда, но либо куб вообще не виден, либо заполняет всю область просмотра. В glLookAt я предполагаю, что «глаз» расположен в точке (10, 10, 10) и смотрит в точку (0,5, 0,5, 0), которая находится на поверхности куба. Я думал, что это даст достаточное расстояние, чтобы весь куб был виден. Я думаю об этом неправильно? Я также попытался переместить куб в направлении z так, чтобы он лежал от z = 10 до z = 11, а также в плоскости отсечения, но это дает аналогичные результаты.


person Kris    schedule 05.05.2012    source источник
comment
В OpenGL вы не инициализируете. Вы устанавливаете состояние. Большая часть того, что вы делаете в initGL, на самом деле относится к коду отрисовки; установка матриц (вам не хватает сброса к идентичности BTW).   -  person datenwolf    schedule 06.05.2012
comment
Спасибо, моя проблема была вызвана отсутствием сброса личности.   -  person Kris    schedule 06.05.2012


Ответы (2)


Куб имеет длину 1, объем просмотра охватывает 20 единиц по осям x и y. Куб занимает несколько пикселей посередине даже при ортогональной проекции; если во время рисования применяется какое-либо другое преобразование.

Я предлагаю уменьшить усеченную пирамиду (например, +/- 2.0f) и приблизить камеру; (4.0f, 4.0f, 4.0f).

person Stefan Hanke    schedule 06.05.2012

Перемещение положения глаза дальше от куба путем изменения первых 3 параметров gluLookAt() должно сделать его меньше.

Вы также можете заменить свой вызов glFrustum() вызовом gluPerspective(), что упростит настройку перспективной проекции по вашему вкусу.

person fintelia    schedule 09.05.2012