上一篇: 位图和矢量图

浅谈3D动画制作流程


我曾经玩过四年的3D软件Autodesk Maya 和周边的图形软件, 后来因为个人原因在2014年走上了程序员的道路, 但我对计算机图形还是非常的热爱, 在这里大致聊一下3D动画的制作流程.

CG 是什么?

CG - 计算机图形学(Computer Graphic), 它包含 图形学编程3D软件制作作品 两个方向. 图形学编程涉及渲染器开发、优化等较底层的工作. 3D软件制作作品包含了平面设计、三维设计、特效、游戏等, 高级应用会涉及 python 或 c++ 进行插件的开发.

在3D软件中可以创造出任何世界, 局限仅仅在于艺术家的想象力!

动画

100多年前, 人们发现多张图片序列在短时间内快速切换可以形成动画, 之后便迎来了电影的诞生. 我们称每张图片为一帧

图片

在计算机中图片的表现形式通常分为 位图(Bitmap)和矢量图(Vector Graphic), 与之相对应的制作软件主要是 photoshopillustrator.

3D

因为还需要考虑第三个维度, 3D动画的制作相对于平面要复杂很多, 由于位图表现性强于矢量图, 因此3D作品通常指的是位图.

在风格上, 3D动画主要是两个方向-写实和卡通, 当然也有人在用3D转2D, 比如宫崎骏的<哈尔的移动城堡>

写实风格 的3D动画通常肉眼难以察觉, 因为已经可以做到以假乱真了, 在电影中, 通常是拍摄难度大、危险性高、成本高的画面使用3D制作. 卡通风格的3D动画主要以皮克斯梦工厂的作品为代表.

3D动画前期的制作流程和游戏很相近, 但动画无论是制作精度和复杂度都高于游戏, 并非游戏制作不够成熟, 而是因为游戏属于实时渲染, 如果因为画质导致每秒渲染的画面数量(帧率)如果太低(低于24帧/秒), 则会出现卡顿的现象, 十分影响游戏体验, 因此游戏开发商为了游戏能在大部分人的设备中流畅运行, 会在性能和画质中间找到一个平衡点.

游戏相比于动画少了以下特性:

而动画制作, 因为电影是离线渲染, 所以可以全部添加以上特性, 观众不关心计算时间, 因此可以用大规模集群来做分布式渲染, 只需要把最终计算好的动画拿到电影院给观众欣赏即可.

3D动画的制作流程分为:

常用的3D软件有3Ds Max, Maya, C4D, XSI, Houdini, Modo等, 这些软件都包含3D动画制作的几乎所有功能. 但各自有自己更擅长的领域.

在这些功能完善的3D软件中, 我们可以完成从原画设置关键帧动画的所有步骤, 渲染后期合成通常会使用单独的软件, 后面会细说.

第一步, 原画和分镜头绘画, 可能是纯手绘, 也可能是matte painting(遮罩绘画, 俗称P图). 因为原画很快, 一有灵感马上就可以画一幅, 而3D模型制作很耗时, 好的3D动画是需要非常多的原画和分镜头绘画作为参考. 这是大开脑洞的第一步. 有了原画设计图, 3D艺术家才能将它还原为以假乱真的电影

第二步, 建模. 建模是利用3D软件中的各种工具制作3D模型, 分为Polygon建模和Nurbs建模两种方式, 由于Polygon更容易表现超复杂模型, 因此被广泛应用. 另外, 建模也分为硬表面建模和非硬表面建模, 流程也不一样

第三, 建高精度模型, 光是Maya已有的工具无法实现高精度模型, 比如人脸上的毛孔无法制作, 而且模型精度太高会导致顶点数量太多, 耗尽内存. 雕刻软件出场, 常用的雕刻软件有Zbrush, Mudbox因为雕刻软件的模型呈现原理和普通3D软有所不同, 雕刻软件可以轻松支持上亿个面数量的多边形, 即便是毛孔也可以随意雕刻!

第四, 展uv, 从雕刻软件中导出 置换贴图(Displacement Map) 和 法线贴图(Normal Map). 展uv是把3D空间的面片压扁到2D坐标系, 并且尽量将各个面的挤压和拉伸程度缩减到最小. 雕刻软件中的使用细分级别通常是7-8. 一个5000个面的模型, 经过7级细分之后, 面数是5000*4^7=8192万, 通常普通的3D软件操作界面可承受的面数极限是2000万面, 上了几百万面的模型就已经很容易导致软件崩溃. 所以需要置换贴图法线贴图帮助5000个面的模型实现8000万面模型所具有的细节.

置换贴图, 通常是一张灰度的图片, 模型会先经过一定次数的细分, 然后用置换贴图的亮度值(16bit或32bit, 因此是0~2^16或0~2^32)直接控制细分后的模型顶点在法线方向的偏移量, 因为直接对模型进行修改, 对于生物模型(表面凹凸起伏大的角色)置换贴图比法线贴图更加逼真, 但由于更耗内存, 所以游戏从来不使用置换贴图.

法线贴图, 通常是一张紫色的图片, 上面的RGB三个通道的亮度信息控制对应顶点的法线向量坐标. 它的作用是让低模也具有高模的细节, 毛孔, 纹理等等. 因为3Ds Max 和 Maya等软件不支持上亿个面的模型, 所以游戏只能使用低模 + 法线贴图实现在雕刻软件中的细节. 而电影则是低模 + 置换贴图(500万~1000万面) + 法线贴图(1000面~10亿面)实现雕刻软件中细节

第五, 灯光, 模型已经制作完成之后, 需要在3D软件中添加虚拟灯光, 光照又是另一门学问, 涉及三点布光, 色温等等问题. 不展开了

第六, 给模型添加材质, 通常3D软件会给一个默认的简单材质用于建模时方便观察, 但要让模型逼真, 就需要给模型上材料. 在3D软件中通常叫做shader, 也叫着色器, 它是一段程序, 专门负责模型材质相关计算公式, 比如漫反射, 反射, 高光, 光泽度等等

第七, 给模型绑定骨骼, 蒙皮. 各大3D软件都有自己的一套骨骼绑定系统, 模型上的每个顶点会随着它所属的骨骼运动, 但关节地方需要蒙皮, 蒙皮是针对于软组织角色动画而添加的功能, 让他们的关节处动画过渡自然. 然后添加肌肉系统...

第八, Key动画, 也叫设置关键帧动画. 我们知道电影每一秒钟是24张图片快速切换形成的动画. 3D动画也是如此, 但是不可能每一帧都去手动设置模型骨骼的位置, 因此会设置关键帧, 让计算机去计算其中的过渡, Key动画可以添加不同的动画曲线, 让模型可以有不同的速度和加速度

第九, 渲染--在CG中是计算机生成图片的过程. 渲染器则是用来渲染的软件. 由于各大3D软件自己的渲染器不够强大, 而渲染又是计算机生成图形中极其重要的一环, 所以我们通常会选择更强大的第三方渲染器.

渲染的种类分为离线渲染实时渲染, 离线渲染是计算机堆积大量时间计算图形, 计算完成之后再给别人呈现, 也就是说渲染和呈现不同步, 比如电影, 广告, 动画等都是制作者制作完成之后给别人呈现. 而实时渲染则是渲染和呈现同步进行, 所有画面都是实时生成的, 比如游戏和VR, 所以实时渲染为了保证流畅, 帧率必须大于30帧/秒, 等同于每秒输出30张图片. 这对计算性能要求是极高的, 由于现在的GPU无法满足, 所以游戏会在渲染算法和制作流程上做很多妥协, 在真实度和性能方面找到一个平衡点.

常用的离线渲染器有:

