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,
            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>\)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM