物理系统

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

模拟物理的可视化编程块

有关使用示例,请查看 Physics 演示(也可在资源商店中找到)。

内容

物理拼图参考

create physics world

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

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

用可视化编程创建物理世界

在底层,此拼图还启用了碰撞检测和自动图形同步。

create rigid body

从一个指定的对象创建一个物理体,类型为dynamickinematicstaticghost。指定碰撞形状,并为该体设置质量(仅对dynamic体有效)。也适用于对象列表,组(或者组的列表)以及 all objects 拼图。

用可视化编程创建刚体

物理体类型:

支持的刚体形状:

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

create soft body

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

创建和模拟柔体的可视化逻辑块

支持的柔体形状:

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

remove physics body

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

移除物理体的块

apply body param

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

应用物理参数的可视化编程块

参数:

angular damping
用于减缓对象旋转的阻尼系数:0 — 没有阻尼,1 — 最大阻尼。输入值被钳制在[0, 1]范围内。
angular factor
设置指定体的旋转自由度。例如,通过设置Z分量为零,您可以禁止体围绕上下(Blender, Max)或前后(Maya)轴旋转。
angular velocity
设置旋转速度矢量。
ccd motion threshold
用于模拟连续碰撞检测(CCD)物理学的运动阈值。指定低值,例如0.001
ccd swept sphere radius
用于模拟连续碰撞检测(CCD)物理的扫掠球半径。这个值应该与碰撞对象的大小相对应。例如,为了模拟尺寸为0.01米的小子弹,这个值设置为0.5会比较安全。 用可视化编程进行连续碰撞检测
force
在指定的方向上通过施加指定的力矢量来推动体。
friction
固体相互滑动时相对运动的阻力系数。
gravity
为指定的体单独分配重力。此值可以指定为矢量或数字。在数字的情况下,该值设置上下重力因子(沿Blender/3ds Max的Z轴或Maya的Y轴)。
impulse
作用类似于Linear Velocity,但也考虑到了体的质量(较重的对象将获得较少的速度)。 应用物理值的可视化逻辑块
linear damping
将使运动对象减速的阻力系数:0 — 没有阻尼(例如自由落体),1 — 最大阻尼(例如对象下落时没有加速度)。输入值被钳制在[0, 1]范围内。
linear factor
设置指定体的位置自由度。例如,通过设置Z分量为零,您可以禁止体的上下(Blender, Max)或前后(Maya)运动。
linear velocity
设置运动速度矢量。
margin
用于提高模拟稳定性和性能的碰撞边距。仅对meshcone碰撞形状指定边距。对于其他碰撞形状(boxspherecapsulecylinder),此值由物理引擎计算。
position
设置体的位置(作用类似于snap body拼图)。
restitution
弹性系数:0 — 体像粘土一样没有弹性,1 — 体的行为像由橡胶制成。
rotation
设置体的旋转(以XYZ顺序的欧拉旋转,作用类似于snap body拼图)。
stiffness
柔体(如体积和绳索)的刚度。已弃用,请改用apply soft body param
torque
在指定的方向上旋转体。
torque impulse
作用类似于Angular Velocity,但也考虑到了体的质量(较重的对象将获得较少的旋转速度)。

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

get body param

从与指定对象关联的物理体中获取一个参数。

检索物理值的可视化逻辑块

参数:

angular damping
用于减缓对象旋转的阻尼系数:0 — 没有阻尼,1 — 最大阻尼。
angular factor
指定体的旋转自由度(XYZ)。
angular velocity
旋转速度矢量。
ccd motion threshold
用于模拟连续碰撞检测(CCD)物理学的运动阈值。
ccd swept sphere radius
用于模拟连续碰撞检测(CCD)物理的扫掠球半径。
force
施加到体上的力矢量。
friction
固体相互滑动时相对运动的阻力系数。
gravity
施加在体上的重力矢量(XYZ值)。
linear damping
将使运动对象减速的阻力系数:0 — 没有阻尼(例如自由落体),1 — 最大阻尼(例如对象下落时没有加速度)。
linear factor
指定体的位置自由度(XYZ)。
linear velocity
运动速度矢量。
margin
用于提高模拟稳定性和性能的碰撞边距。
position
体的XYZ位置。
restitution
弹性系数:0 — 体像粘土一样没有弹性,1 — 体的行为像由橡胶制成。
rotation
体的XYZ欧拉旋转。
stiffness
柔体(如体积和绳索)的刚度。已弃用,请改用get soft body param
torque
施加到体上的扭矩矢量。

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

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

锚定碰撞对象的可视化逻辑块

apply soft body param

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

应用柔体参数的可视化编程块

参数:

anchor hardness
锚点硬度系数:0 — 无锚点影响,1 — 最大锚点影响。
angular stiffness
角刚度:0 — 无角刚度,1 — 最大角刚度。
collision flags
柔体碰撞标志:0 — 不与其他刚体碰撞,1 — 简化碰撞,17 — 改进的碰撞。默认值为17。
damping coefficient
阻尼系数:0 — 无阻尼,1 — 最大阻尼。
drag coefficient
阻力系数(即流体阻力)。必须为正数。
dynamic friction
动摩擦系数。0 — 无摩擦,1.0 — 最大摩擦。
lift coefficient
升力系数。必须为正数。
linear stiffness
线性刚度:0 — 无线性刚度,1 — 最大线性刚度。
position iterations
位置求解器迭代次数。值越高质量越好。必须为正整数。
pressure coefficient
压力系数(例如用于气球)。
velocity iterations
速度求解器迭代次数。值越高质量越好。必须为正整数。
wind velocity
风速矢量。

get soft body param

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

获取柔体参数的可视化逻辑块

参数:

anchor hardness
锚点硬度系数:0 — 无锚点影响,1 — 最大锚点影响。
angular stiffness
角刚度:0 — 无角刚度,1 — 最大角刚度。
collision flags
柔体碰撞标志:0 — 不与其他刚体碰撞,1 — 简化碰撞,17 — 改进的碰撞。
damping coefficient
阻尼系数:0 — 无阻尼,1 — 最大阻尼。
drag coefficient
阻力系数(即流体阻力)。必须为正数。
dynamic friction
动摩擦系数。0 — 无摩擦,1.0 — 最大摩擦。
lift coefficient
升力系数。
linear stiffness
线性刚度:0 — 无线性刚度,1 — 最大线性刚度。
position iterations
位置求解器迭代次数。
pressure coefficient
压力系数(例如用于气球)。
velocity iterations
速度求解器迭代次数。
wind velocity
风速矢量。

detect collisions and collision info

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

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

碰撞检测的可视化编程块

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

检索碰撞信息的可视化编程块

用JavaScript进行扩展

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

为了构建物理拼图,我们使用了名为Ammo.js的JavaScript库。该库基本上是流行的Bullet物理引擎编译为在浏览器中使用的版本。

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

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

const 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类的实例:

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

Physics Bodies

物理体作为键值数据存储在puzzles.physics.bodies对象中:

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

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

Physics Constraints

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

const 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),在线寻求帮助。