渲染真实度: mental-ray < renderman ≈ v-ray <≈ arnold < maxwell
学习难度: maxwell < arnold ≈ v-ray < mental-ray << renderman
渲染速度: maxwell < mental-ray < v-ray ≈ arnold ≈ renderman

这些渲染器都是可以渲染出照片级别真实的图片, 所以局限在于使用者的水平. 所有渲染器为了节省计算机资源, 几乎都是从虚拟摄像机向3D场景中发射若干虚拟射线, 逆向进行采样和计算, 射线的条数和追踪深度则根据场景由使用者控制, 这也和渲染时间有密切联系. 每当射线碰撞到模型表面, 则会调用此模型关联的shader程序, 此程序中关联了模型拥有的所有材质属性(漫反射, 反射, 折射等), 然后再次反弹, 继续查找下一个模型并调用其shader.

事情远远没那么简单, 在生成图形过程中会遇到一个麻烦的问题--抗锯齿(anti-alias), 几乎所有渲染器都会使用蒙特卡洛算法对像素进行抗锯齿, 由于机器资源限制不可能在每个像素中发射无数条采样射线, 因此需要使用更为高效的算法获得足够接近真实的色彩值, 但尽管现在算法非常先进, 也像素直接也难免会出现偏差, 导致过渡不均匀, 这也是噪点产生的原因. 要降噪只有增加采样射线数量, 但每个所有像素都增加采样射线数量又会导致渲染速度过低, 问题在于如何在降噪和渲染速度之间做个最大的平衡.

随着科学的不断发展, 研究人员发现人肉眼对暗部信息更加敏感, 比如一张照片中, 纯黑是0, 纯白是100, 照片中相邻两个像素从0到5的亮度变化比从95到100更易被肉眼察觉. 换句话说, 图片较亮的区域可以发射更少的采样射线, 而相对较暗区域可以发送更多的采样射线获得更准确的颜色信息. 然后渲染器开始对蒙特卡洛算法进行修改以满足渲染器渲染质量不降低的同时提升性能, 陆续诞生了准蒙特卡洛算法, 确定性蒙特卡洛算法.

渲染是CG领域非常庞大的一个分支, 灯光和材质也是它的子集, 它和图形学编程有密切联系. 渲染也是3D动画制作过程中最耗时间, 最耗资源的过程. 一部动画片或科幻片, 通常需要使用成千上万台计算机组成的计算机集群进行长达数月的分布式计算. 变形金刚3这部电影如果使用家用电脑计算至少要几百年时间!

第十, 后期合成. 为了方便更加精细的控制, 渲染出来的图片序列帧需要使用后期软件再次加工, 才能达到理想效果. 想想看, 电影制作过程如此复杂, 难免和理想效果之间会出现一些偏差, 又因为渲染电影会用掉很长的时间, 所以这些偏差只能在后期处理以达到最佳效果, 这个过程被称为后期合成. 电影工业中通常使用Nuke最多(nuke是当年为了拍摄泰坦尼克号时, 卡梅隆开的一个叫做Digital Domain的视觉特效公司开发的一款合成软件), Fusion进行合成, 在影视包装和广告领域中AE比较常用, 如果是单帧的图片, PS也是很好的选择. 后期合成软件会使用渲染图片的多个通道进行合成, 除了RGB三个通道外, 可能还会用到其他很多通道.

玩3D动画, 是一个非常耗时的过程. 学习成本很高, 制作周期长, 而且国内整体审美水平偏低, 不妨看看这个问题就2015年初而言, 国人的审美大体处于一个什么样的水平?

理想是美好的, 现实却很残酷, 国内的CG行业前景一直不太乐观. 真正喜欢动画的人在这方面的才华未能得到发挥, 而很多只为圈钱不追求艺术和技术的人靠搞关系很容易拿到了投资, 做出的作品非常垃圾, 尤其是<雷锋的故事>这种垃圾作品居然能耗资两千万, 类似的情况在国内还挺多的, 这只能让人叹息.

上一篇: 位图和矢量图