推荐:将 NSDT场景编辑器 加入你的3D工具链
3D工具集: NSDT简石数字孪生
可使用类似于绘制高度贴图和纹理的方式在地形上绘制树。然而,树是从表面生长的 3D 对象实体。Unity 使用优化(比如针对远处树的公告牌)来保持良好的渲染性能。这意味着可以实现茂密森林(拥有数以千计的树),而仍然保持可接受的帧率。
有树的地形
工具栏上的 Paint Trees 按钮可用于绘制树:
Paint Trees 按钮
地形最初没有可用的树原型。为了开始在地形上绘制,需要添加树原型。单击 Edit Trees 按钮,然后选择 Add Tree。在此处,可从项目中选择树资源,并将其添加为__树预制件__以便与画笔结合使用:
Add Tree 窗口
为便于进行原型设计,SpeedTree 在 Asset Store 上的免费 SpeedTrees 包 中提供了四种 SpeedTree 模型。或者,您也可以创建自己的树。
如果所导入的树预制件支持 Bend Factor__,__Add Tree 窗口将显示用于调整风响应性的 Bend Factor 属性。SpeedTree Modeler 创建的树没有 __Bend Factor__;只有 Tree Editor 创建的树才有。请参阅下文关于__让树在风中弯曲__的部分。
配置 Settings 中的设置(如下文所述)后,可以按照与绘制纹理或高度贴图相同的方法在地形上绘制树。若要从区域中移除树,请在绘制时按住 Shift 键。若要仅移除当前选定的树类型,请在绘制时按住 Control 键。
选择要放置的树之后,可调整其设置以便自定义树的位置和特征。
树的设置
属性 | 功能 |
---|---|
Mass Place Trees | 创建一批整体覆盖的树,但不绘制在整个地形上。批量放置树后,仍然可以使用绘制功能来添加或移除树,从而创建更密集或更稀疏的区域。 |
Brush Size | 控制可添加树的区域的大小。 |
Tree Density | Tree Density 控制 Brush Size 定义的区域中绘制的树平均数量。 |
Tree Height | 使用滑动条来控制树的最小高度和最大高度。将滑动条向左拖动绘制矮树,向右拖动绘制高树。如果取消选中 Random,可以将所有新树的确切高度比例指定为 0.01 到 2 的范围内。 |
Lock Width to Height | 默认情况下,树宽度与其高度锁定,因此始终会均匀缩放树。然而,可以禁用 Lock Width to Height 选项,然后单独指定宽度。 |
Tree Width | 如果树宽度未与其高度锁定,则可以使用滑动条来控制树的最小宽度和最大宽度。将滑动条向左拖动绘制细树,向右拖动绘制粗树。如果取消选中 Random,可以将所有新树的确切宽度比例指定为 0.01 到 2 的范围内。 |
Random Tree Rotation | 如果为树配置 LOD 组,请使用 Random Tree Rotation 设置来帮助创建随机自然的森林效果,而不是人工种植的完全相同的树。如果要以相同的固定旋转来放置树,请取消选中此选项。 |
Color Variation | 应用于树的随机着色量。仅在着色器读取 _TreeInstanceColor 属性时有效。例如,用 Tree Editor 创建的所有树的着色器将读取 _TreeInstanceColor 属性。 |
Tree Contribute Global Illumination | 启用此复选框可向 Unity 指示树影响全局光照计算。 |
可通过两种方法来新建树模型。使用 IDV, Inc. 提供的 SpeedTree Modeler 来创建具有高级视觉效果(例如,平滑的 LOD 过渡、快速公告牌以及自然风动画)的树。有关更多详细信息,请参阅 SpeedTree Modeler 文档。或者,使用 Tree Editor 来创建树模型。
在内部,地形引擎通过确定树预制件的根游戏对象上是否存在 LOD 组来区分这两种类型的模型。SpeedTree 预制件具有 LODGroup 组件,但 Tree Editor 预制件没有该组件。
创建树时,将锚点定位在树的基部(树破土而出的位置)。性能取决于树模型的多边形数,因此请确保在平台上进行测试,并在必要时创建更简单的树。另外,对于 Tree Editor 树,每个网格都正好有两种材质:一种用于树体,另一种用于树叶。
用 Tree Editor 创建的树必须使用__自然/软遮挡树叶 (Nature/Soft Occlusion Leaves)__ 和__自然/软遮挡树皮 (Nature/Soft Occlusion Bark)__ 着色器。要使用这些着色器,必须将树放在名为 Ambient-Occlusion 的特定文件夹中,否则树无法正确渲染。将模型放入此文件夹并将其重新导入时,Unity 会使用一种专为树设计的方式计算软__环境光遮挡__。
如果在单独的 3D 建模应用程序中更改导入的树资源,则需要单击 Editor 中的 Refresh 按钮来查看地形上更新后的树:
Refresh 按钮位置
注意:在 3D 建模程序中导入并改变 SpeedTree 模型后,再将其重新导出(扩展名为 .fbx
或 .obj
),可能会丢失 SpeedTree 模型附带的自然风动画功能。
可以将胶囊碰撞体 (Capsule Collider) 添加到树资源。首先,单击树资源旁的 > 以打开预制件。
然后,选择 Add Component > Physics > Capsule Collider 来添加碰撞体。单击预制件名称旁的 < 以返回到场景。
还必须在 Terrain Collider 组件中启用 Enable Tree Colliders。
风区可以弯曲树木以模拟风的直接影响。此功能仅可用于通过 Terrain 菜单放置的树。为此,请选择地形,单击 Inspector 中的 Paint Trees 按钮,然后选择 Edit Trees > Add Tree__,再选择树预制件。如果未在 Unity 中创建树,请将 Bend Factor__ 设置为 1。单击地形以放置选定的树。
具有 Bend Factor 的基于地形树通过弯曲和摇摆(根据风区的 Turbulence 和 Main 属性值),对风区做出反应。Turbulence 设置用于控制树叶的飘动。减小该值可使飘动特效流畅。Main 值用于控制风的主要作用力。要创建风区,请选择 GameObject > 3D Object > Wind Zone。
如果风区的 Mode 为 Directional__,则其相对于树的位置无关紧要。树将向风区方向摇摆。然而,如果风区的 Mode__ 为 Spherical__,则其 Radius__ 必须与树的半径重叠。这样会产生多方向的阵风,风力从中心到边缘衰减。
在默认设置下,诸如阔叶树 (Broadleaf) 预制件(在 Standard Assets Environment 包中提供)之类的树可以平稳而逼真地摆动。但是,如果您使用自己的树预制件,可能需要调整 Wind Zone 属性值。如果树预制件的树干彻底弯向一侧,请尝试减小 Main 值。或者,如果树预制件的树枝过度弯曲或伸展,请减小 Turbulence 值。
对于树编辑器树,Unity 的 LOD 系统使用 2D 到 3D 过渡区域将 2D 广告牌与 3D 树模型无缝融合。这可以防止2D和3D树突然弹出,这在VR中至关重要。请注意,广告牌树木不会接收局部照明,例如点光源和聚光灯。它们使用定向光源,但广告牌上的照明仅在您旋转摄像机时更新。
对于 SpeedTree 树,请参阅 LOD 和 LOD 组 (LOD Group) 文档以了解关于配置 LOD 组件的更多信息。