GAMES101 作业1 ——绘制三角形

举报
lutianfei 发表于 2022/05/05 15:42:50 2022/05/05
【摘要】 作业描述本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个 点v0(2.0,0.0,−2.0),v1(0.0,2.0,−2.0),v2(−2.0,0.0,−2.0),你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中,我们已经提供了 draw_triangle 函数,所以你只需要去构建变换矩阵即可)。简而言之, 我们需要进行模型、视图、投影、...

作业描述
本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个 点
v0(2.0,0.0,−2.0),
v1(0.0,2.0,−2.0),
v2(−2.0,0.0,−2.0),
你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中,我们已经提供了 draw_triangle 函数,所以你只需要去构建变换矩阵即可)。简而言之, 我们需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在提供的代码框架中,我们留下了模型变换和投影变换的部分给你去完成。

模型矩阵:

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.
    Eigen::Matrix4f rotate(4, 4);
    float theta = rotation_angle / 180.0 * MY_PI;

    rotate << cos(theta), -1.0 * sin(theta), 0, 0,
            sin(theta), cos(theta), 0, 0,
            0, 0, 1, 0,
            0, 0, 0, 1;

    model = rotate * model;

    //TODO 直接model = rotate 不可以吗? 为什么还要乘一下?

    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 M_persp2ortho(4, 4);
    Eigen::Matrix4f M_ortho_scale(4, 4);
    Eigen::Matrix4f M_ortho_trans(4, 4);

    float angle = eye_fov * MY_PI / 180.0;

    auto t = zNear * tan(angle / 2); //上截面
    auto r = t * aspect_ratio; //右截面
    auto l = -r; //左截面
    auto b = -t; //下截面

    //step1. 透视投影挤压成正交投影
    M_persp2ortho << zNear, 0, 0, 0,
            0, zNear, 0, 0,
            0, 0, zNear + zFar, -zNear * zFar,
            0, 0, 1, 0;

    //step2. 正交矩阵归一化缩放
    M_ortho_scale << 2 / (r - l), 0, 0, 0,
            0, 2 / (t - b), 0, 0,
            0, 0, 2 / (zNear - zFar), 0,
            0, 0, 0, 1;

    //step3. 正交矩阵平移
    M_ortho_trans << 1, 0, 0, -(r + l) / 2,
            0, 1, 0, -(t + b) / 2,
            0, 0, 1, -(zNear + zFar) / 2,
            0, 0, 0, 1;

    projection = M_ortho_scale * M_ortho_trans * M_persp2ortho * projection;

    return projection;
}

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。