Qt QOpenGLWidget 替代 gluCylinder 绘制圆柱体
在 Qt 中,可以使用 QOpenGLFunctions 类来替换 gluCylinder 函数。QOpenGLFunctions 是一个用于访问 OpenGL 函数的基类,它提供了许多 OpenGL 函数的声明和定义。
要在 QOpenGLWidget 中绘制一个圆柱体,可以按照以下步骤进行操作:
- 创建一个继承自
QOpenGLWidget的子类,并重写其initializeGL、resizeGL和paintGL方法。
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
};
- 在
initializeGL方法中,初始化 OpenGL 相关的设置,并启用 OpenGL 函数。
void MyOpenGLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
- 在
resizeGL方法中,设置 OpenGL 视口。
void MyOpenGLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
- 在
paintGL方法中,绘制圆柱体。
void MyOpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
glColor3f(1.0f, 0.0f, 0.0f);
// 使用 QOpenGLFunctions 的相关方法绘制圆柱体
glFlush();
}
注意,由于 QOpenGLWidget 继承自 QOpenGLFunctions,因此可以直接在继承自 QOpenGLWidget 的子类中使用 OpenGL 函数,而无需使用 glu 库中的函数。
示例代码:
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
private:
// 定义绘制圆柱体的函数
void drawCylinder(float radius, float height, int slices, int stacks);
};
void MyOpenGLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
void MyOpenGLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
void MyOpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
glColor3f(1.0f, 0.0f, 0.0f);
// 使用绘制圆柱体的函数
drawCylinder(1.0f, 2.0f, 20, 20);
glFlush();
}
// 绘制圆柱体的函数
void MyOpenGLWidget::drawCylinder(float radius, float height, int slices, int stacks)
{
// ... 使用 QOpenGLFunctions 绘制圆柱体
}
使用 QOpenGLFunctions 绘制圆柱体:
您需要使用 QOpenGLFunctions 的相关方法,例如 glGenVertexArrays, glGenBuffers, glVertexAttribPointer, glDrawArrays 等,来创建顶点数组对象、顶点缓冲对象,并将顶点数据传递给 OpenGL,然后使用 glDrawArrays 或 glDrawElements 方法绘制圆柱体。
注意:
gluCylinder函数是旧的 OpenGL 库中的函数,它已经不再被推荐使用。- 使用 QOpenGLFunctions 可以更灵活地控制 OpenGL 的绘制过程。
- 以上代码示例仅供参考,实际应用中可能需要根据具体情况进行调整。
原文地址: https://www.cveoy.top/t/topic/pjYN 著作权归作者所有。请勿转载和采集!