Verge3D物理系统指南 - Soft8Soft
Description: 如何使用Verge3D物理引擎来模拟场景中的动力学和碰撞。

# Verge3D物理系统指南

Verge3D附带了一个物理引擎，可以让您模拟像真实世界一样的物理特性。这个功能对于创建3D游戏和AR/VR应用特别有用。

我们使用开源的物理引擎Bullet作为物理系统后端,它的web版本被称为 ammo.js。

## 内容

- 物理系统入门
- 使用拼图
- 一般性建议
- 创造第一人称角色
- 模拟车辆物理

#

## 物理系统入门

在使用物理系统之前，必须将物理模块添加到应用中。您可以在应用管理器中创建新应用时启用该模块。

或者，您可以将物理模块添加到现有的应用中。为此，将文件ammo.wasm.js和ammo.wasm.wasm从verge3d/build文件夹复制到应用文件夹，并添加这行代码：

`<script src="ammo.wasm.js"></script>`

到应用的 .html 中v3d.js 脚本的上方。

#

## 使用拼图

请在 物理拼图章节中熟悉这些拼图。

#

## 一般性建议

- 一定要在建模套件中应用比例，因为物理引擎会忽略对象的比例。
- 为了得到最好的结果，对象的原点应该与质心重合。在Blender2.8中，请使用如下方式 物体 > 设置原点 > 原点到质心（体积）设置。
- 切勿直接对 动态 体直接进行位置和动画设置。作为替代，使用 apply vector(应用向量) 执行力/冲量/向量操作，使用 snap body(绑定体) 拼图执行绑定到另一个对象的操作。
- 出于性能优化考虑，Verge3D会禁用一段时间后不活动的 动态 实体。您可以通过应用一些矢量将它们与其他物体碰撞，或使用 set body state(设置体状态) 拼图来重新激活它们。如果您需要这些体始终处于活动状态，使用此拼图为它们设置 disable deactivation 状态。
- 启用连续碰撞检测（CCD）技术，以提高快速运动物体的模拟质量，如射弹、弹球、台球、保龄球等。要做到这一点，请在该物体上设置 CCD运动阈值 和 CCD扫描球体半径 参数。参见 这里 的更多信息。
- 请记住，你不能在 static/static、static/kinematic 或 kinematic/kinematic 物体之间 检测碰撞 。如果不能使用 dynamic 实体，可以考虑指定 ghost 物理学来实现移动的非动态物体与 static/kinematic 环境的近似检测。

#

## 创造第一人称角色

第一人称角色模式不仅适用于射击游戏和RPG游戏，也适用于任何需要调查大型环境的应用。例如，建筑可视化应用，电子学习软件，交互式参观指南，虚拟博物馆，文化设施模拟，甚至是3D虚拟卖场等。此外，您可以在VR应用中融入第一人称角色，使它更加真实和有趣！

有关使用示例，请查看 Snowballs VR 演示（也可在资源商店中找到）。

实现FPS模式有很多可能的方法，但对于Verge3D初级用户，我们建议您遵循这篇简短的指南，以更快地实现效果。

创建一个胶囊形状对象代表角色。调整它的高度和宽度，使其看起来更逼真。确保正确设置对象的中心。

在拼图中，为角色指定dynamic capsule的body，并禁用其旋转自由度。通过这样，允许角色移动，但不允许旋转。同时，在胶囊上应用disable deactivation。

由于角色需要在地板(+墙壁）或地面上行走，使用相应的create physics body拼图来创建这样的体。

下一步是配置摄影机。摄影机不会分配任何物理特征，因为我们只需要它作为“眼睛”即可。设置First-Person控件，但不要分配任何碰撞材质（我们将使用物理引擎提供的全功能碰撞检测，而不是基本的地板/墙壁模拟）。此外，取消选中Allow Panning，并将Movement Speed值设置为零：

现在需要把摄影机附加在角色的“头”上了。不需要为头部创建模型，在场景中添加一个名为“Head”的空对象，并将其设置为胶囊模型的上部的子物体。这样“Head”就会随着角色移动。

通过使用附加的“Head”对象，您可以在运行时将摄影机与角色连接或分离。若要连接摄影机，请使用 parent 和 snap to object 拼图：

若要分离摄影机，请在使用parent拼图时将to object字段留空。

角色创建好了！现在是时候让它在场景中移动了。在最基本的情况下，我们需要在用户按下向上箭头键时向前移动。为此，将 linear velocity 矢量应用于角色，该矢量是从摄影机水平方向计算的。要使模拟稳健，应始终使用 on simulation link 拼图。

要在移动设备上移动您的角色，您需要额外的“controller”元素。您可以使用摄影机父级的3D对象创建它们，也可以使用 HTML元素.

若要在VR模式下移动角色，可以使用 get controller property(获取控制器属性) 和 get gamepad property(获取游戏手柄属性) 拼图来获得VR控制器按钮与轴的状态。

#

## 模拟车辆物理

逼真的车辆物理模拟在交互式汽车定制器或赛车游戏等应用中很实用。

有关使用示例，请查看 Arcade Racing 演示（也可在资源商店中找到）。

## 遇到问题？

欢迎您随时在 论坛上提问！您还可以加入中文用户社区QQ群(171678760)，在线寻求帮助。