在3ds Max中准备模型

来自Light Stream (CN)

这篇文章讲的是模型应该是什么样子,才能以合适的大小、正确的朝上方向、且不丢失任何内容进入 Light Stream 的场景。这里以 3ds Max 为例,但对任何三维编辑器的要求都是一样的:对程序来说重要的不是模型是用什么软件制作的,而是*.obj文件中记录了什么内容。关于导入本身的介绍见文章导入OBJ模型

为 Light Stream 准备模型,追求的不是“更好看”,而是“更清楚”。这里不会有漂亮的渲染效果:程序只用单一贴图的简单平涂方式显示物体。但吸附功能是基于模型顶点工作的,模型中的对象也会成为列表中的一行——在整个项目过程中你都要翻阅这个列表——所以最重要的是正确的比例、干净的几何体和有意义的命名。

哪些内容会转移到 Light Stream,哪些不会

会转移 不会转移
  • 几何体——三角形和四边形
  • 对象的划分及其名称
  • 法线(明暗关系与平滑)
  • 线条——它们会变成样条线
  • 展开贴图坐标(UV)
  • 材质的基础颜色和基础贴图
  • 修改器、构建历史、骨骼和动画
  • 图层、组、“父子”关系
  • 单独的平滑组
  • 除基础贴图外的所有贴图:凹凸、反射、透明度、自发光
  • 同一对象的第二个及后续材质
  • 光源和摄像机——它们不会从*.obj文件中导入
  • 顶点颜色

单位与比例

坐标是按文件中原样读取的:导入时没有缩放窗口,“输入时”无法调整大小。

Light Stream 的场景以毫米为单位:文件中的一个长度单位等于一毫米。高度30米的建筑立面在文件中应占30 000个单位,而LED灯条上单个像素点则是三四十个单位。检查比例最简单的方法是用程序自身创建的立方体:在Properties(属性)窗口的Cube(立方体)部分,把Width(宽度)、Height(高度)和Length(长度)都设为1000——这是一个一米见方的小立方体,把它放在模型旁边进行比较。

在3ds Max中,最方便的做法是:将系统单位设置为毫米,并按真实尺寸建模——这样导出时就不需要重新换算,缩放系数保持为1。如果场景是用其他单位搭建的,就在导出时设置缩放系数:从米——1000,从厘米——10,从英寸——25.4

单位错误是导入后“什么都看不见”最常见的原因。以米为单位导出的模型会比实际需要小一千倍,淹没在固定装置(fixtures)之中;而不小心放大了一千倍的模型则会跑到离坐标原点几公里远的地方,摄像机里只会显示一片空白。

朝向

Light Stream 场景中朝上的是Z轴——这与3ds Max中一致。因此在OBJ导出设置中,应取消勾选Flip YZ-axis(交换坐标轴以适应Y轴朝上的约定)选项:如果勾选了它,模型进入场景后会侧倒。如果模型确实侧倒了,切换一下这个选项,重新导出即可。

导出之前,最好重置变换,并在3ds Max中把模型放到它相对于坐标原点应处的位置:对象之间的相对位置以及文件中的坐标,在导入时会被完整保留。

对象划分与命名

文件会被解析为若干独立对象,每个对象在3D Objects(3D对象)窗口中都会成为一行,各自拥有自己的可见性复选框、材质和锁定状态。规则很简单:

  • 所有几何体都必须属于命名对象。写在文件中第一个对象之前的内容不会被导入。
  • 每个对象都必须有名称。未命名的对象或组会中断文件的读取:写在它之后的内容将无法进入场景,模型会只导入一半。
  • 名称必须使用拉丁字母,不能使用西里尔字母。这既适用于对象名称,也适用于模型所引用的文件名——材质文件和贴图文件。其中的俄文字母在导入时会变成一串问号,同名的贴图也就无法被找到。
  • 不要将对象命名为light这是一个保留名称:名为该名称的对象的几何体不会被当作普通装饰物,而是被当作发光部件——它不会以自身材质渲染,而是以光的方式渲染,在场景中不可见,除非该对象被选中。
  • 按含义划分:如“facade”(立面)、“roof”(屋顶)、“column_left”(左立柱)。由单一整体部件构成的模型在列表中只会是一行——之后就无法单独隐藏或改变它某一部分的颜色。
  • 也不要走向另一个极端:几百个细小对象会把3D Objects列表变成一条无穷无尽、难以查找的长条。

多边形

Light Stream 只能读取三角形和四边形。拥有五个或更多顶点的面会被静默跳过——场景中对应的位置会出现破洞。

因此在导出设置的Faces(面)组中,应选择Triangles(三角形)或Quads(四边形),而不是Polygons(多边形)。导出前请塌陷修改器,并将对象转换为多边形网格:NURBS、面片、带布尔运算的实体以及其他未被计算的对象,要么无法进入OBJ文件,要么进入后与视口中看到的样子不一致。

对几何体还有一个要求:不要导出顶点颜色。如果导出器在顶点坐标之外还附加了顶点颜色,这样的顶点将完全无法被读取,顶点编号会发生错位——面就会按错误的点来构建:模型会出现内外翻转或从中间断开的情况。

法线

必须将法线写入文件——在导出设置中对应Normals(法线)选项。程序依据法线计算明暗关系:没有法线,对象根本不会被打光,在场景中只会呈现为没有立体感的纯黑色剪影。

平滑组本身不会被读取,但也不需要单独设置:导出器会把平滑的结果写入法线中,对象进入场景后会保持在编辑器中同样的平滑或多面效果。

明暗关系只针对用纯色着色的部件计算。带贴图的对象会以平面方式渲染,不做明暗处理——法线对它没有影响。

Light Stream 没有背面剔除:一个面从两侧都能看见,因此内外翻转的部件不会消失。但方向背离光源的法线会消除明暗效果:这样的面会明显比相邻的面暗。如果导入后模型上出现暗斑,请检查编辑器中法线的方向。

用于固定装置的线条

写入文件的线条会作为现成的样条线进入场景——可以直接沿它们布置固定装置(Fixtures),无需手动描绘边缘。这是把灯带、灯串和轮廓灯光路径传入Light Stream最方便的方法:在3ds Max中按实际位置用样条线画好,进入程序后只需把它们与映射关联起来即可。

要让线条能够导入:

  • 开启其导出功能——在OBJ导出设置中勾选Shapes/Lines(形状/线条);
  • 将样条线转换为具有所需点数的折线:曲线在文件中是按线段记录的,步长越小,进入场景的点就越多;
  • 把各段连接成一条线。文件中的每一条线都会成为一条独立的样条线,因此由未连接的线段拼成的路径,导入后会变成一堆零散的短样条线;
  • 如果样条线没有出现,请关闭贴图坐标的导出:有些导出器也会把贴图坐标写入线条记录,而这样的记录会被Light Stream跳过。

样条线的名称取自的不是线条本身,而是记录该线条的对象——因此最好把线条整理到单独且有意义命名的对象中,例如“line_roof”(屋顶线)、“contour_window”(窗轮廓线)。这样的对象本身不会出现在3D Objects列表中:如果它不含任何面,进入场景的就只有样条线。

不需要为固定装置单独建立对象:3ds Max中的光源根本不会保存到OBJ文件中。如果希望把已经布置好的灯具也传入程序,可以把模型导出为*.fbx格式——从该格式中,除了对象和样条线之外,单个固定装置也会被导入。

材质与贴图

OBJ把材质存储在模型旁边的一个单独文件中,而贴图则是另外的图片文件,因此请开启材质导出,并始终把模型作为完整的一个文件夹整体转移。

