到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的

对象。所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了。在

接下来的三次作业中,我们将要求你去模拟一个基于 CPU 的光栅化渲染器的简

化版本。

作业要求

  • 填写完善代码中旋转矩阵
  • 填写完善代码中透视矩阵

程序运行

mkdir build // 创 建build文 件 夹 以 保 留 的 工 程 文 件。
cd build // 进 入build文 件 夹。
cmake ..  // 通 过 提 供CMakeLists.txt文 件 的 路 径
           // 作 为 参 数 来 运 行CMake。
make j4    // 通 过make编 译 代 码, j4 表 示 通 过
           // 4个 内 核 进 行 并 行 化 编 译。
./Rasterizer // 运 行 代 码。

后续作业编译过程大体相同,运行代码处可能有不同

如果想深入了解Cmake相关知识,请查阅相关资料

预期结果

如果你能正确的填写出对应矩阵,那么你应该可以得到这样的结果

图片

具体实现

绕z轴旋转的实现

Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
model<<
cos(rotation_angle),-sin(rotation_angle),0,0,
sin(rotation_angle),cos(rotation_angle),0,0,
0,0,1,0,
0,0,0,1;

// TODO: Implement this function
// Create the model matrix for rotating the triangle around the Z axis.
// Then return it.

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();

float r,l,t,b;
t = tan(eye_fov/2)*zNear;
b = tan(eye_fov/2)*zFar;
r = t*aspect_ratio;
l = b*aspect_ratio;

/*
projection<<    zNear,0,0,0,
              0,zNear,0,0,
              0,0,zNear,(-zNear)*zFar,
              0,0,0,1;
            //translator
*/
projection<<   zNear/r,0,0,0,
              0,zNear/t,0,0,
              0,0,(zNear+zFar)/(zNear-zFar),(-2*zNear*zFar)/zNear-zFar,
              0,0,1,0;
// TODO: Implement this function
// Create the projection matrix for the given parameters.
// Then return it.

return projection;
}

可能遇到的问题

  • 我们从数学上的定义可以得知

    l -r=0
    f - b = 0

    通过这样的操作,我们就可以对矩阵的运算进行一定的简化