本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个点 v0 (2.0, 0.0, −2.0), v1 (0.0, 2.0, −2.0), v2 (−2.0, 0.0, −2.0), 你需要将这三个点的坐标变换为屏幕坐标,并在屏幕上绘制出对应的线框三角形 (在代码框架中,我们已经提供了 draw_triangle 函数,所以你只需要去构建变换矩阵即可)。简而言之,我们需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在提供的代码框架中,我们留下了模型变换和投影变换的部分给你去完成。如果你对上述概念有任何不清楚或疑问,请复习课堂笔记或在论坛上提问。以下是你需要在 main.cpp 中修改的函数(请不要修改任何函数名和其他已经填写好的函数,并保证提交的代码是能编译运行的):
- get_model_matrix(float rotation_angle): 逐个元素地构建模型变换矩阵并返回该矩阵。在此函数中,你只需要实现三维中绕 z 轴旋转的变换矩阵,而不用处理平移与缩放。
- get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar): 使用给定的参数逐个元素地构建透视投影矩阵并返回该矩阵。
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{
Eigen::Matrix4f view = Eigen::Matrix4f::Identity();
Eigen::Matrix4f translate;
translate << 1, 0, 0, -eye_pos[0], 0, 1, 0, -eye_pos[1], 0, 0, 1,
-eye_pos[2], 0, 0, 0, 1;
view = translate * view;
return view;
}
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
Eigen::Matrix4f ml ;
ml << cos(rotation_angle),sin(rotation_angle),0,0,
-sin(rotation_angle),cos(rotation_angle),0,0,
0,0,1,0,
0,0,0,1;
// TODO: Implement this function
// Create the model matrix for rotating the triangle around the Z axis.
// Then return it.
model = ml*model;
return model;
}
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
float zNear, float zFar)
{
// Students will implement this function
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
// TODO: Implement this function
// Create the projection matrix for the given parameters.
// Then return it.
Eigen::Matrix4f pj;
pj << 1/(tan(eye_fov/2)),0,0,0,
0,aspect_ratio*(1/tan(eye_fov/2)),0,0,
0,0,-(zNear+zFar)/(zFar-zNear),-(2*zNear*zFar)/(zFar-zNear),
0,0,-1,0;
projection = pj*projection;
return projection;
}
运行
如果使用虚拟机并用 CMake 进行编译,请在终端(命令行)输入以下内容:
1 mkdir build // 创 建build文 件 夹 以 保 留 的 工 程 文 件。
2 cd build // 进 入build文 件 夹。
3 cmake .. // 通 过 提 供CMakeLists.txt文 件 的 路 径
4 // 作 为 参 数 来 运 行CMake。
5 make -j4 // 通 过make编 译 代 码, -j4 表 示 通 过4个
6 // 内 核 进 行 并 行 化 编 译。
7 ./Rasterizer // 运 行 代 码
结果: