以较低的开销添加来回晃荡的缆绳、绳索或链条(类似被风吹动的效果)后,虚幻引擎 4(UE4)项目中便会拥有更加生动的效果。在以下文档中,我们将了解如何使用 缆绳组件(Cable Component) 插件创建、设置和控制缆绳的外观、响应,甚至使其和关卡中的物体发生碰撞。
模拟和渲染
实际执行缆绳模拟的是游戏开发界十分著名的技术 韦尔莱算法(Verlet Integration)。这种算法的概念是用一系列粒子代表缆绳,而粒子与粒子之间则拥有 距离约束。两端的粒子为 固定,随附着的物体进行移动。中间的粒子则为 自由,随重力而下垂。每一步均会更新每个粒子的速度和位置,并移动粒子满足约束。缆绳的 刚性由迭代执行约束(每步)的次数而定。
点击查看全图。
拥有完善的相连粒子链后,即可对其进行渲染。渲染缆绳时将创建一个名为 FCableSceneProxy 的类,代表缆绳的渲染。模拟粒子位置(在主线程上的 TickComponent 中执行)的每个端将通过 SendRenderDynamicData_Concurrent 函数传至此代理。接下来,更新将锁定在渲染线程上,之后将更新索引和顶点缓存,因此形成一个 管道 模型。我们需要对此管道模型上的每个顶点计算一个位置、一个纹理 UV 和三个切线基础矢量。执行此操作时,X 的朝向沿缆绳,Z 的朝向从缆绳(法线)向外,而 Y 则与 X 和 Z 垂直。这些属性已经对组件公开,以便用户控制面的数量,管道的半径,以及 UV 沿缆绳进行平铺的次数。
点击查看全图。
启用插件
缆绳组件插件默认启用。如未启用,可在主工具栏中选择 Edit > Plugins。然后在插件列表中选择 Rendering,将 Cable Component 的 Enabled 勾选框勾选。
点击查看全图。
使用缆绳组件
可以两种不同方式将缆绳组件添加到项目关卡。在以下部分,我们将说明为项目关卡添加缆绳的两种不同方法。
从 Modes 面板中使用缆绳组件
如从 Modes 面板中使用缆绳组件,需要执行以下操作:
-
首先确保 Modes 面板为显示状态,然后在 Search Classes 框中输入
Cable
。 -
如要将缆绳 Actor 添加到世界场景,点击 Modes 面板中的缆绳 Actor 并将其拖入关卡。
点击查看全图。
-
现在便可放置、旋转和缩放缆绳 Actor,使其满足关卡的需求。
在蓝图中使用缆绳组件
如要在蓝图中使用缆绳组件,需要执行以下操作:
-
首先新建一个名为 BP_Cable 的蓝图,使其以 Actor 用作父类。
-
然后从 BP_Cable 蓝图的 Components 部分点击 Add Component 按钮,然后在列表中找到 Cable 组件。找到组件后,点击将其添加至组件列表。
-
添加缆绳组件后,在组件列表中选择 Cable 组件,以便通过 Details 面板调整其属性。将其他设置保留为默认,然后编译并保存蓝图。
-
在 Content Browser 中找到缆绳蓝图,然后将其拖入关卡。放置后,即可使用移动和旋转工具根据需求调整位置。
点击查看全图。
在缆绳末端附加物体
可在缆绳的任意一端附加物体,使其沿缆绳晃动。需要执行以下步骤在 UE4 中实现此功能:
-
首先需要添加一个 缆绳 Actor 和一个 静态网格体 到关卡中。
点击查看全图。
-
在 World Outliner 中找到需要附加到缆绳 Actor 末端的静态网格体,然后将其拖至缆绳 Actor 的上方。执行此操作后将显示以下输入窗口。
点击查看全图。
-
选择 Cable End 选项,即可在视口中看到静态网格体附着到缆绳 Actor 的末端。
-
在关卡中选中缆绳 Actor。然后在 Details 面板的 Cable 部分中,取消勾选 Attach End 框。
点击查看全图。
-
执行此操作后,缆绳便能在视口中自由回荡。
碰撞和刚性
缆绳组件拥有让缆绳和世界场景发生碰撞的选项,控制缆绳的刚度。为启用此功能,请按以下步骤操作。
-
首先,在缆绳组件 Details 面板的 Cable 部分下按下白色小三角形显示高级卷栏选项。
-
勾选 Enable Stiffness 和 Enable Collision 选项启用这些功能。
点击查看全图。
-
现在,移动缆绳 Actor 或物体与缆绳 Actor 发生碰撞时,缆绳将和接触到的物体发生碰撞。
属性详解
下表详细说明了缆绳组件上的每个属性:
Cable
属性名称 | 描述 |
---|---|
Attach Start | 修复到物体的头端,或放任不管。如为 false,组件变形只用于缆绳头端的初始位置。 |
Attach End | 修复到物体的末端(使用 AttachEndTo 和 EndLocation),或放任不管。如为 false,AttachEndTo 和 EndLocation 只用于缆绳末端的初始位置。 |
Attach End To | 定义缆绳最终位置的 Actor 或组件。 |
Component Property | 附加缆绳的组件属性的命名。 |
Attach End To Socket Name | 进行附加的 AttachEndTo 组件上的套接字命名。 |
End Location | 缆绳的最终位置,如经指定则相对于 AttachEndTo(或 AttachEndToSocketName),否则则相对于缆绳组件。 |
Cable Length | 缆绳的静止长度。 |
Num Segments | 缆绳拥有的分段数量。 |
Solver Iterations | 解算器迭代的数量,控制缆绳的刚度。 |
Substep Time | 控制缆绳的模拟分步时间。 |
Enable Stiffness | 为缆绳添加刚性约束。 |
Enable Collision | 在每个分步为每个缆绳粒子执行清扫,避免与世界场景发生碰撞。使用组件上的 Collision Preset 决定碰撞的对象。这会极大提高缆绳模拟的开销。 |
Cable Forces
属性名称 | 描述 |
---|---|
Cable Forces | 应用到缆绳中所有粒子的力矢量(世界空间)。 |
Cable Gravity Scale | 应用到此缆绳的世界重力比例。 |
Cable Rendering
属性名称 | 描述 |
---|---|
Cable Width | 缆绳几何体的宽度。 |
Num Sides | 缆绳几何体的面数。 |
Tile Material | 沿缆绳长重复材质的次数。 |
额外参考
以下部分为外部参考,可在此获得缆绳组件的更多灵感。阅读以下 Thomas Jakobsen 的文章,了解 韦尔莱算法的更多详情。