关于材质,需要事先了解以下几点:

  • 一个对象对应一种材质。多组件材质(Multi/Sub-Object)只会转移其中一个部分——文件中最后提到的那一个,并且它会被应用到整个对象上。如果部件的不同部分需要不同颜色,请按材质把该部件拆分成不同对象。
  • 材质中只会取用基础颜色和基础贴图。透明度、反射、凹凸、自发光以及任何程序化贴图都会被忽略——最好把它们“烘焙”成普通图片,或者不要依赖它们。
  • 贴图就是普通的JPG、PNG、BMP或GIF图片。把它们放在模型旁边或子文件夹中:程序会按名称在模型旁边及所有子文件夹中查找文件。文件名必须使用拉丁字母。
  • 贴图需要展开坐标(UV)。没有展开坐标的对象,贴图会被涂抹成单一颜色。
  • Light Stream中没有自发光材质。如果某个部件需要看起来像在发光——例如招牌、屏幕、发光线条——请在导入后,在Properties(属性)窗口的Material(材质)部分为它启用Glow(发光)选项。

颜色、贴图和发光效果也完全可以在程序中手动指定,因此对于辅助性的几何体,完全可以不在编辑器中设置材质:没有材质的对象导入后会显示为灰色。

模型复杂度

模型会被完整嵌入到项目文件内部,因此它的体积就是项目的体积、打开项目所需的时间,以及每一帧预览时对显卡造成的负担。而且在程序中,网格所占用的空间比在编辑器中更大:每个面都要连同自己的顶点一起存储。

导出前合理的最低限度准备工作:

  • 删除对象上看不见的所有内容:内部结构、背面、隐藏部件、辅助对象、重复的副本;
  • 去掉预览中看不出来的细节:螺栓、型材、纹理细节、一毫米的倒角;
  • 减少圆角和管道的分段数量——平滑度的代价很高;
  • 在需要的地方保留顶点:Snap to Vertices(顶点吸附)正是依据顶点工作的,这样固定装置才能准确落在拐角和边缘上。如果需要沿一面平整的墙布置一排灯具,就要在模型中沿墙边添加相应的边。

导出流程

  1. 在3ds Max场景中,只保留需要传入Light Stream的内容:模型本身以及用于固定装置的线条。
  2. 塌陷修改器,把对象转换为多边形网格,删除隐藏和多余的内容。
  3. 检查对象名称:必须存在,且必须使用拉丁字母。
  4. 检查尺寸,把模型调整到“一个单位等于一毫米”的比例。
  5. 将选中内容导出为*.obj
  6. 在导出设置中:Faces——选择TrianglesQuadsNormals——开启;Texture coordinates(贴图坐标)——如果有贴图则开启;Shapes/Lines——如果场景中有用于固定装置的线条则开启;Flip YZ-axis——取消勾选;材质导出——开启。
  7. 把模型、材质文件和贴图保存到同一个文件夹中,并从该文件夹导入。

导出得到的文件的第一行,导出器会用来写入关于自身的说明信息——如果你要手动编辑该文件,不要删除这一行:导入时第一行不会被读取,你放在这个位置的任何内容都会随之丢失。

导入后应检查的内容

  1. 3D View(3D视图)窗口中不选中任何内容,按Z键——摄像机会框住整个场景。在旁边创建一个立方体,把它的WidthHeightLength都设为1000:如果立面旁边这个一米见方的小立方体看起来确实是一米见方,说明比例是正确的。
  2. 查看3D Objects列表:所有部件是否都在,名称是否可读,线条对应的样条线是否已导入。
  3. 用摄像机绕模型转一圈,查找复杂面所在位置是否出现破洞,以及法线翻转位置是否出现暗斑。
  4. 如果你导出了材质,请确认对象不是灰色的:纯灰色说明既没有找到材质,也没有找到贴图。

任何不一致的地方,最可靠的做法是在3ds Max中修正后重新导入:无法用Light Stream自身的工具来完善几何体,而在编辑器中修正过的模型,还可以在其他项目中重复使用。

还有什么会用到

  • 导入本身是如何进行的,以及在场景中该如何处理模型——见导入OBJ模型
  • 已导入对象的名称、可见性、锁定状态和材质——见3D对象
  • 顶点吸附以及3D View窗口的其他按钮——见3D 工具栏
  • 如何在做好的模型上布置固定装置——见添加3D样条2D 与 3D 的关联