作业简介
本次作业的内容主要是构建模型变换矩阵和透视投影矩阵,提高部分实现一个可以绕过原点的任意轴旋转的变换矩阵(基础部分实现的模型变换矩阵只能实现绕x,y,z轴旋转)。
作业代码
模型变换矩阵:
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.
model << cos(rotation_angle/180.0*MY_PI),-1.0 * sin(rotation_angle/180.0*MY_PI),0,0,
sin(rotation_angle/180.0*MY_PI),cos(rotation_angle/180.0*MY_PI),0,0,
0,0,1,0,
0,0,0,1;
return model;
}
透视投影矩阵:
参数 | 含义 |
---|---|
eye_fov | 垂直可视角 |
aspect_ratio | 宽高比 |
zNear | 距离 Camera 较近的边界 |
zFar | 距离 Camera 较远的边界 |
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.
float t = zNear * tan(eye_fov/2.0/180.0*MY_PI);
float b = -t;
float r = aspect_ratio * t;
float l = -r;
Eigen::Matrix4f Mtranslate;
Mtranslate << 1,0,0,-(l+r)/2,
0,1,0,-(t+b)/2,
0,0,1,-(zNear+zFar)/2,
0,0,0,1;
Eigen::Matrix4f Mscale;
Mscale << 2/(r-l),0,0,0,
0,2/(t-b),0,0,
0,0,2/(zNear-zFar),0,
0,0,0,1;
Eigen::Matrix4f Mprep;
Mprep << zNear,0,0,0,
0,zNear,0,0,
0,0,zNear+zFar,-1.0 * zNear * zFar,
0,0,1,0;
projection = Mtranslate * Mscale * Mprep;
return projection;
}
提高部分
主要是通过课上的公式实现,将值计算出来一个一个带入就好。公式中α为要旋转的角度,n为所要绕的轴(默认过原点)。
运行结果
按住a或者d可以左右旋转图像。