物理优化
物理相互作用的计算可能非常苛刻。有一些优化技术可为您的交互式项目提供高性能和整体稳定性。
常用设定#
将全局物理设置保持在合理的要求水平。
-
从相机中指定 距离 ,但不会从中计算物理相互作用。如果摄像头与基于物理的节点之间的距离超过此限制,则该节点将冻结,并跳过其物理计算,直到该节点更靠近摄像头为止。
从与相机的指定距离开始,布料模拟暂停
- 使用Iterations参数可以提高稳定性,但也可能导致更高的负载。大量的迭代可能会导致明显的滞后,因为会自动跳过非常耗时的计算。对于简单的场景,一个物理迭代就足够了。
- 调整 预算 用于物理模拟的时间。
碰撞检测优化#
过滤互动#
项目中的每个基于物理学的对象极不可能与所有其他对象进行交互。对象很可能可以分为专用于某些任务的组。
如果您有多个参与物理模拟的对象,则可以使用 Bit Masking 机制将几乎不会互相影响的对象划分为不同的“组”。
限制碰撞#
为预期会碰撞的特定形状Collision Masks,表面和实体设置匹配的 。如果蒙版不匹配,则形状和实体将通过相互忽略。
为平面和球体计算碰撞,但由于不匹配Collision蒙版而忽略了一个框
|
球体物理形状的Collision蒙版
|
盒子物理形状的Collision蒙版
|
平面的Collision蒙版
|
地面的Collision蒙版
|
在Unigine中,您可以使用排除掩码准确地设置过滤。此蒙版允许忽略具有匹配排除蒙版的形状,而不考虑其碰撞蒙版。
不适用于物理交互的表面应禁用Collision标志。例如,座舱内的仪表板永远不会参与外部的碰撞检测。
避免检测到不必要和不必要的冲突是减少物理计算量的基本方法。
过滤物理效果#
通过使用 指定与碰撞相同的某些物理Physical Masks,它们仅会影响相应的物体。在下图中,一个Physical Wind对象会影响布料横幅,但不会影响球体。
物理风影响布料但不影响球体 |
布标的Physical蒙版
|
球形的Physical蒙版
|
Physical Wind对象的Physical掩码
|
交叉口罩#
交点是指定区域(或线)和对象的通用点。射线投射和曲面之间的相交的计算是快速且廉价的,因此有时可以代替计算碰撞而使用。例如,可以使用交叉点简化车轮与地面的碰撞的计算。
尽管它只是一种编程方法,但它需要设置 Intersection掩码 进行过滤。
降低碰撞机的复杂性#
通常,大多数3D对象应该由物理引擎用于碰撞检测( collider )的复杂且详细的可见网格和不可见的简化形状表示。
详细的可见网格
|
使用简化形状的不可见物理表示形式
|
使用更简单的形状#
由简单图元组成的物理 shapes 使得碰撞计算更容易,同时保持高性能和准确性。因此,建议使用简单的图元( Sphere , Capsule , Cylinder , Box )对几何进行近似估算更快,内存需求更少。
当复杂形状和复合几何无法实现所需的形状时,应选择复杂形状,例如凸包和自动生成的凸包的集合期望的目标。
同时,应将形状的数量保持为 low ,以避免繁琐的计算而导致性能下降。请记住,形状不必复制它近似的网格。即使基元不精确,在大多数情况下它们也可以提供可接受的结果。
使用更简单的几何#
用于检测表面碰撞的几何形状越简单,将获得越多的性能。
如果代表物理障碍物的网格具有多个详细级别(LOD),则最不详细的级别最适合于碰撞和相交检测。对此LOD启用Collision和Intersection选项,对其他LOD禁用它们。
使用基本体来逼近碰撞形状也是一种好习惯。您可以采用以下方法:
-
确保原始节点不是 Collider —检查是否已禁用Collision标志的表面,实体和形状。从现在起,碰撞检测就不再考虑它了。
-
通过在菜单栏中选择Create -> Primitive -> Cylinder将圆柱对象添加到场景中,并用图元覆盖原始网格。
- 请确保已为原始节点启用了曲面的Collision选项。
-
隐藏基本体表面的视觉表示。您可以通过清除其Viewport和Shadow蒙版,或仅通过将其Max Visibility参数设置为负无穷大(-inf)来执行此操作,这可以确保在任何距离都看不到该表面。
现在,详细的网格仅提供视觉表示,而为原始圆柱体计算物理相互作用。
碰撞检测方法#
连续碰撞检测是一项非常苛刻的操作,因此,建议仅将这种方法用于快速移动的物体和需要精确计算的物体。
在大多数情况下,离散碰撞检测就足够了。为此,请选择一个形状,然后取消选中Continuous标志。
优化身体#
冷冻#
建议对所有Rigid, 和FractureRagdollbodies都启用Freezing。这样可以跳过不动对象的物理计算,直到它们受到任何力或对象的影响,从而节省大量计算资源。
要启用冻结,请执行以下步骤:
- 为上面列出的所有类型的身体启用Freezable标志。
- 设置适当的值Frozen Linear Velocity和Frozen Angular Velocity每个身体的参数或调整全局参数。将这些全局冻结阈值与为每个身体设置的阈值进行比较,然后选择最大值以冻结身体。
- 调整Frozen Frames的数量。值越低,冻结的对象越快。
压裂#
尽管断裂体是一种相对便宜的类型,但是在大量断裂件的情况下,对性能的影响可能会变得很大。为避免性能下降,可以使用以下技巧:
- 使用Volume Threshold参数来减少断裂件的数量。
- 从场景中移除骨折的身体。
可以在UnigineScript1示例的Physics部分中找到一个基于代码的示例,该示例说明了如何从场景中删除(随时间消逝)碎片。