物理系统

此类拼图用来模拟对象的物理系统行为。

内容

物理拼图参考

create physics world(创建物理世界)

使用指定的gravity(重力)frames-per-second(帧/秒)参数初始化物理引擎。默认的gravity(重力)值为9.8,对应于地球表面重力。零代表没有重力,类似在太空。fps值越高,模拟质量越好,但要牺牲性能。

soft body(柔体)复选框激活了柔体模拟功能。

基于引擎,这个拼图还可以实现碰撞检测和自动图形同步。

create rigid body(创建刚体)

从一个指定的对象创建一个实体,类型为dynamic(动态)kinematic(运动)static(静态)ghost(幽灵)。指定碰撞形状,并为该体设置质量(仅对dynamic(动态)体有效)。也适用于对象列表,组(或者组的列表)以及 all objects(所有对象) 拼图。

实体的类型:

支持的刚体形状:

出于性能因素,优先考虑原始物理形状(盒子、球体、胶囊、圆锥体和圆柱体)而不是网格形状。另外,static网格的性能比dynamic, kinematicghost 的性能好得多。

create soft body(创建柔体)

从一个指定的对象中创建一个柔体,具有给定的总mass(质量)和可选的pressure(压力)参数。也适用于对象列表,组(或者组的列表)以及 all objects(所有对象) 拼图。

支持的柔体形状:

在创建柔体之前,不要忘记激活 physics world(物理世界) 上的柔体模拟。

Remove physics body(删除物理实体)

通过破坏与之相关的实体,从指定的对象中移除物理特性。也适用于对象列表,组(或者组的列表)以及 all objects(所有对象) 拼图。

apply body param(应用实体参数)

为与指定对象相关的实体设置参数。也适用于对象列表,组(或者组的列表)以及 all objects(所有对象) 拼图。

参数:

当两个对象发生碰撞时,它们的摩擦力和恢复力参数会被考虑在内。

get body param(获取实体参数)

从与指定对象相关的实体中获取一个参数。

参数:

set body state(设置实体的状态)

改变与指定对象相关的实体的状态。也适用于对象列表,组(或者组的列表)以及 all objects(所有对象) 拼图。

参数:

on simulation tick(在模拟启动时)

在物理模拟启动的瞬间 之前之后 ,触发在 "do" 槽中指定的拼图。

物理模拟计时与创建 物理世界 时指定的FPS值相对应,与渲染帧不一致。因此,我们建议你在模拟启动之前应用力、速度和脉冲,在模拟启动之后检测实体之间的碰撞。这样您就可以实现更稳定和更真实的模拟。

snap body(对齐实体)

通过复制实体的变换数据,将与指定对象相关的实体以及对象本身移动到另一个对象的位置。同时复制旋转。对列表、组或 "all objects(所有对象)" 拼图不起作用。

作用类似于apply body param / position(应用体参数/位置)拼图。

add constraint to(添加约束到)

通过一个给定类型的约束来连接两个实体。

约束类型:

remove constraint from(从...移除约束)

移除物理约束。

anchor soft body(锚定柔体)

将柔体锚定在给定矢量所代表的空间点的给定刚体上。

detect collisions and collision info(检测碰撞与碰撞信息)

检测指定的实体与另一个实体(或列表中的任一实体与组)在此刻是否有碰撞。如果有碰撞,那么在 "if touching do" 槽中的拼图会被触发,否则将触发在 "if not touching do" 插槽中的拼图。

"detect collisions" 拼图在每一个渲染帧中都会触发它的回调插槽。

collision info 拼图会输出一个 字典 ,其字段如下:

Extending with JavaScript(用JavaScript进行扩展)

在您开始阅读以下内容之前,请先熟悉本用户手册的 使用JavaScript 部分。

为了构建物理拼图,我们使用了名为Ammo.js的JavaScript库。这是流行的开源物理引擎Bullet的JavaScript版本,经过编译可以在浏览器中使用。

要熟悉Bullet,请查阅GitHub上的 Bullet Physics SDK Manual 以及官方的 Bullet API Reference

在Verge3D中,您可以通过使用Ammo命名空间直接执行Bullet/Ammo.js APIs。

var myVector = new Ammo.btVector3(1.0, 0.0, 0.0); console.log('My physics vector is:', myVector.x(), myVector.y(), myVector.z());

此外,您还可以通过 your_app_name.js 模块 的 runCode() 函数的 puzzles 参数或 exec script(执行脚本) 拼图中的内置 puzzles 变量, 来访问我们在拼图中使用的以下数据结构:

World

根据所初始化的物理世界,它可以是 btDiscreteDynamicsWorldbtSoftRigidDynamicsWorld 类的实例。

var gravity = puzzles.physics.world.getGravity(); console.log('World gravity:', gravity.y());

Physics Bodies

实体作为键值数据存储在 Puzzles.physics.bodies 对象中。

var body = puzzles.physics.bodies['Whirligig']; console.log('Body mass:', 1.0 / body.getInvMass());

刚体是 btRigidBody 类的实例,而柔体是 btSoftBody 类的实例。

Physics Constraints

Bullet/Ammo 约束以键值数据的形式存储在二维的 Puzzles.physics.constraints 对象中。

var hingeConstraint = puzzles.physics.constraints['Suzanne']['Axis']; hingeConstraint.enableAngularMotor(true, 10, 10);

这些名称分别代表约束的第一和第二实体。

Physics Sync List

Verge3D拼图使用所谓的同步列表在空间中移动由实体代表的对象。同步列表不能被直接访问,所以您需要使用下面的API方法来添加实体到该列表,或移除出列表。

// add obj / body to the sync list // the type can be 'DYNAMIC', 'KINEMATIC', 'STATIC', 'GHOST', or 'SOFT_BODY' puzzles.physics.addToSyncList(obj, body, 'DYNAMIC'); // remove obj / body from the sync list puzzles.physics.removeFromSyncList(obj, body);

在使用拼图时遇到困难?

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