games101-作业
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;
}
最终实现效果如图

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