Games101-作业一: 旋转与投影

模拟一个基于CPU的光栅化渲染器的简化版本

作业要求: 需要我们填充MVP变换中的M(模型变换)和P(投影变换)

get_model_matrix()函数:

由作业框架中给出的注释得知, 需要创建用于围绕 Z 轴旋转三角形的模型矩阵

直接套用如下公式:

Games101-作业一: 旋转与投影_第1张图片

完整代码如下:   (注意弧度rotation_angle与角度的换算)

Games101-作业一: 旋转与投影_第2张图片

get_projection_matrix()函数:

由作业框架中给出的注释得知, 用给定参数创建透视投影矩阵

相关参数解析:

t, b, l, r, n, f 各对应上、下、左、右、近、远平面, 公式中的这些参数表示原点距离平面的距离, 例如: t=-b , l=-r

Games101-作业一: 旋转与投影_第3张图片

正交投影矩阵公式如下:

Games101-作业一: 旋转与投影_第4张图片

透视变正交投影矩阵公式如下:

Games101-作业一: 旋转与投影_第5张图片

 透视投影矩阵 == 正交投影矩阵 乘以 透视变正交矩阵

注意事项: 求出t , r

给出的参数中有 eye_fov(垂直可视角度), aspect_ratio(宽高比), zNear(相机与近平面的距离), zFar(相机与远平面的距离)

下图中通过 zNear / eye_fov 的三角关系得出 \frac{1}{2}height, 也就是我们需要求的原点与上平面的距离(t)

用aspect_ratio * t得出 r.

Games101-作业一: 旋转与投影_第6张图片

完整代码如下:

Games101-作业一: 旋转与投影_第7张图片

提高项

Games101-作业一: 旋转与投影_第8张图片

这里使用的是第三节课讲的罗德里格旋转公式(Rodrigues' rotation formula)

Games101-作业一: 旋转与投影_第9张图片

完整代码如下:

get_rotation(围绕axis这条轴, 旋转angle度)

Games101-作业一: 旋转与投影_第10张图片

写好了被调用的函数, 现在就差调用接口没有设置了

我比较省事(其实就是懒哈哈哈), 所以直接用原来的接口, 直接替换参数

main()函数: (只改变划线处)

Games101-作业一: 旋转与投影_第11张图片

Games101-作业一: 旋转与投影_第12张图片

因为上面围绕的是x轴, angle还是框架中的按一下增加10或者减少10

效果图:

默认状态

Games101-作业一: 旋转与投影_第13张图片

按了两下D, 绕x轴旋转了-20°

Games101-作业一: 旋转与投影_第14张图片

 按了6下A, 绕x轴旋转了60°

Games101-作业一: 旋转与投影_第15张图片

关于框架的理解, 这是这次作业必须要完成的, 但是本人比较懒, 做得时候没有记录下来, 导致全忘了

贴上我觉得解释得不错的知乎博文:

GAMES101-作业1详解 - 第二型面积分的文章 - 知乎

你可能感兴趣的:(Games101,图形渲染)