作业1,第一个正式作业,做出一个rasterizer(光栅化器),粗浅的说就是把一个空间上的物体显示在屏幕上,闫老师那边已经给我们做出来框架,需要我们补充的是:
- 模型变换函数,这里指三角形绕Z轴旋转的旋转变换
- 视角变换函数,这里指将模型放置在给出的人眼位置的平移操作
- 透视投影变换函数,这里指将原z轴处的模型投影到近z处的
前两个分别代入绕Z轴的旋转矩阵和平移变换矩阵即可,最后一个稍有难度,根据课程我们已知透视投影变换需先做从透视投影到正交投影的变换①,再做正交投影变换②。根据函数给出的参数,①对应的矩阵很好写出,但是②矩阵需要计算r,l,t,b,便需要利用宽高比ratio和可看角度fov进行计算,如下图所示,可以自行推导一下,详见下方代码:

另有一提高作业,绕任一过原点轴旋转,这个需要利用老师之前所讲的任意轴旋转的旋转公式,要注意的是,该公式给出的旋转矩阵是3x3的,需要对第四列、第四行单独赋值。
#include "Triangle.hpp"
#include "rasterizer.hpp"
#include <eigen3/Eigen/Eigen>
#include <iostream>
#include <opencv2/opencv.hpp>
constexpr double MY_PI = 3.1415926;
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{
Eigen::Matrix4f view = Eigen::Matr

本文档详细介绍了如何构建一个光栅化器,包括模型变换(绕Z轴旋转)、视角变换(平移操作)和透视投影变换。代码示例中给出了矩阵运算的具体实现,包括从透视投影到正交投影的转换,并考虑了宽高比和视角角度。此外,还提供了一个高级任务,即实现绕任意轴的旋转。在主函数中,演示了如何使用这些变换绘制三角形,并允许通过键盘输入调整旋转角度。
最低0.47元/天 解锁文章
8833





