我正在尝试让Qt和OpenGL一起工作,以便我可以摆脱glu和glut。
除了我的透视矩阵之外,我已经让所有东西按照我想要的方式工作了。
我只是绘制一个简单的3D立方体,并希望我的视角呈倾斜状态。
我尝试编写替代gluPerspective的代码,但我无法得到我想要的结果。
因此,如何正确使用透视矩阵?
注意:我愿意尝试其他替代方案,因为我仍在努力适应OpenGL和Qt,以及如何正确地使用这两个框架。
以下是我的GLWidget类的实现:
除了我的透视矩阵之外,我已经让所有东西按照我想要的方式工作了。
我只是绘制一个简单的3D立方体,并希望我的视角呈倾斜状态。
我尝试编写替代gluPerspective的代码,但我无法得到我想要的结果。
因此,如何正确使用透视矩阵?
注意:我愿意尝试其他替代方案,因为我仍在努力适应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 );
}