在 Qt 中,可以使用 QOpenGLFunctions 类来替换 gluCylinder 函数。QOpenGLFunctions 是一个用于访问 OpenGL 函数的基类,它提供了许多 OpenGL 函数的声明和定义。

要在 QOpenGLWidget 中绘制一个圆柱体,可以按照以下步骤进行操作:

  1. 创建一个继承自 QOpenGLWidget 的子类,并重写其 initializeGLresizeGLpaintGL 方法。
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;
};
  1. initializeGL 方法中,初始化 OpenGL 相关的设置,并启用 OpenGL 函数。
void MyOpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
  1. resizeGL 方法中,设置 OpenGL 视口。
void MyOpenGLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
}
  1. 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,然后使用 glDrawArraysglDrawElements 方法绘制圆柱体。

注意:

  • gluCylinder 函数是旧的 OpenGL 库中的函数,它已经不再被推荐使用。
  • 使用 QOpenGLFunctions 可以更灵活地控制 OpenGL 的绘制过程。
  • 以上代码示例仅供参考,实际应用中可能需要根据具体情况进行调整。

原文地址: https://www.cveoy.top/t/topic/pjYN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录