一、先旋转,后位移
题目:使用应用在箱子上的最后一个变换,尝试将其改变为先旋转,后位移。看看发生了什么,试着想想为什么会发生这样的事情;
把paintGL()函数中位移和旋转的代码互换位置,使旋转的代码在上一行
matrix.rotate(time, 0.0f, 0.0f, 1.0f); //旋转
matrix.translate(0.5, -0.5, 0.0); //位移
运行程序,箱子会围绕原心点旋转
二、第二个箱子
尝试再次调用glDrawElements画出第二个箱子,只使用变换将其摆放在不同的位置。让这个箱子被摆放在窗口的左上角,并且会不断的缩放(而不是旋转)。(xsin函数在这里会很有用,不过注意使用sin函数时应用负值会导致物体被翻转):
更改paintGL()函数代码如下:
void MyOpenGLWidget::paintGL()
{
//设置墨绿色背景
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //状态设置
glClear(GL_COLOR_BUFFER_BIT); //状态使用
//变换矩阵
QMatrix4x4 matrix; //创建单位矩阵
unsigned int time = QTime::currentTime().msec();
matrix.translate(0.5, -0.5, 0.0); //位移
matrix.rotate(time, 0.0f, 0.0f, 1.0f); //旋转
m_shaderProgram.setUniformValue("RotationMatrix", matrix);
//绘制
m_shaderProgram.bind(); //激活程序对象
glBindVertexArray(VAO); //绑定VAO
m_textureWall->bind(0); //绑定激活纹理单元0
m_textureSmile->bind(1); //绑定激活纹理单元1
m_textureSmall->bind(2); //绑定激活纹理单元2
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL); //绘图
//绘制第二个矩形
matrix.setToIdentity(); //还原成单位矩阵
matrix.translate(-0.5, 0.5, 0.0); //位移
matrix.scale(fabs(sin(time))); //缩放
m_shaderProgram.setUniformValue("RotationMatrix", matrix);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL); //绘图
}
运行结果如下,一个箱子缩放,一个箱子旋转
注:观看OpenGL中文官网(https://learnopengl-cn.github.io/)和阿西拜的现代OpenGL入门(https://ke.qq.com/course/3999604#term_id=104150693)学习OpenGL