#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();
}