阿昌学习《RayTraing in one week》 (十)
第十章
主要是对摄像机的一些操作,叫做:可定位摄像机。书里说这里调试也比较麻烦,我感觉是真的挺麻烦的。
首先,让我们有一个可调整的视野fov,作者之前使用的画布图像不是一个正方形,所以垂直和水平的fov值是不同的,作者喜欢垂直方向的fov,我也一样的使用了垂直方向,但是还是保留了我自己的输出正方形的图。

首先,我的射线是从原点发射,射到z=-1的平面(原作者说-1 -2 都行),那么图中很明显就能得到h=tan(θ/2),有了公式就很容易得到相机模型了,那就改写一下摄像机:

额外加一下π的值:

当然哈 主函数也要改:
主函数这边我还是沿用了自己的200*200

书里正常应该是输出90度类似广角的长画面,我这里是一个正方形的,小伙伴也可以使用其他的比例来看,输出结果:

现在摄像机可以调整视角了,接下来我们将摄像机位置也变化一下。
首先书中定义了摄像机的位置叫lookfrom,看向的点叫lookat。

这里他加了一个比喻,就是说你站直了,你的头还是可以左右转动的:

我们实际上可以使用任何我们想要的向上的向量,简单的把他投射到这个平面上得到一个向上的向量,所以就得到了vup,通过叉乘计算,就可以得到一个完整的蒸饺(u,v,w)。这里我建议小伙伴自己画一下图,真的很有必要,画出来就知道vup和uvw的关系了。
接下来就是修改代码了:

回到main函数,用上一章的那几个球:

我给出自己的输出的图:

多跑几个配置的图也可以看看,我这里就不多跑其它的图了。关于摄像机还剩最后一个部分 —— 景深(直译是聚焦模糊)。