新闻  |   论坛  |   博客  |   在线研讨会
Unity3D :树
xyni2023 | 2023-05-10 14:21:33    阅读:405   发布文章

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

可使用类似于绘制高度贴图和纹理的方式在地形上绘制树。然而,树是从表面生长的 3D 对象实体。Unity 使用优化(比如针对远处树的公告牌)来保持良好的渲染性能。这意味着可以实现茂密森林(拥有数以千计的树),而仍然保持可接受的帧率。

有树的地形有树的地形

绘制树

工具栏上的 Paint Trees 按钮可用于绘制树:

Paint Trees 按钮Paint Trees 按钮

地形最初没有可用的树原型。为了开始在地形上绘制,需要添加树原型。单击 Edit Trees 按钮,然后选择 Add Tree。在此处,可从项目中选择树资源,并将其添加为__树预制件__以便与画笔结合使用:

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 DensityTree 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 按钮位置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 值。

树细节级别 (LOD) 过渡区

对于树编辑器树,Unity 的 LOD 系统使用 2D 到 3D 过渡区域将 2D 广告牌与 3D 树模型无缝融合。这可以防止2D和3D树突然弹出,这在VR中至关重要。请注意,广告牌树木不会接收局部照明,例如点光源和聚光灯。它们使用定向光源,但广告牌上的照明仅在您旋转摄像机时更新。

对于 SpeedTree 树,请参阅 LOD 和 LOD 组 (LOD Group) 文档以了解关于配置 LOD 组件的更多信息。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客