物理
与许多其他使用第三方解决方案的引擎不同,Unigine具有其自己的内置物理模块。
使用内置的物理模块的优势:
- 内存效率-使用一个世界的实例(如果使用外部解决方案,则必须再创建和存储一个世界的副本)。
- 性能-避免了对外部函数的调用,过多的数据转换以及集成系统之间的传输。
应该清楚的是,这不是对现实世界物理的高精度模拟!模拟只是基于简化的计算和降低的精度的近似值,可以在实时模式的严格限制内提供逼真的外观。要获得真实的结果,总是需要在准确性和性能之间进行权衡。
尽管Unigine通常使用基于脉冲的方法简化的牛顿物理学,但将碰撞检测,重力,摩擦,浮力进行了集成>,关节和外部物理力提供了物理体以及它们之间复杂相互作用的逼真的模拟。
也可以看看#
内置物理的用例和局限性#
UNIGINE的物理模块非常有限;但是,在许多情况下,它可以帮助程序员和设计师简化工作。以下是一些使用案例列表,在这些使用案例中,最好使用内置物理而不是硬编码或基于骨骼的动画:
- 碰撞检测(防止穿过壁移动,固体互穿等)
- 完全弹性碰撞的模拟(动能的分布)
- 各种关节,电机和弹簧的仿真
- 基本物理现象的模拟:重力,摩擦(静态和滑动),浮力(用于相对平静且没有大浪的水)
- 外力模拟(风,力场)
- 程序网格破坏
- 可变形的衣服和绳索的仿真
- Rag doll simulation
应该理解,使用内置物理方法进行模拟的范围仅限于上述情况。因此,有很多情况无法通过这种方式解决,包括以下情况:
尽管可以使用内置物理方法解决某些涉及大量对象的任务,但它可能会大大降低性能。在这种情况下,与上面列出的情况一样,建议使用下一章中介绍的替代方法。
观看我们的物理视频教程的片段,说明本章。
内置物理的替代方法#
当无法通过内置物理模块解决问题或花费过多时间时,可以使用其他几种方法:基于骨骼的动画,硬编码或使用外部物理引擎。
基于骨骼的动画#
在某些情况下,如果无法通过物理模拟来实现对象的行为或需要进行过多的计算,则可以使用基于骨骼的动画。
基于骨骼的动画是一种将动画对象由两个组件表示的技术:
- 用于绘制对象的表面表示(称为皮肤或 mesh )
- 用于对网格进行动画处理(姿势和关键帧)的互连骨骼的层次结构集(称为骨架或装备)
此技术用于使动画处理更加方便。装备的每个骨骼都与对象网格的某些部分相关联。外观是创建此关联的过程。更改骨骼变形会修改网格。
有两种使用骨骼动画的方法:
- 使用保存在 .anim file
- 使用ObjectMeshSkinned类实时修改骨骼变换的程序骨骼动画
网格和动画可以使用第三方图形软件(3ds Max, Maya等)创建,然后导入到UNIGINE的原生格式(.mesh 和 .mesh),并在世界上使用。
基于代码的方法#
替代物理模拟以达到不降低性能的真实结果的另一种方法是基于代码的方法,该方法涉及编写一些代码以编程方式更改对象及其行为的转换。
- 第一个用例是模拟由于非弹性碰撞导致的物体变形。内置物理方法不执行非弹性碰撞模拟。但是,我们可以检测到碰撞,然后在脚本(在 UnigineScript , C ++ 或 C#中)中更改变形对象的网格。 。
变形(即更改网格顶点的位置)仅适用于动态网格!
- 第二个用例是当存在大量交互元素时,例如坦克履带和悬架。如果我们有很多坦克,那么物理计算将使FPS下降。此外,由于近似误差,整个机构可能会破裂或看起来不自然。我们编写了一个脚本,该脚本计算悬架和履带板的运动,从而提供稳定性和所需的逼真度。
使用基于代码的技巧可以维持可接受的FPS并调整对象的行为。
外部物理引擎#
在需要精确的物理模拟(例如飞行动力学,流体动力学等)的情况下,建议使用提供所需功能的专业第三方解决方案。 Unigine当前不提供用于第三方物理集成的解决方案。因此,有关如何将某个第三方解决方案集成到您的应用程序中的所有必要的产品特定准则,都应从提供该解决方案的一方那里获得。
组合法#
通常,结合使用不同的方法或技术可获得最佳结果。因此,上述方法可以成功组合以提供令人信服的外观和可接受的性能。
用例说明了几种方法的成功结合,与模拟复杂对象的物理破坏有关,例如倒塌的桥梁,爆炸的建筑物等。在这种情况下,无法实时进行逼真的模拟。但是,可以使用第三方脱机物理模拟软件对其进行预先计算,然后将其转换为基于烘焙的骨骼动画,以用于实时应用程序。
对象的物理交互。基本实体#
尽管场景中的大多数节点类型用作辅助手段或装饰,但 Object 类型可以具有物理属性并与其他对象和环境交互。为了分配这些属性,对象应具有“ body ”(对象的物理近似值),并且本体应至少具有一个“ shape ”(物体所占据的空间体积)。为了连接实体并限制它们之间的相对运动,使用了“ 关节”。下图说明了这些实体之间的关系。
身体#
要与其他对象以及外部物理力相互作用,一个对象必须具有身体。可以将物体视为对象的物理近似,它描述物体的行为并代表其动态参数集,例如质量,速度等。物体有几种类型:dummy, rigid, ragdoll, fracture, rope, cloth, water, path。每种类型的主体都用于模拟特定类型的对象。
身体的质量参数可以手动设置,也可以使用基于形状的参数自动确定。人体具有多种形状时很方便。
根据阿基米德原理,将体重和密度用于浮力模拟。
形状#
身体决定对象的行为时,形状表示身体所占据的空间量。形状是不可见的,不必与对象的网格相同。实际上,粗略近似(sphere, capsule, cylinder, box, convex hull)通常更有效且难以区分。物理物体具有一个或多个碰撞形状,允许对象彼此碰撞。
具有形状的对象也会在重力作用下掉落,从静态表面反弹或沿其滑动。滑动和弹跳由形状参数列表中包括的恢复力和摩擦系数确定。没有分配单一形状的物体的行为类似于虚拟物体,可以使用关节将其连接到其他物体,但不会发生碰撞并且不受重力的影响。
联合#
在虚拟世界中,就像在现实世界中一样,我们希望具有由多个相互连接的部分组成的复杂对象(例如,机械臂或汽车)。这正是关节的用途。
关节连接两个刚体,并表示某些约束,即,它限制了相连体彼此之间的运动。当施加在关节上的力太大时,关节会断裂。可破坏的关节的实现包括线性运动和角运动的限制,因此,如果力超过这些限制,则关节会断裂。关节有几种类型:fixed, hinge, ball, prismatic, cylindrical, suspension, wheel, path。
使用关节时,确保质量平衡非常重要-避免将过重的物体连接到轻的物体,否则系统可能会变得不稳定。如前所述,物理模拟使用近似计算,因此,如果两个连接的物体之间的质量差异很大,则误差的累积和精度问题将导致结果不稳定。
因此,在制作汽车模型时,不要将车身的质量设置为等于2000 kg,将车轮的质量设置为等于10 kg,最好使用5 kg的车身和每个车轮1 kg的重量。提供逼真的行为。
碰撞和相交检测#
为了限制固体的互穿,防止穿过壁移动并使事物看起来更自然和眼睛熟悉,使用了碰撞检测。
Unigine中实现了两种冲突检测:
- 离散冲突检测是在一定时间间隔内执行的,每个帧都与其他帧分开处理。通常,离散化可以提高性能。但是,当项目帧速已经很低时,一个小的快速移动物体很可能会从一个点移动到另一个点,而不是在那里平稳移动,并且不会检测到碰撞。
- 连续碰撞检测 不会遇到此问题,因为移动体沿其轨迹(在两个相邻帧之间)被挤压。如果有物体进入该容积并检测到碰撞,则及时收回车身以纠正碰撞反应。
碰撞检测是一项非常昂贵的操作,并且由于我们的场景中可能有数百个对象,因此需要花费大量精力进行优化。
- 导致成本增加的第一个参数是碰撞形状复杂度。通常,大多数3D对象由物理引擎用于碰撞检测的复杂且详细的可见网格和不可见的简化的 shape 表示。 上方列出了可用的形状类型。
为减少计算量,强烈建议尽可能使用简单的碰撞形状而不是复杂的碰撞形状。
- 第二个参数是要执行的检查次数-最坏的情况是全部反对。为了排除不必要的检查(例如,两个对象彼此相距很远,几乎不会发生碰撞),将场景分成多个部分。
碰撞检测之后有一个重要步骤-碰撞响应或碰撞的结果(例如,两个球相互弹开)。在计算碰撞响应时会考虑摩擦,恢复和其他参数。
如果对象的某些曲面参与碰撞,而其他不参与,则可以基于每个曲面启用碰撞检测。例如,您可以为座舱内的仪表板禁用碰撞检测,因为该仪表板被其他表面覆盖。
相交检测是碰撞检测的核心,但是射线相交(ray casting)的特殊情况,其用途略有不同。从某个方向的某个点投射的光线与表面之间的交点的计算是快速且廉价的,因此有时可以用来代替计算碰撞。例如,计算车轮与地面的碰撞会花费时间并降低帧速率。在这种情况下,我们可以使用从汽车底部投射的光线与地面的交点,而不是使用碰撞形状进行精确的碰撞检测,从而降低了计算成本并提高了性能。
为了使冲突和相交检测灵活而有选择性,并降低了计算成本,使用了位掩码的机制。例如,我们有一个不参与与他人互动的对象,但我们希望它位于地面上。使该对象的碰撞位掩码与地面匹配(掩码中的至少一位应匹配)可提供必要的效果。一个对象可以参与多次碰撞和相交检查,因为只需要掩码中的一位即可匹配一对对象。
物理模拟#
物理模拟是按照以下阶段的循环顺序在每帧的基础上执行的:
当并行执行某些操作时, UNIGINE中的物理是在多线程模式中模拟的。
物理使用其自己的固定的 FPS 进行仿真,该FPS不取决于渲染帧频:此处无法使用变量FPS,因为它会使计算结果不稳定。
为场景中所有动态对象进行物理计算需要太多时间。为了确保一致的帧速率并排除不必要的计算,使用了一些优化方法:
全局物理设置#
可以通过 Editor 中的 Physics settings 面板访问全局物理设置(FPS,重力,模拟距离,冻结帧和速度,穿透因子,穿透公差)。