当前位置 博文首页 > 似水流年:Qt5--OpenGL加载3D模型--立方体
原文出处:https://www.infotutoriales.info/2016/10/opengl-con-qt.html?m=1
?效果图,使用三个滑块来调节3D图像的三个轴,来让3D图像旋转,然后在实际中三个滑块的值可以通过其他数据来加载。
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QGLFramebufferObjectFormat>
class MyWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
explicit MyWidget(QWidget *parent = 0);
protected:
void initializeGL() Q_DECL_OVERRIDE;
void resizeGL(int w, int h)Q_DECL_OVERRIDE;
void paintGL()Q_DECL_OVERRIDE;
void graficarLineas();
public:
double rotate_y=0;
double rotate_x=0;
double rotate_z=0;
private:
};
#endif // MYWIDGET_H
mywidget.c
#include "mywidget.h"
MyWidget::MyWidget(QWidget *parent):QOpenGLWidget(parent)
{
}
void MyWidget::initializeGL()
{
initializeOpenGLFunctions();
glEnable(GL_DEPTH_TEST);
}
void MyWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
void MyWidget::paintGL()
{
// 清除屏幕和Z缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
// 重置转换
glLoadIdentity();
// 当用户更改“ rotate_x”和“ rotate_y”时旋转
glRotatef( rotate_x, 1.0, 0.0, 0.0 );
glRotatef( rotate_y, 0.0, 1.0, 0.0 );
glRotatef( rotate_z, 0.0, 0.0, 1.0 );
// 前侧:多色侧
glBegin(GL_POLYGON); // 显示一个矩形,就使用GL_POLYGON
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( 0.5, -0.5, -0.5 ); // P1 是红色
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( 0.5, 0.5, -0.5 ); // P2 是绿色
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( -0.5, 0.5, -0.5 ); // P3 是蓝色
glColor3f( 1.0, 0.0, 1.0 );
glVertex3f( -0.5, -0.5, -0.5 ); // P4 是紫色
glEnd();
// 背面:白色面
glBegin(GL_POLYGON);
glColor3f( 1.0, 1.0, 1.0 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glEnd();
// 右侧:紫色侧
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 1.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glEnd();
// 左侧:绿色侧
glBegin(GL_POLYGON);
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
// 顶部:蓝色面
glBegin(GL_POLYGON);
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glEnd();
// 下侧:红色侧
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
graficarLineas();
glFlush();
this->makeCurrent();
}
void MyWidget::graficarLineas()
{
glBegin(GL_LINES);
glColor3f(1,0,0);
glVertex3f(0,0,0);
glVertex3f(20,0,0);
glColor3f(1,1,0);
glVertex3f(0,0,0);
glVertex3f(0,20,0);
glColor3f(0,1,1);
glVertex3f(0,0,0);
glVertex3f(0,0,20);
glEnd();
}
#-------------------------------------------------