模拟一个基于CPU的光栅化渲染器的简化版本
作业要求: 需要我们填充MVP变换中的M(模型变换)和P(投影变换)
get_model_matrix()函数:
由作业框架中给出的注释得知, 需要创建用于围绕 Z 轴旋转三角形的模型矩阵
直接套用如下公式:
完整代码如下: (注意弧度rotation_angle与角度的换算)
get_projection_matrix()函数:
由作业框架中给出的注释得知, 用给定参数创建透视投影矩阵
相关参数解析:
t, b, l, r, n, f 各对应上、下、左、右、近、远平面, 公式中的这些参数表示原点距离平面的距离, 例如: t=-b , l=-r
正交投影矩阵公式如下:
透视变正交投影矩阵公式如下:
透视投影矩阵 == 正交投影矩阵 乘以 透视变正交矩阵
注意事项: 求出t , r
给出的参数中有 eye_fov(垂直可视角度), aspect_ratio(宽高比), zNear(相机与近平面的距离), zFar(相机与远平面的距离)
下图中通过 zNear / eye_fov 的三角关系得出 height, 也就是我们需要求的原点与上平面的距离(t)
用aspect_ratio * t得出 r.
完整代码如下:
提高项
这里使用的是第三节课讲的罗德里格旋转公式(Rodrigues' rotation formula)
完整代码如下:
get_rotation(围绕axis这条轴, 旋转angle度)
写好了被调用的函数, 现在就差调用接口没有设置了
我比较省事(其实就是懒哈哈哈), 所以直接用原来的接口, 直接替换参数
main()函数: (只改变划线处)
因为上面围绕的是x轴, angle还是框架中的按一下增加10或者减少10
效果图:
默认状态
按了两下D, 绕x轴旋转了-20°
按了6下A, 绕x轴旋转了60°
关于框架的理解, 这是这次作业必须要完成的, 但是本人比较懒, 做得时候没有记录下来, 导致全忘了
贴上我觉得解释得不错的知乎博文: