-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathglwidget.cpp
134 lines (107 loc) · 2.89 KB
/
glwidget.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "glwidget.h"
#include <QVector>
#include <QMouseEvent>
GLWidget::GLWidget(QWidget* parent):
QOpenGLWidget(parent),
m_xRot(0),
m_yRot(0)
{
}
GLWidget::~GLWidget()
{
}
void GLWidget::initShaders()
{
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vshader.glsl"))
close();
// Compile fragment shader
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fshader.glsl"))
close();
// Link shader pipeline
if (!m_program.link())
close();
}
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
initShaders();
m_program.bind();
m_program.setUniformValue("lightPosition",QVector4D(6.0f,3.0f,5.0f,1.0f));//设置光源在空间中的位置
m_program.setUniformValue("lightIntensity",QVector3D(0.9f,0.9f,0.9f));//设置光源强度
loadOBJMTL();
QVector3D eye(20, 13, 5);
QVector3D center(0, 0, 0);
QVector3D up(0, 1, 0);
/*
m_view为视点变换矩阵
eye为眼睛在空间中的位置
center为眼睛注视的中心
up为向上的方向向量
*/
m_view.setToIdentity();
m_view.lookAt(eye,center,up);
glEnable(GL_DEPTH_TEST);
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void GLWidget::resizeGL(int w,int h)
{
glViewport(0,0,w,h);
m_proj.setToIdentity();
m_proj.perspective(60.0f,(float)w/h,0.3f,1000);
update();
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QMatrix4x4 model;
/*
model为模型变换矩阵,设定模型在空间中的位置,大小,旋转
*/
m_program.bind();
model.setToIdentity();
model.translate(-10.0f,0.0f,4.5f);
model.scale(0.8f);
model.rotate(-90,0,1,0);
model.rotate(m_xRot / 16.0f, 1, 0, 0);
model.rotate(m_yRot / 16.0f, 0, 1, 0);
loaderBoard.drawObjEntity(&m_program,model,m_view,m_proj); //绘制实体
model.rotate(90,0,1,0);
model.translate(19.0f,0.0f,-9.3f);
loaderCoordinate.drawObjEntity(&m_program,model,m_view,m_proj);
}
void GLWidget::loadOBJMTL()
{
if(!loaderBoard.Load(":/obj/saber_c3_evk_v2_0_for_qt_edit2.obj",":/obj/saber_c3_evk_v2_0_for_qt_edit2.mtl"))
{
qDebug()<<"Fail to load model";
exit(1);
}
loaderBoard.allocateVertexBuffer(&m_program);//分配图元空间*/
if(!loaderCoordinate.Load(":/obj/coordinate.obj",":/obj/coordinate.mtl"))
{
qDebug()<<"Fail to load model";
exit(1);
}
loaderCoordinate.allocateVertexBuffer(&m_program);
}
QSize GLWidget::sizeHint() const
{
return QSize(600,400);
}
QSize GLWidget::minimumSizeHint() const
{
return QSize(60,60);
}
void GLWidget::mousePressEvent(QMouseEvent *event)
{
m_lastPos=event->pos();
}
\
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
int dx=event->x()-m_lastPos.x();
int dy=event->y()-m_lastPos.y();
m_xRot+=dx;
m_yRot+=dy;
update();
}