02 2月

摄像机,透视,镜头畸变

作者:will 网址:http://ymuhua.com/2016/02/02/camera/

我们之前的渲染都是基于正交视图,是没有透视关系,何为透视,透视更符合我们平时眼睛观察,近大远小就是我们观察这个世界事物最常见的。所以我们需要在三维场景中也要实现这个效果。

在计算机图形学,我们知道所有的三维模型场景从显示器中显示出来都需要进行3d到2d的投射转换。所以我们需要一个观察屏幕view plane,也称为画布,而摄像机是一个观察点,通过这个摄像机观察点射出光线,然后打到模型,然后在这些光线的路径上我们放上一个画布view plane如果光线遇到模型,那么我们就会在屏幕上留下一个印记,然后,屏幕上就能显示出一个模型了。

persperct

那么透视是怎么产生的呢?我们用张图来解释。

perspect2

a图是透视的结果,b图是我们从一个顶视图俯瞰,小黄点是摄像机,虚线是光线,然后虚线和黑实线(view plane)相交的点就是在屏幕上所成图像的由来了。

这个也同样。

perspect3

 

知道了透视关系后,我们的摄像机作为透视的重要工具需要哪些属性呢。

观察屏幕:长,宽,分辨率,在《渲染第一张图片》已讲。

焦距:摄像机距离画布的距离(view plane)。如下图的d来表示

focallengthfocal

如上图,我们发现在保持摄像机相对物体位置不变,和画布大小不变的情况下,摄像机的焦距(d)越大,可视范围就越小。这个玩过摄影的人都知道,焦距越小,它的捕捉场景的范围反而越大,这个和相机的原理是相似的。因为你的感光器就是你的画布,而你的感光器的大小对于一台相机来说是定死。

摄像机的位置,方向:方便入门,我们将摄像机放在原点位置,方向是朝着z轴方向。那么画布也垂直于z轴。

这是摄像机类定义:

camera

这个是houdini中摄像机的关系图

spherecam

那么我们如何来确定从摄像机射出的光线方向呢,对比上面两张图,左图是正交试图的光线,右图是透视射出的光线,发现区别了吧。

左图的光线的方向永远是ray.dir=(0,0,1)。

但是右图的光绪需要将每个画布上的像素中心点减去摄像机的坐标,就能确定一个方向(向量位置相减)。viewplane

还记得这张图吗,我们是用来求每个像素中心点是用到的,假定现在的摄像机在坐标原点(0,0,0)。光线的方向公式:camdir

s:每个像素的size大小,pixel_size=Aperture/Hres(前一章介绍)

c,r: 当前长,宽,第几个宽像素。

d: 摄像机的方向,是指向z轴。

那么,很简单,我们的代码只需要改两句话。

下面是三张不同焦距的渲染一堆球。

f10

焦距:10

f50

焦距:50

f200

焦距:200

这个结果和之前分析的是一样的。焦距越大可视范围反而越小。同时我们发现在焦距等于10的情况下。圆球变成了椭圆形,尤其是图片边缘的球越发明显,我们称之为镜头畸变。

镜头畸变

镜头畸变是怎么产生的呢?请看下图。

distortion

引起透视变形的原因就是我们的画布(view plane)是平的。那为什么我们人眼没有透视畸变呢,就是因为人的眼球是个圆球。从上图可以发现,当焦距非常小的时候,可视范围是非常大。只有在z轴上的物体保持的是圆形,离开z轴越远,球失圆就越严重。所以照相机的鱼眼镜头镜片非常的凸就是为了避免镜头畸变的原因了。

转载请注明作者和出处,谢谢。http://ymuhua.com/2016/02/02/camera/

发表评论

电子邮件地址不会被公开。