GAMES101作业解答-作业1旋转与投影
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,identity matrix是什么意思
0, 0, 1, -(zNear + zFar) / 2,
0, 0, 0, 1;
Eigen::Matrix4f matrixOrtho = orthoScale * orthoTrans;
projection = matrixOrtho * persp2ortho;
return projection;
}
Processing math: 100%
上述三种⽅法的实现,参照闫⽼师提供的课程ppt,以及⽹上⼀些解答基本上可以⾃⼰写出来,也可以理解。这⾥我参考了
主要解释的是在mac big sur系统下,利⽤cmake编译时遇到的⼀些问题,以及经过查阅资料解决的过程。
3. 问题
问题1:
开始查了很多资料,⼀直不到⽐较好的解决办法,后来看到⼀个解决⽅法是:删除bulid⽬录下的⽂件,然后重新编译链接即可解决。
问题2
这个问题较为简单,缺失头⽂件array,在该⽂件⾸部添加 #include <array>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。