Изменить размер окна просмотра, обрезать сцену - PullRequest
1 голос
/ 05 мая 2011

У меня есть 3D-сцена, нарисованная OpenGL в окне с изменяемыми размерами.Теперь, когда размер окна изменяется, я не хочу масштабировать область просмотра, скорее я хочу сохранить сцену фиксированного размера и показать большую ее часть (или обрезать изображение сцены).Это мой текущий код:

GLfloat ratio;

// Protect against a divide by zero
if ( height == 0 )
    height = 1;

ratio = ( GLfloat )width / ( GLfloat )height;
// Setup our viewport.
glViewport( 0, 0, ( GLint )width, ( GLint )height );

// change to the projection matrix and set our viewing volume.
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );

gluPerspective( 60.0f, ratio, 0.1f, 1000.0f );
// Switch back to the modelview
glMatrixMode( GL_MODELVIEW );

Если я сохраню соотношение фиксированным, то изображение сцены просто масштабируется, но я хочу сохранить его в фиксированном размере и просто показать более широкий вид.Есть идеи по этому поводу?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Настройте параметры поля зрения.Технически то, что вы хотите сделать, проще, если сделать это, используя glFrustum вместо gluPerspective .

// Protect against a divide by zero
if ( height == 0 )
    height = 1;

// Setup our viewport.
glViewport( 0, 0, ( GLint )width, ( GLint )height );

// change to the projection matrix and set our viewing volume.
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );

// supply some sensefull value for this; ideally let the user adjust it somehow
exterm float Zoom;

// near far should tightly wrap the actually visible set of objects. Hardcoded values
// like 0.1 ... 1000.f are problematic. Also your choosen value range slices your viewport
// into 10000 depth slices. Say you get only a 16 bit depth buffer already in the lineary
// slicing ortho projection a OpenGL length units in depth would recieve only about 6 
// slices. In perspective mode the slice density follows a 1/depth law. So already at depth
// 10 you'll run into depth resolution problems.
glFrustum(-Zoom * width, Zoom * width, -Zoom * height, Zoom * height, near, far);

// Switch back to the modelview
glMatrixMode( GL_MODELVIEW );

Обратите внимание, что этот код принадлежит функции отображения.Любой учебник, который устанавливает область просмотра и проекцию в обработчике изменения формы окна, очень плохой стиль;не следуй за этим.

0 голосов
/ 05 мая 2011

В идеале, поскольку вы установили область просмотра на 0,0, ширина, высота, изображение должно оставаться в том же размере. Можете ли вы проверить координаты, которые вы отправляете для изображения. Это остается постоянным или масштабируется вместе с шириной / высотой? Можете выложить код для добавления вершин.

...