GAMES101作业解答-作业1 旋转与投影
1. 题目要求
- 作业任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个 点 v0(2.0,0.0,−2.0),v1(0.0,2.0,−2.0),v2(−2.0,0.0,−2.0), 需要将这三个点的坐 标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中,已经提供了 draw_triangle 函数,所以你只需要去构建变换矩阵即可)。简而言之, 需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在提供 的代码框架中,我们留下了模型变换和投影变换的部分给你去完成。
2. 作业解答
- 所需环境在前面作业 0 已经介绍了,包括进行数学矩阵向量计算的 Eigen 和 openCV 库的配置。
- 要写的代码主要是在main方法里面的模型、视图、投影转换方法的实现。
# 视图转换
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{
Eigen::Matrix4f view = Eigen::Matrix4f::Identity(); # 定义 4*4 单位矩阵
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)
{
#// 初始化一个单位矩阵model
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
#// 定一个一个变换矩阵translate
Eigen::Matrix4f translate;
#// math.h定义的三角函数均采用弧度制,这里先将旋转角度转换一下
double radian = rotation_angle / 180.0 * MY_PI;
translate << cos(radian), -sin(radian), 0, 0,
sin(radian), cos(radian), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
model = translate * model;
return model;
}
# 透视投影转换
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar)
{
#// 初始化一个单位矩阵projection
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
#/* 初始化一个单位矩阵persp2ortho,其作用为将透视点映射为适合
# 进行正交投影的点*/
Eigen::Matrix4f persp2ortho = Eigen::Matrix4f::Identity();
persp2ortho << zNear, 0, 0, 0,
0, zNear, 0, 0,
0, 0, zNear + zFar, -zNear * zFar,
0, 0, 1, 0;
double halfEyeRadian = eye_fov * MY_PI / 2 / 180.0;
double top = zNear * tan(halfEyeRadian);
double bottom = -top;
double right = top * aspect_ratio;
double left = -right;
Eigen::Matrix4f orthoScale = Eigen::Matrix4f::Identity();
orthoScale << 2 / (right - left), 0, 0, 0,
0, 2 / (top - bottom), 0, 0,
0, 0, 2 / (zNear - zFar), 0,
0, 0, 0, 1;
Eigen::Matrix4f orthoTrans = Eigen::Matrix4f::Identity();
orthoTrans << 1, 0, 0, -(right + left) / 2,
0, 1, 0, -(top + bottom) / 2,
0, 0, 1, -(zNear + zFar) / 2,
0, 0, 0, 1;
Eigen::Matrix4f matrixOrtho = orthoScale * orthoTrans;
projection = matrixOrtho * persp2ortho;
return projection;
}
- 上述三种方法的实现,参照闫老师提供的课程ppt,以及网上一些解答基本上可以自己写出来,也可以理解。这里我参考了链接
- 主要解释的是在mac big sur系统下,利用cmake编译时遇到的一些问题,以及经过查阅资料解决的过程。
3. 问题
- 问题1:
开始查了很多资料,一直找不到比较好的解决办法,后来看到一个解决方法是:删除bulid目录下的CMakeCache.txt文件,然后重新编译链接即可解决。 - 问题2
这个问题较为简单,缺失头文件array,在该文件首部添加 \(#include <array>\)