Games101 作业1

目录

终端调试

透视投影 

三角形倒立

代码框架理解


终端调试

在编写过程中遇到了Terminal始终只显示一条直线的问题,这个问题可能有几个方面的原因:1.矩阵书写错误 2.矩阵乘法顺序错误,但通过自己修改或者复制网上的正确代码仍然无法解决,最终解决是通过:

  1. 先在VSCode中进行Build,这一步会产生报错如下图所示,但我理解为完成Build过程,更新了Build文件
  2. 通过终端输入命令行,如下图所示,最终成功绘制出三角形

过程看起来完成了两次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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值