我试图让Qt和openGL一起工作,这样我就可以消除glu和glut。
除了我的视angularmatrix之外,我所有的工作都像我想要的那样工作。
我只画一个简单的三维立方体,并希望我的观点成为一个angular度。
我已经尝试编码替代gluPerspective,但我不能得到我想要的。
因此,我怎么能得到一个透视matrix正确工作?
注:我打开其他的select,因为我仍然习惯于openGL和Qt,以及如何正确使用这两个框架。
下面是我的GLWidget类的实现:
GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) { setMouseTracking(true); } void GLWidget::initializeGL() { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); } void GLWidget::resizeGL(int w, int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-30.0, 30.0, -30.0, 30.0, -30.0, 30.0); GLdouble aspect = w / (h ? h : 1); const GLdouble zNear = -30.0, zFar = 30.0, fov = 30.0; perspective(fov, aspect, zNear, zFar); glMatrixMode(GL_MODELVIEW); } void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINE_LOOP); glVertex3iv(a); glVertex3iv(b); glVertex3iv(c); glVertex3iv(d); glEnd(); glBegin(GL_LINE_LOOP); glVertex3iv(a); glVertex3iv(e); glVertex3iv(f); glVertex3iv(b); glEnd(); glBegin(GL_LINE_LOOP); glVertex3iv(d); glVertex3iv(h); glVertex3iv(g); glVertex3iv(c); glEnd(); glBegin(GL_LINE_LOOP); glVertex3iv(e); glVertex3iv(f); glVertex3iv(g); glVertex3iv(h); glEnd(); } void GLWidget::keyPressEvent(QKeyEvent* event) { switch(event->key()) { case Qt::Key_Escape: close(); break; default: event->ignore(); break; } } void GLWidget::perspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) { GLdouble xmin, xmax, ymin, ymax; ymax = zNear * tan( fovy * M_PI / 360.0 ); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; glFrustum( xmin, xmax, ymin, ymax, zNear, zFar ); }
你的透视函数是正确的(就像gluPerspective()那样)。 但是你应该知道,在resizeGL()中,你同时使用了Ortho和Frustum,所以你最终得到了一个投影矩阵Ortho * Persepctive,它在应用透视失真之后基本上增加了一些缩放和平移。
您可以使用glFrustum重新实现gluPerspective,或者您正在做未来证明的事情,并使用像GLM,Eigen或linmath.h这样的矩阵数学库,使用它计算矩阵,并使用glLoadMatrix或glUniform将其预先计算到OpenGL中。
ffar与glFrustum的论点必须是正面的。