chapter 10:可定位相机
文章翻译
相机和电解质一样,都很难解决出现的错误,因此我总是逐渐的开发我的代码。首先,让我们允许一个可调整的视角( fov ),这是你从观察点所看到的角度。因为我们的图片不是正方形,因此水平和垂直的视角是不一样的,我总是使用垂直视角。我也经常用度数来定义它,并在构造函数中改变弧度 —— 这是个人风格问题。
我首先让光线保持从原点出发射向z轴-1位置的屏幕,我们也可以让屏幕在z轴-2位置或者其它地方,只要我们让 h 和这个距离成正比,下面是我们的步骤:
这表明 ***h = tan(theta/2)***,我们的相机现在变成了:
声明 camera cam(90, float(nx)/float(ny)) ,以及以下这些球类:
我们得到图片:
有一个武断的想法,给我们关心的点起一个名字,我们将放置相机的位置称为 lookfrom,将我们看向的点称为 lookat(过后,如果你想,你可以定义一个看的方向来替代看向的点)
我们还需要一种方法来指定相机的滚动或侧面倾斜,绕着 look-lookfrom 轴来旋转。另一个思考的方法是,即使你保持 lookat 和 lookfrom 为常量,你仍然可以让你的头围绕着你的鼻子旋转,现在我们需要的方法是为相机定义一个 up vector. 请注意,在屏幕中我们已经有一个 up vector,这个屏幕和视线正交。
实际上,只要我们想,我们可以使用任意的 up vector,并简单的将其投影到这个屏幕上,为相机得到一个 up vector。我使用普遍传统的方式来命名一个 “view up” (vup) vector ,通过一组差积(cross),我们现在有一组完全正交基(u,v,w)来描述我们相机的朝向。
记住 vup,v,w 都在一个相同的屏幕,注意,像之前我们的固定摄像头面向 -z,我们的任意视图摄像头面向 -w。我们可以将其记在心里,但是没有必要,可以使用 world up (0,1,0) 来定义 vup。这是方便的,将自然的让你的相机保持水平,直到你决定体验一下疯狂的相机角度。
这允许我们改变视点:
得到图片:
我们可以改变视场来得到: