2012-06-04 41 views
0

我C编程的一个台球游戏++使用Qt和OpenGL(更具体的,在Q​​GLWidget来绘图)。我知道我在OpenGL的方式有点,但不是太多的专业人士。OpenGL窗口切断模型视图

我做了什么: 创建一个Qt应用程序窗口与Qt小部件(按钮,...)和一个QGLWidget(我自己的实现)。

问题: 我可以在这个窗口中画一个球并旋转它,等等,但视图的高宽比不正确+我似乎无法使用整个空间。

Wrong aspect ratio 的白色矩形是公平的竞争环境(测量:1.4×2.7 float坐标)

我可以改变模型,但随后似乎切断了:只要我变换 Model cut off

该视图(下面查看功能)我的模型的一部分似乎被切断。

这是矩形(球这些坐标内绘制正确):

glBegin(GL_LINE_LOOP); 
    glColor3f(255.0, 255.0, 255.0); 
    glVertex3f(0.0, 0.0, 0.0); 
    glVertex3f(1.4, 0.0, 0.0); 

    glVertex3f(1.4, 0.0, 0.0); 
    glVertex3f(1.4, 2.7, 0.0); 

    glVertex3f(1.4, 2.7, 0.0); 
    glVertex3f(0.0, 2.7, 0.0); 

    glVertex3f(0.0, 2.7, 0.0); 
    glVertex3f(0.0, 0.0, 0.0); 
glEnd(); 

OpenGL图像大小调整功能:

void GLWidget::resizeGL(int width, int height) 
{ 
    int side = qMin(width, height); 
    glViewport((width - side)/2, (height - side)/2, side, side); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-0.05, +1.45, -0.05, +2.75, 0.0, 50.0); 
    //glFrustum(-0.05, +1.45, 0.0, 0.0, 0.0, 50.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();              
} 

,最后,从渲染功能的部分相关视图:

gluLookAt(0.0, 0.0, 1.0, 0.0, -0.70, 0.0, 0.0, 1.0, 0.0); // This is the cut of part 
//gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // Normal but weird rectangle 
glScalef(1.0, 1.0, 1.0); 

回答

1

你的问题在于:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-0.05, +1.45, -0.05, +2.75, 0.0, 50.0); 

投影的左/右或上/下限值应符合您的视口的方面。这些硬编码值不适应窗口几何的变化。

还要确保近及远的平面不切入可视景象范围。

+0

近和远平面都设置了“远”够了,那工作AFAIK。你有什么建议我改变他们? 我只是想显示表(左下坐标= 0,0,右上角坐标= 1.4,2.7),也许它可以在第一周围有一些空的空间,只是表..谢谢 – TheDudeAbides

+0

显然,他们是不够远,因为你的场景片段。我会说近裁剪机是罪魁祸首。在正投影中,近夹平面的负值是完全可以接受的。 – datenwolf

+0

设置不正确只有视口(保持正确的方面)更容易? – Luca