首先我们看作业1的要求:
Eigen::Matrix4f get_model_matrixws(float rotation_angle)
{
Eigen::Matrix4f rotation;
float angle = rotation_angle;
angle = angle * MY_PI / 180.f; //角度转弧度
rotation << cos(angle),-sin(angle),0,0, //绕z的旋转矩阵
sin(angle),cos(angle),0,0,
0,0,1,0,
0,0,0,1;
Eigen::Matrix4f translate = Eigen::Matrix4f::Identity();
return translate * rotation; //输出
}
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
float zNear, float zFar)
{
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
Eigen::Matrix4f M_p = Eigen::Matrix4f::Identity();//这个是投影转正交矩阵
M_p << zNear,0,0,0,
0,zNear,0,0,
0,0,zNear+zFar,(-1.0*zNear*zFar),
0,0,1,0;
//[l,r] [b,t] [f,n]
float angle = eye_fov*MY_PI/180; //求角度
float t = tan(angle/2)*-zNear; //更具直角三角形性质求tb(高)
float b = -1.0*t;
float r = t*aspect_ratio; //根据宽高比求(宽)
float l = -1.0*r;
Eigen::Matrix4f M_s = Eigen::Matrix4f::Identity(); //这个是将立方体进行规范化(-1,1)
M_s << 2/(r-l),0,0,0,
0,2/(t-b),0,0,
0,0,2/(zNear-zFar),0,
0,0,0,1;
Eigen::Matrix4f M_t = Eigen::Matrix4f::Identity(); //这里是将三角形位移到原点
M_t << 1,0,0,(-1.0)*(r+l)/2,
0,1,0,(-1.0)*(t+b)/2,
0,0,1,(-1.0)*(zNear+zFar)/2,
0,0,0,1;
projection = M_s*M_t*M_p*projection; //这里是左乘所以是先进行透视转正交,然后位移,然后规范化
//projection = projection*M_p*M_t*M_s;
return projection;
}
实验结果验证:
摁下a键的时候也有随之进行旋转,证明两个函数都没有错
//拔高训练个人思路1,我们做多次模型变化(绕z,绕x,绕y)反别进行旋转,
开始个人没想那么多所以直接单独认为三个方向旋转可以理解为三个方向分别旋转得出结果
目前遇到问题
如果对模型进行三次,他就会直接越界,就表明他是类似添加的机制调用三次,就会添加三个,但是实际上他只有一个四维矩阵所以出现越界
太晚了,明天再想着解决这个问题。
最后做一个说明,因为博主自己本人也是初次学习,人也比较垃圾,所以不是很懂,作业有看过别人是怎么写的,为啥这么写,这也能够,让我对之有一个正确的理解
比如有一个博主再写模型变化的时候,他添加了一个放大矩阵,让三角形更大,他放大了几倍,但是我也放大之后发现三角形三个顶点已经出去界面了,因此我分析得出他在透视投影犯了一个错误,就是他把矩阵相乘顺序写错了,导致绘制的模型很小,这里前面博主也碰到了,所以看到1他放大我就能明白他是为啥这么做,这一次作业收获的是:这是第一次通过作业来校验自己课程知识吸收了吗,以及第一次编程(图形学),能不能够吧学的知识运用到实际编程里面。慢慢来吧,亡羊补牢为时未完。