概述
目录
终端调试
透视投影
三角形倒立
代码框架理解
终端调试
在编写过程中遇到了Terminal始终只显示一条直线的问题,这个问题可能有几个方面的原因:1.矩阵书写错误 2.矩阵乘法顺序错误,但通过自己修改或者复制网上的正确代码仍然无法解决,最终解决是通过:
- 先在VSCode中进行Build,这一步会产生报错如下图所示,但我理解为完成Build过程,更新了Build文件
- 通过终端输入命令行,如下图所示,最终成功绘制出三角形
过程看起来完成了两次Build文件的更新,这里理解的不是很清晰,Cmake和make等命令行的使用理解参考了下面的文章:
Linux系统下使用cmake编译文件 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/415911935
这里补充./Rasterizer命令的功能,与主函数中部分功能相对应:
- ./Rasterizer //循环运行程序,创建一个窗口显示,且你可以使用A键和D键旋转三角形。
- ./Rasterizer −r 20 //运行程序并将三角形旋转20度,然后将结果存在output.png中
- ./Rasterizer −r 20 image.png //运行程序并将三角形旋转20度,然后将结果存在image.png中。
透视投影
图形学里面的投影矩阵也称裁剪矩阵(clip),这是因为经过投影变换后,将原本视锥体内裁剪平面以内的点转换到规范视域体(canonical view volume),而其他的点则被抛弃了
透视投影重点为如何将Frustum转变为canonical cube,通过严令琪老师的方法,首先压缩为正交投影的包围盒,再进行正交投影的过程,我们要得到的就是压缩的矩阵公式,这里课上没有听懂后学习了下面的文章,思路非常清晰
图形学基础 - 变换 - 投影 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/359128442推导出的正交投影变换和透视投影变换矩阵,都可以很容易的使用,这里放出作业中的的代码描述此过程,要注意左乘的顺序,不然同样会出现只有一条直线的问题:
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 = abs(zNear)*tan(eye_fov/2.0/180.0*MY_PI);
float b = -t;
float r = aspect_ratio * t;
float l = -r;
Matrix4f Orth_Thran,Orth_Scale;
Orth_Scale << 2/(r-l),0,0,0,
0,2/(t-b),0,0,
0,0,2/(zNear-zFar),0,
0,0,0,1;
Orth_Thran << 1,0,0,-(r+l)/2,
0,1,0,-(t+b)/2,
0,0,1,-(zNear+zFar)/2,
0,0,0,1;
Matrix4f pers;
pers << zNear,0,0,0,
0,zNear,0,0,
0,0,zNear+zFar,-zNear*zFar,
0,0,1,0;
projection = Orth_Scale*Orth_Thran*pers*projection;
return projection;
}
三角形倒立
三角形倒立是因为在main.cpp中传入的参数0.1和50为正数,而透视投影矩阵中默认zNear和zFar为负数进行计算,只需要定义int n = -zNear;int f = -zFar;即可,具体框架问题参考下面链接,对我来说现在理解有些困难:
《GAMES101》作业框架问题详解 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/509902950
代码框架理解
代码框架理解学习了别人写的一些文章,关于提高题目和细致的框架理解不想费太多工夫,大致理解即可,主要链接如下:
GAMES101-作业1详解 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/361156478(38条消息) 【GAMES101】作业1(提高)与框架理解_ycrsw的博客-CSDN博客https://blog.csdn.net/ycrsw/article/details/123834579
最终还是决定将提高部分的代码写一写,按照上面链接中的步骤顺利的写出来,main.cpp中的代码如下,其余文件中的代码省略:
Eigen::Matrix4f get_rotation(Vector3f axis,float angle)
{
double fangle = angle/180*MY_PI;
Matrix4f I,N,Rod;
Vector4f n;
RowVector4f nt;
n << axis.x(),axis.y(),axis.z(),0;
nt << axis.x(),axis.y(),axis.z(),0;
I << 1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1;
N << 0,-axis.z(),axis.y(),0,
axis.z(),0,-axis.x(),0,
-axis.y(),axis.x(),0,0,
0,0,0,1;
Rod=cos(fangle)*I + (1-cos(fangle))*n*nt + sin(fangle)*N;
Rod(3,3)=1; //这里要注意,非齐次坐标的公式应用在齐次坐标上时记得运算完成后把矩阵的右下角改为1,否则会导致图形比例错误
return Rod;
}
最后
以上就是听话时光为你收集整理的Games101 作业1终端调试透视投影 三角形倒立代码框架理解的全部内容,希望文章能够帮你解决Games101 作业1终端调试透视投影 三角形倒立代码框架理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复