在3ds Max中准备模型:修订间差异

来自Light Stream (CN)
(Перевод с русской вики (задача №983, LS Dev Hub))
 
(Перевод с русской вики (задача №1106, LS Dev Hub))
 
第1行: 第1行:
[[ru:Подготовка модели в 3ds max]] [[en:Preparing a Model in 3ds Max]] [[zh:在3ds Max中准备模型]]
[[ru:Подготовка модели в 3ds max]] [[en:Preparing a Model in 3ds Max]] [[zh:在3ds Max中准备模型]]
  说明 模型应 具备怎 的条件 ,才能以 正确 尺寸 、正确的朝上方向、且不 产生数据损 地导 Light Stream 的场景 。这里 讲的是 3ds Max,但对任何三维编辑器 而言 要求都是一样的:对程序来说重要的不是模型是用什么软件制作的,而是 <code>*.obj</code> 文件 记录了什么内容。导入 过程 本身 文章 [[导入OBJ模型]] 中有介绍
  这篇 章讲的是 模型应 该是什么 ,才能以 合适 大小 、正确的朝上方向、且不 任何内容进 入 Light Stream 的场景。这里 3ds Max 为例 ,但对任何三维编辑器 要求都是一样的:对程序来说重要的不是模型是用什么软件制作的,而是<code>*.obj</code>文件 记录了什么内容。 关于 导入本身 的介绍见 文章[[导入OBJ模型]]。


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


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


