1.6.2 练习

文章探讨了在OpenGL中,当改变位移和旋转操作的执行顺序时,对图形对象行为的影响。作者通过实例展示了如何先旋转再位移与先位移后旋转的区别,并介绍了如何使用QMatrix4x4和sin函数进行不同效果的实现。
摘要由CSDN通过智能技术生成

一、先旋转,后位移

题目:使用应用在箱子上的最后一个变换,尝试将其改变为先旋转,后位移。看看发生了什么,试着想想为什么会发生这样的事情;

把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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值