返回首页 现代 OpenGL 教程(连载)

modern opengl tutorial

第三十七课 延迟渲染(三)(未完待续)

第三十八课 使用Assimp导入骨骼动画(未完待续)

第三十九课 轮廓检测(未完待续)

第四十课 阴影锥(未完待续)

第四十一课 运动模糊(未完待续)

第四十二课 基于PCF的阴影(未完待续)

第四十三课 基于点光源的阴影(未完待续)

第四十四课 GLFW(未完待续)

第四十五课 屏幕空间的环境遮挡(未完待续)

第四十六课 SSAO与深度重构(未完待续)

end

第八课 缩放变换

背景

缩放矩阵也很简单!它的作用是放大或缩小物体的尺寸!在很多情况下,你可能想对某些对象做这些处理,例如,当你想用同一模型产生一些差异(大树和小树本质上是一样的),亦或你想将物体的尺寸与其现实世界的尺寸联系起来!对于上面的例子,你可能想使点的三个坐标分量进行相同的缩放。然而,有时候你可能只想缩放两个坐标轴上的分量,导致模型变“厚”或“薄”。

计算变换矩阵是非常复杂的!我们从单位矩阵开始,记住它与向量相乘后向量不产生的变化原因是,矩阵对角线上的每个 1 依次与向量的每个分量相乘!没有一个分量会影响其他分量!因此,用其他值代替其中的任何一个 1 将使物体在相应轴上发生变化:这个值大于1的话物体将变大,小于1将缩小。

代码

World.m[0][0]=sinf(Scale);World.m[0][1]=0.0f;       World.m[0][2]=0.0f;       World.m[0][3]=0.0f;
World.m[1][0]=0.0f;       World.m[1][1]=sinf(Scale);World.m[1][2]=0.0f;       World.m[1][3]=0.0f;
World.m[2][0]=0.0f;       World.m[2][1]=0.0f;       
World.m[2][2]=sinf(Scale);        World.m[2][3]=0.0f;
World.m[3][0]=0.0f;       World.m[3][1]=0.0f;       
World.m[3][2]=0.0f;       World.m[3][3]=1.0f;

相较于上一章,本章仅有的变化是我们根据上面的描述创建了一个缩放变换矩阵,并用其替换了之前的世界矩阵!正如你看到的,我们用在 -1 到 1 之间的值来对我们绘制的三角形进行缩放!在 (0,1] 范围内,三角形处于非常小和它原来的大小的范围内,而当对角线上都是零时它完全消失!在范围[-1,0)内看起来一样而只是发生翻转,因为对角线上的缩放值实际上改变了坐标的符号!

操作结果