homework01

把三维空间里的一个三角形,通过一套变换流程,正确显示到 2D 屏幕上。(AI)

  • 实现模型矩阵,让三角形绕z轴旋转
    输入角度,返回变换矩阵。代码如下
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();


    float rad = rotation_angle * MY_PI / 180.0f;
    float c = std::cos(rad);
    float s = std::sin(rad);
    model << c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1;
    return model;
}
  • 实现透视投影,把3d点投影到屏幕上
    输入视场角、宽高比、近平面距离、远平面距离,返回变换矩阵。代码如下
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
                                      float zNear, float zFar)
{

    Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
    float half_fov = eye_fov * MY_PI / 180.0f / 2.0f;
    float t = zNear * std::tan(half_fov);
    float r = t * aspect_ratio;

    Eigen::Matrix4f C;
    C << zNear, 0, 0, 0,
         0, zNear, 0, 0,
         0, 0, zNear + zFar, -zNear * zFar,
         0, 0, 1, 0;

    Eigen::Matrix4f B;
    B << 1, 0, 0, 0,
         0, 1, 0, 0,
         0, 0, 1, (zNear + zFar) / 2.0f,
         0, 0, 0, 1;

    Eigen::Matrix4f A;
    A << 1.0f / r, 0, 0, 0,
         0, 1.0f / t, 0, 0,
         0, 0, 2.0f / (zNear - zFar), 0,
         0, 0, 0, 1;
    projection = A * B * C;
    return projection;
}

最终实现效果如图

Photo

附加题:实现绕任意过原点的轴旋转
暂时懒得写。过