【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;
}

结果:

posted @   一只雷史莱姆  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示