Qt OpenGL(初始)

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_CustomerOpenGLWidget.h"
#include <qopenglwidget.h>
#include <qopenglfunctions.h>
#include <QMatrix4x4>
#include <QOpenGLExtraFunctions>


QT_BEGIN_NAMESPACE
namespace Ui { class CustomerOpenGLWidgetClass; };
QT_END_NAMESPACE

class CustomerOpenGLWidget : public QOpenGLWidget, public QOpenGLExtraFunctions
{
    Q_OBJECT

public:
    CustomerOpenGLWidget(QOpenGLWidget* parent = nullptr);
    ~CustomerOpenGLWidget();
protected:
    void initializeGL() override;

    
    void resizeGL(int w, int h) override;
    
    
    void paintGL() override;

private:
    Ui::CustomerOpenGLWidgetClass *ui;
    QMatrix4x4 m_projection;
    QMatrix4x4 m_modelview;

};
#include "CustomerOpenGLWidget.h"
#include <iostream>
using namespace std;

CustomerOpenGLWidget::CustomerOpenGLWidget(QOpenGLWidget*parent)
    : QOpenGLWidget(parent)
    , ui(new Ui::CustomerOpenGLWidgetClass())
{
    ui->setupUi(this);
}

CustomerOpenGLWidget::~CustomerOpenGLWidget()
{
    delete ui;
}

void CustomerOpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
}

void CustomerOpenGLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);
}

void CustomerOpenGLWidget::paintGL()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // 将当前矩阵堆栈设置为模型视图矩阵堆栈
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); // 将当前矩阵设置为单位矩阵
    
    // 在模型矩阵上进行变换操作(会立即生效)
    glTranslatef(1.0f, 0.0f, 1.0f); // 将物体向后移动 5 个单位长度


    //获取生效后的模型视图矩阵(列优先存储)

    /*
         modelviewMatrix[0]  modelviewMatrix[4]  modelviewMatrix[8]   modelviewMatrix[12]
         modelviewMatrix[1]  modelviewMatrix[5]  modelviewMatrix[9]   modelviewMatrix[13]
         modelviewMatrix[2]  modelviewMatrix[6]  modelviewMatrix[10]  modelviewMatrix[14]
         modelviewMatrix[3]  modelviewMatrix[7]  modelviewMatrix[11]  modelviewMatrix[15]
   
    */
    GLfloat modelviewMatrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix);
    
    //
    glLoadMatrixf(&modelviewMatrix[0]);

    //for (int j = 0; j < 16; j++)
    //{
    //    cout << modelviewMatrix[j]<<"  ";
    //    if ((j + 1) % 4 == 0)
    //    {
    //        cout << endl;
    //    }
    //}

    // 转换成行优先存储的形式
    GLfloat modelviewMatrixRowMajor[16];
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            modelviewMatrixRowMajor[i * 4 + j] = modelviewMatrix[j * 4 + i];
        }
    }

    for (int j = 0; j < 16; j++)
    {
        cout << modelviewMatrixRowMajor[j] << "  ";
        if ((j + 1) % 4 == 0)
        {
            cout << endl;
        }
    }
    
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f); // Red
    glVertex2f(0.0f, 0.5f);     // Top
    glColor3f(0.0f, 1.0f, 0.0f); // Green
    glVertex2f(-0.5f, -0.5f);    // Bottom left
    glColor3f(0.0f, 0.0f, 1.0f); // Blue
    glVertex2f(0.5f, -0.5f);     // Bottom right
    glEnd();

    // 压栈
    glPushMatrix();


    glRotatef(45, 0.0f, 1.0f, 0.0f);  //绕y轴旋转45°
    // 绘制第二个三角形,应用平移变换
    glBegin(GL_TRIANGLES);
    glColor3f(0.0f, 1.0f, 0.0f); // Green
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
    glVertex3f(0.0f, 0.5f, 0.0f);
    glEnd();

    // 出栈,恢复到压栈前的状态
    glPopMatrix();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值