利用OpenGL绘制一个三棱锥或立方体,为其每个面贴上纹理,并使立方体可以自己进行旋转或者平移、缩小、放大等
时间: 2024-02-06 07:02:13 浏览: 256
旋转由6个侧面组成的立方体OpenGL.zip
下面是使用OpenGL绘制一个立方体并为其每个面贴上纹理的示例代码:
```c++
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLTexture>
#include <QTimer>
class CubeWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
CubeWidget(QWidget *parent = nullptr)
: QOpenGLWidget(parent)
{}
void initializeGL() override
{
initializeOpenGLFunctions();
// 设置背景颜色
glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 创建纹理对象并加载纹理图片
m_texture1 = new QOpenGLTexture(QImage(":/textures/texture1.png").mirrored());
m_texture2 = new QOpenGLTexture(QImage(":/textures/texture2.png").mirrored());
m_texture3 = new QOpenGLTexture(QImage(":/textures/texture3.png").mirrored());
m_texture4 = new QOpenGLTexture(QImage(":/textures/texture4.png").mirrored());
m_texture5 = new QOpenGLTexture(QImage(":/textures/texture5.png").mirrored());
m_texture6 = new QOpenGLTexture(QImage(":/textures/texture6.png").mirrored());
// 启用定时器,每隔10ms更新旋转角度
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &CubeWidget::updateRotation);
timer->start(10);
}
void resizeGL(int w, int h) override
{
// 设置视口大小
glViewport(0, 0, w, h);
// 设置投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = static_cast<float>(w) / h;
glFrustum(-aspect, aspect, -1, 1, 1, 1000);
// 设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -10);
}
void paintGL() override
{
// 清空颜色缓冲区和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绑定纹理对象
m_texture1->bind(0);
m_texture2->bind(1);
m_texture3->bind(2);
m_texture4->bind(3);
m_texture5->bind(4);
m_texture6->bind(5);
// 绘制立方体
glPushMatrix();
glRotatef(m_rotation, 1, 1, 1);
glBegin(GL_QUADS);
// 绘制前面
glTexCoord2f(0, 1); glVertex3f(-1, -1, 1);
glTexCoord2f(1, 1); glVertex3f( 1, -1, 1);
glTexCoord2f(1, 0); glVertex3f( 1, 1, 1);
glTexCoord2f(0, 0); glVertex3f(-1, 1, 1);
// 绘制后面
glTexCoord2f(0, 1); glVertex3f( 1, -1, -1);
glTexCoord2f(1, 1); glVertex3f(-1, -1, -1);
glTexCoord2f(1, 0); glVertex3f(-1, 1, -1);
glTexCoord2f(0, 0); glVertex3f( 1, 1, -1);
// 绘制左面
glTexCoord2f(0, 1); glVertex3f(-1, -1, -1);
glTexCoord2f(1, 1); glVertex3f(-1, -1, 1);
glTexCoord2f(1, 0); glVertex3f(-1, 1, 1);
glTexCoord2f(0, 0); glVertex3f(-1, 1, -1);
// 绘制右面
glTexCoord2f(0, 1); glVertex3f( 1, -1, 1);
glTexCoord2f(1, 1); glVertex3f( 1, -1, -1);
glTexCoord2f(1, 0); glVertex3f( 1, 1, -1);
glTexCoord2f(0, 0); glVertex3f( 1, 1, 1);
// 绘制上面
glTexCoord2f(0, 1); glVertex3f(-1, 1, 1);
glTexCoord2f(1, 1); glVertex3f( 1, 1, 1);
glTexCoord2f(1, 0); glVertex3f( 1, 1, -1);
glTexCoord2f(0, 0); glVertex3f(-1, 1, -1);
// 绘制下面
glTexCoord2f(0, 1); glVertex3f(-1, -1, -1);
glTexCoord2f(1, 1); glVertex3f( 1, -1, -1);
glTexCoord2f(1, 0); glVertex3f( 1, -1, 1);
glTexCoord2f(0, 0); glVertex3f(-1, -1, 1);
glEnd();
glPopMatrix();
}
void updateRotation()
{
// 更新旋转角度
m_rotation += 0.5;
if (m_rotation > 360) {
m_rotation -= 360;
}
// 重新绘制
update();
}
private:
QOpenGLTexture *m_texture1;
QOpenGLTexture *m_texture2;
QOpenGLTexture *m_texture3;
QOpenGLTexture *m_texture4;
QOpenGLTexture *m_texture5;
QOpenGLTexture *m_texture6;
float m_rotation = 0;
};
```
在上面的代码中,我们首先在`initializeGL()`函数中进行了OpenGL的初始化工作,包括设置背景颜色、启用深度测试、创建纹理对象等。然后在`resizeGL()`函数中设置了视口大小和投影矩阵、模型视图矩阵。最后在`paintGL()`函数中绘制立方体,并为其每个面绑定了不同的纹理对象。我们还使用了定时器来更新旋转角度,以实现立方体自动旋转的效果。
如果需要实现平移、缩小、放大等操作,可以在`paintGL()`函数中根据需要进行相应的矩阵变换,如使用`glTranslatef()`进行平移、`glScalef()`进行缩放等。
阅读全文