【GAMES101】作业1——旋转变换与投影变换
题目:
本次作业是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要将这三个点的坐
标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形。所需完成函数:
1.get_model_matrix(float rotation_angle): 逐个元素地构建模型变换矩阵并返回该矩阵。在此函数中,需要实现三维中绕 z 轴旋转的变换矩阵。
2.get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar): 使用给定的参数逐个元素地构建透视投影矩阵并返回该矩阵。
知识点回顾:
1.三维空间绕轴旋转的变换矩阵
2.1构建透视投影矩阵
M_persp=M_ortho*M_persp->ortho
其中:
2.2利用forY和aspect(长宽比)计算r,l,t,b
题解:
1.实现get_model_matrix旋转变换
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();//用单位矩阵初始化
// TODO: Implement this function
// Create the model matrix for rotating the triangle around the Z axis.
// Then return it.
float theta = rotation_angle / 180.0 * MY_PI;
Eigen::Matrix4f rotation;
rotation << cos(theta), -sin(theta), 0.0, 0.0,
sin(theta), cos(theta), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0;
model = rotation * model;
return model;
}
2.实现get_projection_matrix投影变换
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
float zNear, float zFar)
{
// Students will implement this function
// TODO: Implement this function
// Create the projection matrix for the given parameters.
// Then return it.
//eye_fov为前面公式中的forY aspect_ratio为aspect zNear为n zFar为f
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();//用单位矩阵初始化
//M_persp->othro矩阵 zNear为n zFar为f
Eigen::Matrix4f Mpersportho;
Mpersportho << zNear, 0.0, 0.0, 0.0,
0.0, zNear, 0.0, 0.0,
0.0, 0.0, zNear + zFar, -zNear * zFar,
0.0, 0.0, 1.0, 0.0;
//计算M-ortho矩阵前先计算r,l,t,b
float t = std::tan(eye_fov / 2.0/180.0*MY_PI) * zNear;
float r = t * aspect_ratio;
float b = -t;
float l = -r;
//计算M_ortho矩阵 先缩放至长度为2的立方体再将其中心点平移至原点
Eigen::Matrix4f ortho1;
ortho1 << 2 / (r - l), 0, 0, 0,
0, 2 / (t - b), 0, 0,
0, 0, 2 / (zNear - zFar), 0,
0, 0, 0, 1;
Eigen::Matrix4f ortho2;
ortho2 << 1, 0, 0, (-1)* (r + l) / 2,
0, 1, 0, (-1)* (t + b) / 2,
0, 0, 1, (-1)* (zNear + zFar) / 2,
0, 0, 0, 1;
Eigen::Matrix4f Mortho = ortho1 * ortho2;
projection = Mortho * Mpersportho;
return projection;
}
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!