第 2 章 匹配静止的镜头
2.1 教程:静帧透视匹配
2.1.1 收集场景数据
2.1.2 设置摄像机
2.1.3 添加环境几何体
2.1.4 创建摄影机系统
2.2 教程:使用摄影机贴图模拟镜头运动
2.1 教程:静帧透视匹配
现在你应该知道了运动匹配是如何在一个项目中进行的,接下来我们将实际地处理一个镜头。在这个教程里,你要创建一个简单的运动匹配场景,并解决许多CG艺术家曾经面临过的一个问题:透视匹配。
也许运动匹配最简单的形式就是匹配一张静帧(或者是固定镜头)的透视了。通常,这被用在那些充当背景的3D元素上。因为摄影机没有运动,所以需要做的就是配置摄影机与物体的相对位置,让模型的透视看起来正确无误。即使如此,不断的尝试和匹配物体也会是让人倍感挫折的。通常我们需要尽可能地获取一些必要的信息,以便快速而准确地完成匹配的工作。这些信息包括:
- 用来拍摄固定镜头的摄影机的焦距。
- 当画面被拍摄时摄影机的高度。
- 在真实场景中,从摄影机到物体的距离。
- 场景中物体的大小。
在理想的状态下,拍摄镜头的人应该提供以上所有这些信息,但是在大多数时候,这只能是妄想了。在这个教程中,你需要名为perspective.jpg这张图片,它位于光盘目录下tutorial_files\Chapter_02\sceneassets\images子目录里(如图2.1.1所示)。考虑到这个教程的目的,我们假设一个最糟糕的情况:没有任何关于拍摄这张图像的摄影机和环境的信息。处理这种情况的最好的方式是系统性地逼近问题。通过仔细地评估并构建一个跟真实世界场景相似的3D场景,我们就可以在解算中不断进行校正,最终获得一个理想的匹配结果。
2.1.1 收集场景数据
现在先让我们仔细看看这张图像,我们需要为动画师提供一个与之匹配的摄影机和场景,想想我们能从中获取哪些信息。
(1)焦距。
单靠这一张图像很难指出摄影机的焦距是多少。对于一张静帧而言,摄影机的焦距并不需要非常准确,只要能估计出大致的范围即可,广角(焦距小于35mm)?长焦(焦距大于50mm)?还是一般的正常焦距(焦距在35-50mm)?对此,有两个方面的内容可以帮助你进行判断:镜头畸变和景别。
镜头畸变是光线在进入镜头时,由于镜片厚度的差异,由边缘进入的光线向内发生扭曲的现象(如图2.1.2所示)。镜头的焦距越小,镜片中心和边缘的厚度差异越大,镜头畸变就越严重。所以广角镜头一般都有较明显的镜头畸变,相对的长焦镜头几乎看不出有镜头畸变,但长焦镜头的画面会有很强的距离压缩感。
镜头的焦距不同,在同一个地点所能纳入的影像范围也不一样。导演根据剧情需要,选用不同的镜头来表现不同的画面。广角镜的成像范围广,多用于表现全景,强调场景的宏大、开阔。正常焦距的画面跟人眼的视觉范围相近,一般用在中近景,用于事件的陈述。而长焦镜多用于特写镜头,尤其是场景限制,无法近距离拍摄的情况。
就本例而言,看不出有明显的镜头畸变,景别为中近景,因此我们先猜测镜头焦距为标准的35mm,然后看情况再进行调整。
(2)测量数据。
本例中我们得不到任何测量数据,但是有一些生活常识可供参考。这是一个仰视的镜头,考虑到电线杆上广告牌的一般高度,这个镜头很可能是一个人站在地面上拍摄的。也就是说摄影机的离地高度不应该超过2m。
(3)地平线的位置。
大多数的图像都反映出了地平线的位置,从透视学上说就是水平点所在的线。从地平线的位置上,我们能得到摄影机的一个很重要的信息:它在x、y轴向上的旋转属性。摄影机沿x轴旋转,画面会有仰俯变化,即地平线在画面中的升降;摄影机沿y轴旋转,画面会有倾斜变化,即地平线在画面中左右倾斜,考虑到视觉的稳定性,一般地平线都是水平的。本例中很明显地平线几乎位于画面中央,那么摄影机应该是平视(如图2.1.3所示)。
(4)距离。
关于建筑离摄影机的距离和建筑自身的比例数据,我们都没有。如果能获得这些建筑的蓝图或是模型,那么我们可以做一些实际测量。当然现在只能做一些大致的估计了。
2.1.2 设置摄像机
对于运动匹配的工作而言,整个过程并不是线性的。通常这是一个跳跃式的进程,我们先做一些工作获取一个粗略的结果,然后基于一些确定的事实来处理细节,并逐步完善它,直到我们让匹配的工作达到所需的精度。这是一般的工作流程,下面我们将通过一些步骤来实现建筑和道路的透视匹配。
(1)评估场景。
因为我们要处理的是一个固定镜头,所以关键是匹配图像的透视,并指出建筑和道路的相对位置。现在假设我们需要在右侧前景马路的空地上停上一辆车,并在路面留下阴影。要做到这一点,我们需要知道摄影机的位置和马路的位置。
(2)建立一个摄影机,并使用这张静帧作为背景图像。
首先我们需要一个自由摄影机来开始工作(注意不是目标摄影机)。因为最终的目的是让物体和镜头对齐,我们将需要设置摄影机或环境,这样当我们从摄影机来观察时,图像将出现在3D物体背后作为背景。打开3ds Max2009,设置好项目文件夹的位置,然后按“Alt+B”调出背景设置窗口,将perspective_match.jpg设置为背景图像。然后按“F10”,在渲染设置窗口中将分辨率设置为720×576,然后在原点建立一个Free Camera自由摄影机,并将系统单位设置为“米”。你也可以打开配套光盘目录tutorial_files\Chapter_02\scenes下的pespective_match_start.max文件(如图2.1.4所示)。
你会看到一个标准的35mm摄影机,位置在原点上,摄影机背景已经设置好了。
提示:3ds Max2009具有项目管理能力,这样能保证文件所关联的贴图、视频等处在正确的位置。请在开始制作前,在3ds Max2009中将项目文件夹设置到tutorial_files目录下相应的章节目录上。例如,现在你需要使用第一章的max文件,先将项目文件夹设置为tutorial_files\Chapter_02(如图2.1.5所示)。
(3)估计摄影机的焦距。
我们在进行摄影机设置时需要知道的主要的两件事就是焦距和光圈。正如之前所言,我们不知道这个镜头的确切数值,因此我们需要去猜。作为起点,我先假定这个是35mm的镜头。
(4)估计胶片背板(film back)。
本例中,我不知道胶片背板的具体值,如果你知道摄影机的品牌型号,可以在网上搜索这些值。如果你不知道胶片背板,你最好设置成标准值0.980″×0.735″或是使用你的动画软件的默认值。因为这些值比较复杂,所以我将在第6章中解释,而现在我们使用这个值来进行工作。
(5)设置摄影机的高度。
之前已经提到,这是我们最能够推定的值。我们给这个摄影机假定一个平均高度,大约离地1.75m,因此我们把摄影机放置到z轴1.75m的地方。
(6)设置摄影机的仰角。
我们之前已经找出了地平线的位置,现在我们要设置摄影机在x轴上的旋转角度,以便匹配地平线的位置。在3ds Max中选中摄影机,在命令面板的摄影机属性中,勾选“Show Horizon(显示水平线)”。在摄影机视图中,你应该能看到一条黑色的水平线(如图2.1.6所示)。如果你没有看到这条黑线,那么请检查你的摄影机,它的位置应该处于水平面以上,即z坐标大于0,另外看看它的x轴的旋转值,是否是俯仰过头了。然后,调整摄影机旋转属性的x值,使图中的黑线与我们之前找到的地平线的位置对齐。本例中,摄影机旋转属性的x值约为89.7。
2.1.3 添加环境几何体
现在我们已经有一个设置过的摄影机了,我们需要开始将几何体充实到场景中。当动画师准备好要将汽车放到马路上时,他们将需要知道这条道路究竟在哪儿。测定场景中物体位置的这个任务就落到运动匹配师肩上了。这个几何体需要精确地与图像匹配,这样任何被添加到场景中的附加物体能出现在正确的位置上。你通常不必为整个场景构建模型,只需要创建那些会与CG物体直接交互的东西,以便动画师能进行对位,如本例中的路面。
为场景创建几何体与之前的摄影机设置是相互关联的,因为物体在画面中的表现跟这两个因素都有关系。所以你需要不断调整摄影机和几何体,直到它们都被校正到正确的位置。不过一旦你建好了一两个物体,那么要创建剩下的物体将变得非常容易,因为你已经构建起了基本的空间关系。同样的,一旦你建好了物体,你会发现此时要找到摄影机的准确位置会容易得多。
(1)创建一个道路和建筑。
从这里开始事情变得复杂了,因为我们获取的信息非常少。我们需要观察环境,通过识别日常物体的大小来估计建筑的大小。每层楼大概有4m高,总共有6层,这样整个楼高应该在24m左右,宽度约16m。同样,我试着使用视觉上的线索来估计道路的宽度,这是一个8车道的主干道,每条车道约4m宽,这样整个路面应该有32m宽。
在3ds Max中新建一个plane(平面),命名为road,用于模拟路面,属性如图2.1.7所示。参考背景图片,将其空间位置设置为(21,55,0)。
然后新建一个box(方块),命名为building,模拟深黄色的建筑,属性如图2.1.8所示。
(2)移动建筑到一个大致的距离。
这可能是最难估计的值了。没有太多的线索来了解拍摄者离建筑有多远,因此我需要猜测一下这段距离会是多少。不过有了道路作参考,先将建筑的模型移动到道路的另一侧,空间位置为(52,92,0),这样基本的布局就出来了(如图2.1.9所示)。
(3)调整摄影机角度,使物体的转角与图像中建筑的转角对齐。
现在我们的摄影机只是进行了粗略的设置,我们可以开始对齐物体的工作了。比起不断随机尝试一次匹配好整个物体,先试着将模型上的一个点对齐并锁定到图片的特征上要容易得多。这将在3D场景和2D场景之间创建一个共同点,并获得一个基础来构建更好的匹配(如图2.1.10所示)。
如果物体的透视和比例不对,请不要担心,现在只需要关注3D建筑的一角,让它和图像中建筑的一角对齐。这里的意图是在CG物体和真实世界场景之间找一个共同点。如果我们能对每个角都正确地对齐,那么我们就能以此为基础来对齐剩下的场景。现在我们假定摄影机的高度和距离是正确的,因此我们不想移动模型。本例中,我简单地旋转了下摄影机,并调整摄影机在水平面上的位置,直到右上角的点与图像排列在一起。
2.1.4 创建摄影机系统
现在我们要在3D软件中创建摄影机系统(camera rig)。一个摄影机系统在概念上,跟现实生活中的摄影机系统类似,例如吊杆、悬臂之类的。它能在场景中更方便地移动摄影机。这些系统究竟如何构建,在不同的软件里各不一样,但是它们通常都包含一个或多个虚拟物体(或简单的非渲染物体),以及与之成组(grouping)或父子链接的摄影机,这样摄影机可以围绕不同的轴点进行移动。
本例中,我们已经将CG建筑与图像中大楼的一角对齐了,因此在这两者间建立了联系。我们希望在保持这个对齐的状态下移动摄影机,所以我们将创建一个摄影机系统来实现这一点。下面是创建并放置摄影机系统的具体步骤。
(1)为这个系统创建一个父物体。
在场景中创建一个Point帮助物体,并将其命名为CameraRigs。使用捕捉,将point放置到我们在之前章节排列好的3D建筑的右上角的位置,如图2.1.11所示。
(2)将摄影机父子链接到虚拟物体CameraRigs上(如图2.1.12所示)。
注意在链接过程中,保持摄影机待在原来的位置(不要捕捉到point的位置上去了)。
(3)使用摄影机系统来旋转摄影机到合适位置。
我们现在可以旋转摄影机系统的虚拟物体来重新定位摄影机,并试着匹配图像的透视。我们只沿着y轴旋转它,因为我们最有力的数据现实照片是在街道上拍摄的,所以我们要建立这种关系。如果沿着其他轴向旋转系统,这会升高或降低摄影机与地面的距离,这将与我们所采用的信息不符。
如果沿y轴旋转摄影机系统之后,建筑仍然没有对齐,你也许不得不调整下摄影机的旋转。这将导致建筑的一角与图像上楼顶的一角分离,因此你需要重新放置它。你也许不得不在旋转系统的y轴和旋转摄影机之间反复几次,以便获得更好的透视(如图2.1.13所示)。
摄影机系统给你更多的自由来控制如何放置摄影机。你将在运动匹配的过程中频繁地使用它们,而它们也确实可以帮你少受挫折。
至此,我们一直在使用渐进法来处理摄影机和建筑。现在我们有了所需的所有东西来更贴近地进行运动匹配,寻找摄影机准确的设置以及建筑正确的大小和形态。在这个阶段,我们要试着将场景完美地对齐。
(1)焦距是否正确?
现在摄影机只是概略地进行了放置,我们可以做一些实验来看看它的焦距是否正确。焦距猜测起来会有一些困难,但镜头焦距越小,画面所能容纳的东西就越多。下面3幅分别是15mm、35mm、80mm镜头所呈现的画面(如图2.1.14所示)。注意其中两根红线的变化,镜头焦距越小,两根线越向内缩。
在不断的尝试之后,最终确定镜头焦距为28mm。你也许需要据此对建筑的位置做一些调整。你最好将这个与调整焦距一起进行,因为这两者都会导致相似的结果,会让建筑在图像中看起来更大一些或更小一些。
(2)调整建筑的大小。
现在建筑的大小不是很正确,这有可能是我们之前所猜想的建筑大小与实际有误差所致。所以我们需要调整一下各个方向的尺度以便和图像匹配得更好。当你缩放建筑的时候,你应该以底部的面为轴心进行缩放,这样它的底部将保持在地面上,只有上部会发生变化。如果你从几何中心进行缩放,它将变得更难控制。在大多数软件里,你可以通过移动物体的轴心点到底部来进行缩放(如图2.1.15所示)。
(3)继续调整摄影机的旋转、组的旋转以及物体的位置,直到获得合适的结果。
此时仅仅需要对摄影机或建筑进行细微的调整。创建摄影机系统的一个好处是它给你更多的自由度,同时又不失准确性。摄影机系统的帮助物体允许你围绕CG建筑旋转摄影机到不同的位置。借助于确立地平线的位置,实际上我们已经确定了摄影机在x轴和y轴的旋转值,所以我们只需要让它绕z轴旋转即可。如果你需要调整摄影机的距离,你可以沿着x轴和y轴移动摄影机。
(4)放置第二栋建筑。
一旦我们解决了摄影机和第一栋建筑的位置,那么第二栋建筑的放置工作就很容易了。从图片中我们可以看出,它们的正面是平行的,因此我们可以简单地复制现有的建筑,然后沿着x轴和y轴移动,直到3D物体的右侧边线与图像中建筑的右边线相吻合。接着,我们向上滑动模型直到边角都对齐了,然后缩放CG建筑到合适的大小完成匹配(如图2.1.16所示)。
放置完这两栋建筑,你已经可以提交一个有着正确摄影机的场景了,并且它包含了充足的信息来展示给动画师或技术导演,告诉他们CG物体需要放到哪儿。如果我们要在道路上添加一辆跑车从镜头前飞驰而过,如图2.1.17所示的那样,我们建造的CG道路可以指示要把它放到哪儿。光盘目录tutorial_files\Chapter_02\scenes下的pespective_match_finish.max文件是最终完成的匹配文件。对于场景中那些用来制作反射、阴影或其他效果的东西,这些物体同样能发挥作用。光盘目录下tutorial_files\Chapter_02\runderoutput\run.mov文件是测试渲染的视频文件,你可以看到透视匹配的一个最终结果。
相信你现在应该了解了,运动匹配并不是一个完全盲目瞎猜的过程。它是建立在已经掌握的信息的基础上的,你可以推断那些你不知道的信息。尽管现在我们还只是对一个静止的图像进行工作,但相同的技术也可以被用在运动的图像序列中。这种方式对这些相对简单的静止图像能工作得很好,而对更复杂的镜头,它对于获得运动匹配软件的帮助也很有用。