{| class="wikitable"
{| class="wikitable"
! 会 带入 !! 不会 带入
! 会 转移 !! 不会 转移
|-
|-
|
|
* 几何体——三角形和四边形
* 几何体——三角形和四边形
物体 的划分及其名称
对象 的划分及其名称
* 法线(明暗与平滑)
* 法线(明暗 关系 与平滑)
* 线条——会变成样条 (spline)
* 线条—— 它们 会变成样条 线
* 展开 图( 贴图坐标 ,UV
* 展开贴图坐标 (UV
* 材质的基础颜色和基础贴图
* 材质的基础颜色和基础贴图
|
|
* 修改器、构建历史、骨骼 动画
* 修改器、构建历史、骨骼 动画
* 图层、 组、 关系
* 图层、组、 父子 关系
* 单独 存在 的平滑组 (smoothing group)
* 单独的平滑组
* 除基础贴图外的所有贴图:凹凸、反射、透明、自发光
* 除基础贴图外的所有贴图:凹凸、反射、透明 、自发光
* 同一 物体 的第二个及后续材质
* 同一 对象 的第二个及后续材质
* 光源 摄像机——它们不会从 <code>*.obj</code>
* 光源 摄像机——它们不会从<code>*.obj</code> 文件
* 顶点颜色
* 顶点颜色
|}
|}
第28行: 第28行:
== 单位与比例 ==
== 单位与比例 ==


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


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


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


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


== 朝向 ==
== 朝向 ==


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


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


==  物体 划分与命名 ==
==  对象 划分与命名 ==


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


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


== 多边形 ==
== 多边形 ==


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


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


 对几何体还有一 要求:'''不要导出顶点颜色。'''如果导出 插件 在顶点坐标之外还附加了顶点颜色,这样的顶点将无法被 正确 读取, 引用它的 基于 错误的点构建 —— 模型会 内外翻转的 状态到达
 对几何体还有一 要求:'''不要导出顶点颜色。'''如果导出 在顶点坐标之外还附加了顶点颜色,这样的顶点将 完全 无法被读取, 顶点编号会发生错位—— 错误的点 构建 模型会 出现 内外翻转 或从中间断开 情况


== 法线 ==
== 法线 ==


'''必须将法线写入文件'''——在导出设置中对应 '''Normals'''(法线) 。程序依据法线计算明暗:没有法线, 物体就 以背景 颜色的单一平面填充来绘制 也就是看起来像一个 没有立体感的 扁平深 色剪影。
'''必须将法线写入文件'''——在导出设置中对应'''Normals'''(法线)选 。程序依据法线计算明暗 关系 :没有法线, 对象根本不 被打 光, 在场景中只会呈现为 没有立体感的 纯黑 色剪影。


 平滑组 (smoothing group) 本身不会被读取,但也不需要单独设置:导出 插件 会把平滑 处理 的结果写入法线, 物体 进入场景后会保持 编辑器中 同的平滑或 面效果。
 平滑组本身不会被读取,但也不需要单独设置:导出 会把平滑的结果写入法线 对象 进入场景后会保持 编辑器中同 的平滑或 面效果。


Light Stream 没有背面剔除(backface culling)——面从两侧都可见,因此内外翻转 的部件 不会消失 但是背向光源 法线 抵消明暗效果:这样的 显比周围的面 。如果导入后模型上出现暗斑,请检查编辑器中 法线 的方向
  明暗关系只针对用纯色着色 的部件 计算 带贴图 对象 以平 方式渲染,不做 明暗 处理—— 法线 对它没有影响


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


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


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


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


 不需要为固定装置单独建 一个物体 :3ds Max 中的光源根本不会保存 到 OBJ 里 。如果 还想 把已经 摆放 好的灯具 入程序,可以把模型导出为 <code>*.fbx</code>——从 这种 格式中,除了 物体 和样条之外,单个固定装置也 能一并 导入。
* 开启其导出功能——在OBJ导出设置中勾选'''Shapes/Lines'''(形状/线条);
* 将样条线转换为具有所需点数的折线:曲线在文件中是按线段记录的,步长越小,进入场景的点就越多;
* 把各段连接成一条线。文件中的每一条线都会成为一条独立的样条线,因此由未连接的线段拼成的路径,导入后会变成一堆零散的短样条线;
* 如果样条线没有出现,请关闭贴图坐标的导出:有些导出器也会把贴图坐标写入线条记录,而这样的记录会被Light Stream跳过。
 
样条线的名称取自的不是线条本身,而是记录该线条的对象——因此最好把线条整理到单独且有意义命名的对象中,例如“line_roof”(屋顶线)、“contour_window”(窗轮廓线)。这样的对象本身不会出现在'''3D Objects'''列表中:如果它不含任何面,进入场景的就只有样条线。
 
 不需要为固定装置单独建 立对象 :3ds Max中的光源根本不会保存 到OBJ文件中 。如果 希望 把已经 布置 好的灯具 也传 入程序,可以把模型导出为<code>*.fbx</code> 格式 ——从 格式中,除了 对象 和样条 线 之外,单个固定装置也 会被 导入。


== 材质与贴图 ==
== 材质与贴图 ==


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


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


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


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


== 模型复杂度 ==
== 模型复杂度 ==


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


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


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


== 导出流程 ==
== 导出流程 ==


在 3ds Max 场景中只保留 应带入 Light Stream 的内容:模型本身以及固定装置 的线条。
在3ds Max场景中 只保留 需要传入Light Stream的内容:模型本身以及 用于 固定装置的线条。
# 塌陷修改器, 将物体 转换为多边形网格,删除隐藏和多余的内容。
# 塌陷修改器, 把对象 转换为多边形网格,删除隐藏和多余的内容。
# 检查 物体 名称:必须存在 名称 ,且必须 拉丁字母。
# 检查 对象 名称:必须存在,且必须 使用 拉丁字母。
# 检查尺寸, 把模型 换算 一个单位 —— 一米 的比例。
# 检查尺寸,把模型 调整 一个单位 等于 的比例。
# 将选中 内容导出为 <code>*.obj</code>。
# 将选中内容导出为<code>*.obj</code>。
# 在导出设置中:'''Faces''' (面) ——选择 '''Triangles''' (三角形) 或 '''Quads''' (四边形) ;'''Normals''' (法线) ——启 ;'''Texture coordinates'''(贴图坐标)——如有贴图则启 ;'''Shapes/Lines''' (形状/线条) ——如场景中有固定装置 的线条则启 ;'''Flip YZ-axis'''——取消勾选;材质导出——启
# 在导出设置中:'''Faces'''——选择'''Triangles'''或'''Quads''';'''Normals'''—— 启;'''Texture coordinates'''(贴图坐标)——如 有贴图则 启;'''Shapes/Lines'''——如 场景中有 用于 固定装置的线条则 启;'''Flip YZ-axis'''——取消勾选;材质导出—— 启。
# 把模型、材质文件和贴图保存到同一个文件夹中,并从 那里 导入。
# 把模型、材质文件和贴图保存到同一个文件夹中,并从 该文件夹 导入。


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


== 导入后应检查的内容 ==
== 导入后应检查的内容 ==


# 在 '''3D View'''(3D视图)窗口中不选中任何 物体的情况下 按 '''Z''' 键——摄像机会 整个场景 纳入视野 。在旁边创建一个 尺寸为 '''1000''' × '''1000''' × '''1000''' 的立方体并进行比较 :如果立面旁边 一米立方体看起来确实是一米见方,说明比例正确。
# 在'''3D View'''(3D视图)窗口中不选中任何 内容, 按'''Z'''键——摄像机会 框住 整个场景。在旁边创建一个 立方体,把它的'''Width'''、'''Height''' '''Length''' 都设为'''1000''':如果立面旁边 这个 一米 见方的小 立方体看起来确实是一米见方,说明比例 正确
# 查看 '''3D Objects''' (3D对象) 列表:所有部件是否 齐全 ,名称是否 清晰 可读,线条 生成 的样条是否已导入。
# 查看'''3D Objects'''列表:所有部件是否 都在 ,名称是否可读,线条 对应 的样条 线 是否已导入。
# 用摄像机 绕模型查 看,寻 找复杂面 处可能 出现 破洞,以及法线翻转 处可能 出现 暗斑。
# 用摄像机绕模型 转一圈, 查找复杂面 所在位置是否 出现破洞,以及法线翻转 位置是否 出现暗斑。
# 如果你导出了材质,请确认 物体 不是 灰色
# 如果你导出了材质,请确认 对象 不是 的:纯 灰色 说明既没有找到材质,也没有找到贴图


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


== 还有 哪些内容 有帮助 ==
== 还有 什么 用到 ==


* 导入 过程 本身是如何进行的,以及 导入后 如何处理 场景中的 模型—— 见 [[导入OBJ模型]]。
* 导入本身是如何进行的,以及 在场景中该 如何处理模型——见[[导入OBJ模型]]。
* 已导入 物体 的名称、可见性、锁定和材质—— 见 [[3D对象]]。
* 已导入 对象 的名称、可见性、锁定 状态 和材质——见[[3D对象]]。
* 吸附 到顶点 以及 '''3D View''' (3D视图) 窗口的其他按钮—— 见 [[3D 工具栏]]。
顶点 吸附以及'''3D View'''窗口的其他按钮——见[[3D 工具栏]]。
* 如何 沿已完成 的模型 置固定装置—— 见 [[添加3D样条]] 和 [[2D 与 3D 的关联]]。
* 如何 在做好 的模型 上布 置固定装置——见[[添加3D样条]]和[[2D 与 3D 的关联]]。

2026年9月3日 (四) 16:12的最新版本

这篇文章讲的是模型应该是什么样子,才能以合适的大小、正确的朝上方向、且不丢失任何内容进入 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 的关联