简介
这是笔者在浙江大学读研阶段选修的由冯结青教授和王锐教授所授的计算机图形学的大作业之一,Monte Carlo Ray Tracing(蒙特卡洛光线追踪)的实现。此次作业对笔者是一次从所未有的挑战,前前后后笔者耗费了一个半月时间。其中第一版用了将近一个月的时间,但是很可惜最后结果炸了,而且找不到原因。然后笔者把这个作业放下了一段时间,并去接了一个锅。等到快放假的时候再捡起了这个作业开始重写,并且很幸运的赶在了除夕之前写完了。以下就是笔者的感想,该作业的说明文档,以及全部工程和附属说明文件的百度云链接。
感想
这次作业对于笔者最大的困难其实并不在于算法,虽然从底层开始实现确实非常复杂。等到年后写这篇博客的时候基本已经忘干净了,么什多抖动抽样,什么几何求交早已记不清了。所以笔者认为这个作业对自己受益最大的还是在工程方面。笔者使用过不少框架,但是从底层开始写这么复杂的工程还是第一次,类之间的相互引用和类方法之间相互调用曾让笔者一度陷入混乱。笔者也是极少自己写此等规模的继承、工厂和容器等,记得上一次是在两年前写游戏开发的作业时写过一些继承和虚类。在代码实现过程中笔者也犯了很多的错误,但是很多最后没有心情改了,这里总结一下笔者的一些错误和心得:
- 封装、继承、多态是很有用的,但是有时会很难驾驭,尤其是后两者
- 构造函数不需要排列组合式的一一实现,可以用set方法替代
- 不是所有成员都要有set函数,有些成员是用成员方法计算出来的 如 GeometricObject 中的 Normal
- 同一模块开发宜尽快完成,前后时间跨度长,容易导致子类父类同一方法 名字不一样 如笔者程序中的 get_normal 和 compute_normal
- 前期规划要慎重,不然会写很多没用的方法,耗时间,容易出错
- public、protect、private前期同样要规划好,笔者后期就乱了,几乎全部改为了public
- 内联函数最好控制一下代码行数,不是所有运算符重载都适合写成内敛的形式
- 容器类的使用可以减少很多重复的运算
- 开发过程中就要及时写详细的注释,不然过一会就看不懂了,最后补注释的时候都是泪
除此之外,笔者记得的就只有那段时间写作业的煎熬,都不知道自己写的每一步是对的还是错的,这个不同于业务逻辑每一步都有确定的结果,所以只能小心翼翼的写,生怕写到最后一运行又炸了。
说明文档
百度云盘链接
笔者把自己的代码无偿提供给大家,希望和大家相互学习,如果链接失效了可以联系笔者1链接:https://pan.baidu.com/s/1kW4Z0dL 密码:gwor
感谢您的阅读!