通过这篇介绍,希望可以帮到大家更好的绘制3d图形
QT6与OpenGL的结合
1. Qt 6提供了许多增强型模块,如Qt Quick 3D和Qt 3D,这些模块可以直接与OpenGL进行交互,使得在Qt 6中使用OpenGL进行图形渲染变得更加高效和便捷。
2. 要在Qt 6中使用OpenGL,首先需要在项目中包含相应的OpenGL库。
pro文件加入:QT += charts opengl
win32: LIBS += -lOpenGL32
win32: LIBS += -lGLU32
unix: LIBS += -lglut -lGLU
3. 在Qt 6中,可以通过多种方式对OpenGL渲染性能进行优化
4. 利用OpenGL的纹理管理,减少CPU到GPU的数据传输
5. 在Qt 6中,可以通过多种方式对OpenGL渲染性能进行优化
6. 操作简单
在QOpenGLWidget组件上渲染opengl:继承QOpenGLWidget和QOpenGLFunctions_4_5_Core
实现三个虚函数:initializeGL、resizeGL、paintGL
函数介绍
glViewport: 重置当前的视口
glMatrixMode 选择投影矩阵
gluPerspective 建立透视投影矩阵,基于窗口宽度和高度
glTranslatef 平移
glRotatef 旋转
glPushMatrix 设置新的状态
gluProject 坐标转换;比如将三维坐标投影到屏幕,或者鼠标坐标转换为世界坐标等
参考:https://learn.microsoft.com/zh-cn/windows/win32/opengl/glrecti
绘图介绍
1. 绘制坐标系和网格
glPushMatrix();
{
glLineWidth(1.5);
//沿x,y,z轴方向的平移, 平移到原点
glTranslatef(m_translate.x, m_translate.y, m_translate.z);
glBegin(GL_LINES); //绘制坐标轴
{
glEnable(GL_LINE_SMOOTH);
//从原点绘制三条线
glColor3f(1, 0, 0); glVertex3f(0, 0, 0); glVertex3f(m_Size.x, 0, 0); //X
glColor3f(0, 1, 0); glVertex3f(0, 0, 0); glVertex3f(0, m_Size.y, 0); //Y
glColor3f(0, 0, 1); glVertex3f(0, 0, 0); glVertex3f(0, 0, m_Size.z); //Z
}
glEnd();
//绘制网格
glColor3f(1, 1, 1);
glLineWidth(1.0f);
//绘制xy平面的网格, m_xyGridNum网格的横竖的数量
paintXYGrid(m_xyGridNum[0], m_xyGridNum[1]);
//绘制yz平面的网格, m_yzGridNum网格的横竖的数量
paintYZGrid(m_yzGridNum[0], m_yzGridNum[1]);
}
glPopMatrix();
paintXYGrid:函数
//计算分割成vNum数量,每一个网格的距离
float xSpacing = m_Size.x / vNum;
float ySpacing = m_Size.y / hNum;
glBegin(GL_LINES);
glEnable(GL_LINE_SMOOTH);
for(int i = 1; i <= hNum; ++i)
{
float y = ySpacing * i;
//绘制线
glVertex3f(0, y, 0);
glVertex3f(m_Size.x, y, 0);
}
for(int i = 1; i <= vNum; ++i)
{
float x = xSpacing * i;
glVertex3f(x, 0, 0);
glVertex3f(x, m_Size.y, 0);
}
glEnd();
paintYZGrid:函数
float zSpacing = m_Size.z / vNum;
float ySpacing = m_Size.y / hNum;
glBegin(GL_LINES);
glEnable(GL_LINE_SMOOTH);
for(int i = 1; i <= hNum; ++i)
{
float y = ySpacing * i;
glVertex3f(0, y, 0);
glVertex3f(0, y, m_Size.z);
}
for(int i &#