This page has been translated automatically.
视频教程
界面
要领
高级
实用建议
UnigineEditor
界面概述
资产工作流程
设置和首选项
项目开发
调整节点参数
Setting Up Materials
Setting Up Properties
照明
Landscape Tool
Sandworm
使用编辑器工具执行特定任务
Extending Editor Functionality
嵌入式节点类型
Nodes
Objects
Effects
Decals
Light Sources
Geodetics
World Objects
Sound Objects
Pathfinding Objects
Players
编程
基本原理
搭建开发环境
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine Tools
GUI
双精度坐标
应用程序接口
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
注意! 这个版本的文档是过时的,因为它描述了一个较老的SDK版本!请切换到最新SDK版本的文档。
注意! 这个版本的文档描述了一个不再受支持的旧SDK版本!请升级到最新的SDK版本。

物理优化

物理相互作用的计算可能非常苛刻。有一些优化技术可为您的交互式项目提供高性能和整体稳定性。

常用设定#

全局物理设置保持在合理的要求水平。

注意
要配置物理设置,请在主菜单中选择Window -> Settings,然后选择Runtime -> World -> Physics部分,以打开Settings窗口。

  • 从相机中指定 距离 ,但不会从中计算物理相互作用。如果摄像头与基于物理的节点之间的距离超过此限制,则该节点将冻结,并跳过其物理计算,直到该节点更靠近摄像头为止。

    从与相机的指定距离开始,布料模拟暂停

    注意
    Cloth, RopeWater物理体也有自己的Simulation Distance参数。
  • 使用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启用CollisionIntersection选项,对其他LOD禁用它们。

使用最低级别的相交和碰撞

使用基本体来逼近碰撞形状也是一种好习惯。您可以采用以下方法:

  1. 确保原始节点不是 Collider —检查是否已禁用Collision标志的表面,实体和形状。从现在起,碰撞检测就不再考虑它了。

  2. 通过在菜单栏中选择Create -> Primitive -> Cylinder将圆柱对象添加到场景中,并用图元覆盖原始网格。

  3. 请确保已为原始节点启用了曲面的Collision选项。
  4. 隐藏基本体表面的视觉表示。您可以通过清除其ViewportShadow蒙版,或仅通过将其Max Visibility参数设置为负无穷大(-inf)来执行此操作,这可以确保在任何距离都看不到该表面。

    现在,详细的网格仅提供视觉表示,而为原始圆柱体计算物理相互作用。

碰撞检测方法#

连续碰撞检测是一项非常苛刻的操作,因此,建议仅将这种方法用于快速移动的物体和需要精确计算的物体。

在大多数情况下,离散碰撞检测就足够了。为此,请选择一个形状,然后取消选中Continuous标志。

注意
连续碰撞检测仅适用于球形胶囊形状。

优化身体#

冷冻#

建议对所有Rigid, FractureRagdollbodies都启用Freezing。这样可以跳过不动对象的物理计算,直到它们受到任何力或对象的影响,从而节省大量计算资源。

要启用冻结,请执行以下步骤:

  1. 为上面列出的所有类型的身体启用Freezable标志。
  2. 设置适当的值Frozen Linear VelocityFrozen Angular Velocity每个身体的参数或调整全局参数。将这些全局冻结阈值与为每个身体设置的阈值进行比较,然后选择最大值以冻结身体。

  3. 调整Frozen Frames的数量。值越低,冻结的对象越快。

压裂#

尽管断裂体是一种相对便宜的类型,但是在大量断裂件的情况下,对性能的影响可能会变得很大。为避免性能下降,可以使用以下技巧:

  • 使用Volume Threshold参数来减少断裂件的数量。
  • 从场景中移除骨折的身体。

可以在UnigineScript1示例Physics部分中找到一个基于代码的示例,该示例说明了如何从场景中删除(随时间消逝)碎片。

最新更新: 2021-04-09
Build: ()