UDN
Search public documentation:

PhysXReferenceCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 物理 > PhysX 参考指南

PhysX 参考指南


力场


所有力场的常用参数

  • bForceActive - 说明此时力是否处于激活状态。
  • ForceFieldChannel - 确定了应用到这个力场的排除体积 ( RB_ForceFieldExcludeVolumes )。
  • bForceApplyToCloth - 启用/禁用对布料的影响。
  • bForceApplyToFluid - 启用/禁用对流体粒子的影响。
  • bForceApplyToRigidBodies - 启用/禁用对刚体的影响。
  • bForceApplyToProjectiles - 启用/禁用对诸如火箭之类的射弹的影响。
  • CollideWithChannelsIdentifies - 受到这个力场影响的物体的类型。

RB_RadialForceActor

这个力场显示为一个球体。它将会对在力场内部的对象应用一个径向力。

  • ForceStrength - 应用到 actor 的力的强度。正向力向外应用。
  • ForceRadius - 力的影响半径。
  • SwirlStrength - 这个字段不使用。(围绕 actor 的 Z 轴,物体进行轨道运行的强度。)
  • SpinTorque - 这个字段不使用。(围绕本地坐标系中的 Z 旋转地物体的强度。)
  • ForceFalloff - 当物体从那个位置远离时,力的衰减方式。应用的力或者是不依赖于位置的常量;或者力会被线性地插值,使得当从力场中心到半径为 ForceRadius 处变化时,力的强度从 ForceStrength 衰减为零。
  • RadialForceMode - 可以指定使用的力模型的类型。

RB_CylindricalForceActor

这个力场显示作为圆柱体。它将会根据定义的参数对在圆柱体内部的物体应用一个径向的、上升的、旋转的力。如果物体的 Velocity(速度)比逃逸速度小或者当物体正在移动远离中心时才应用这个径向力。这用于阻止物体快速地离开力场。

  • RadialStrength - 在从圆柱体中心轴向外的方向上应用的力的强度。
  • RotationalStrength - 在圆柱体中心轴周围所应用的力的旋转强度。
  • LiftStrength - 在圆柱体中心轴上应用的力的强度。
  • LiftFalloffHeight - 升力的衰减高度,0-1,当高于这个高度时升力将开始以线性的方式衰减。
  • EscapeVelocity - 当速度高于这个速度时,将会忽略径向力。
  • ForceRadius - 圆柱体底部的力的影响半径。
  • ForceTopRadius - 圆柱体顶部的力的影响半径。
  • ForceHeight - 力圆柱体的高度。
  • HeightOffset - 从 actor 的基部到力场中心的偏移量。

可以在这些文档中获得更多的信息:

  • 下载这个圆柱体力场教程。
  • 下载这个力场的专题教程。

场景分隔间


它允许用户把物体分隔为多个可以或不可以相互交互的分隔间。Compartment(分隔间)可以在游戏引擎正在执行其它任务的过程中模拟场景平行放置。另外,为了改善基于场景的特效的性能,可以独立地配置 Compartments(分隔间)来使得它在不同的步长或者可能的交叉存取仿真时运行。

一个 Compartments(分隔间)代表一种物理仿真类型的子实例,比如,硬件流体、硬件刚体或软件刚体。在一个场景中可能会存在几个 Compartment(分隔间)(包括同样类型的多个分隔间),它们之间的交互及将会对场景章节自动进行处理。这允许透明操作、仿真及交互,不必担心底层的具体细节。

SDK 管理 Compartment(分隔间)之间的所有连接。或者如果执行一次光线投射,那么这个查询将会返回在所有 Compartment(分隔间)中的所有分割的硬件和软件物体。

一个新建的场景、硬件或软件不包含 compartment(分隔间)。任何添加到场景中的物体都会被放到场景章节中,除非在添加到场景中的物体的描述符中指出了一个 compartment(分隔间)或者那种类型的物体不能直接地存在于场景中,否则添加的物体都将会被插入到场景章节中。

比如,这种特殊情况将会应用到软件场景中的示例流体。在这种情况下,如果没有 compartment(分隔间)存在,将会为新的物体创建一个适当的默认 compartment(分隔间)。

这里是创建具有 compartment(分隔间)物体的不同可能性以及它们支持的交互作用的全面列表。交互作用包括物理实体间的碰撞及触发器测试。

没有 PhysX 硬件

没有指定的分隔间:

项目 所在位置 影响对象 影响因素
Rigid bodies(刚体) Scene proper(场景章节) 任何东西 彼此之间,设置为双向交互的布料(甚至在 compartment(分隔间)中)、设置为双向交互的流体(仅在 compartment(分隔间)中)。
Fluids(流体) 软件中不可用    
Cloth(布料) 主要场景 仅那些在主要场景中设置为双向交互的刚体。 仅在主要场景的刚体。

指定的分割间:

项目 所在位置 影响对象 影响因素
Rigid bodies(刚体) 指定的分隔间 仅彼此间 彼此间,主要场景中的刚体。
Fluids(流体) 软件中不可用    
Cloth(布料) 指定的分隔间 仅主要场景中的刚体(它们设置为双向交互) 仅在主要场景中的刚体。

附带 PhysX 硬件

没有指定的分隔间:

项目 所在位置 运行平台 影响对象 影响因素
Rigid bodies(刚体) 场景章节 场景类型 任何物体 彼此间、设置为双向交互的布料间(即使在分隔间中)、具有双向交互的设置的流体(仅在分隔间中)。
Fluids(流体) 默认的流体分隔间(如果分隔间不存在将会创建一个) 硬件 仅在主要场景中的刚体(如果设置了双向影响) 仅在主要场景中的刚体。
HW Cloth1 默认的布料分隔间(如果分隔间不存在将会创建一个) 硬件 仅在主要场景中设置为双向交互的刚体 仅在主要场景中的刚体。
SW Cloth1 场景章节 软件 仅在主要场景中设置为双向交互的刚体 仅在主要场景中的刚体。

指定的分割间:

项目 所在位置: 运行平台: 影响对象: 影响因素:
Rigid bodies(刚体) 指定的分隔间 作为分隔间 仅彼此间 彼此间,在主要场景中的刚体2
Fluids(流体) 指定的分隔间 硬件 仅在主要场景中设置为双向交互的刚体。 仅主要场景中的刚体。
Cloth(布料) 指定的分隔间 作为分隔间 仅在主要场景中设置为双向交互的刚体。 仅主要场景中的刚体。
2 在分隔间中的触发器不能对主要场景中的刚体做出反应)

默认实现

目前 UE3 在 NxScene 中创建了 4 个分隔间。指向这些分隔间的指针和 NxScene 一同存储在关卡的 FRBPhysScene 中。创建的分隔间类型是:
  • Rigid body(刚体)
  • Fluid(流体)
  • Cloth(布料)
  • 刚体
    ALERT! 注意: 目前没有投入使用,但是以后会启用这项功能。

要想在分隔间中创建 PhysX 对象,您仅需要向 PhysX 对象的指示符中传入适当的分隔间的指针。比如,NxActorDesc 包含一个 'compartment' 字段。如果这个字段为 NULL(空),那么对象将会被放置到主要的(正常的)PhysX 场景中。

现在,UE3 的 UPrimitiveComponent 类有一个 bUseCompartment 布尔值。 这可以对从这个类继承的对象进行正确地解释。如果 UPrimitiveComponent 有一个 BodyInstance,并且如果 bUseCompartment 设置为真,那么为 BodyInstance 创建的 NxActor 将会被放到刚体分隔间中。

对于 USkeletalMeshComponents 来说,如果指定了布料仿真,那么 bUseCompartment 标志将决定是否把布料放置到布料分隔间中。

UE3 中对流体进行了特殊的处理,我们总是将 NxFluid 放置到流体分隔间中。

单向交互(“Dominance Group(主要组)”)


通过使用 Dominance Group(主要组),您可以在那些仅在一个方向上反应的 actor 间创建所有的约束(联系和关节)。如果您想确保车辆扶手或人物马尾辫的运动不会影响它附加到的物体并保持它们运动的自然效果时,这是有用的。

“Dominance Groups(主要组)”是 NxActor 的属性。它是一个简单的 5 位(范围 0-31)的标示符。 当一个限制(关节或联系)在两个 actor 间作用时,它们的 Dominance Group(主要组)用于决定影响要影响的 actor。影响力由用户定义的实数对矩阵决定。 当两个 NxActor 交互时,它们的 Dominance Groups(主要组)编号用于查找在矩阵中查找正确的实数组。每个实数的范围是 [0.0,1.0],并且这个值决定了每个 NxActor 从交互中接收的影响的多少。 目前,仅支持值 0.0 和 1.0。 那些中间值或许会在以后用户“部分”交互作用。

默认情况下,建立了交互矩阵,所以如果 actor 的 dominance groups(主要组)是相等的,则返回 (1.0,1.0)。 这是一种“正常的”交互行为 – 两个 actor 受到约束的影响。如果 actor 的 dominance group(主要组)是不相等的,那么默认的矩阵将会根据较大的组 ID 返回 (0.0,1.0) 或 (1.0,0.0)。这样设立后,那么较低的 dominance group(主要组)的 ID 获得 1.0 的权重,而较高的组 ID 获得 0.0 的权重。也将是,具有较低的组 ID 获胜。PhysX 设置默认的 dominance group(主要组)ID 为 0,这将使得在默认的交互矩阵下,主要组将总是获胜。

UE3 把 NxActor 的 dominance group(主要组)重置为 15(默认情况下),但是没有修改交互矩阵。 这使得很容易地便可以指定大于它或小于它的 ID。在 UE3 中,dominance group(主要组)是在 UPrimitiveComponent 的 RBDominanceGroup 文本字段中指定的。

PhysX 可见性标志


有几个 PhysX 可见性标志,可以在命令行中设置它们,通过输入 NXVIS 后面跟着以下标志之一来实现:

  • Axes(坐标轴)
    • WORLDAXES - 使世界坐标轴可见。
    • BODYAXES - 使尸体的坐标轴可见。
    • BODYAXES - 使尸体的质量坐标轴可见。
  • Contacts(接触)
    • CONTACTPOINT - 使接触点可见。
    • CONTACTS - 使接触法线可见。
    • CONTACTERROR - 使接触错误可见。
    • CONTACTFORCE - 使接触力度可见。
  • Joints(关节)
    • JOINTLIMITS - 使关节极范围可见。
    • JOINTLOCALAXES - 使本地关节坐标轴可见。
    • JOINTWORLDAXES - 使关节世界坐标轴可见。
  • Collision(碰撞)
    • CCD - 使 CCD 骨架可见。
    • CCDTESTS - 使 CCD 测试可见。
    • COLLISIONAABBS - 使边界(世界空间中的 AABB)可见。
    • COLLISION - 使形状可见。
      • 红色 - BSP/三角形网格物体/高区域
      • 橙色 - 凸面
      • 白色 - 球体/长方体图元
    • COLLISIONAXES - 使形状坐标轴可见。
  • Cloth(布料)
    • CLOTH_MESH - 使布料网格物体可见。
    • CLOTH_COLLISIONS - 使布料刚体碰撞可见。
    • CLOTH_ATTACHMENT - 使布料附加物可见。
    • CLOTH_SLEEP_VERTEX - 使具有完整的每个顶点信息的布料休眠可见。
    • CLOTH_SLEEP - 使布料休眠可见。
      • 红色 - 休眠
      • 白色 - 唤醒
      • 蓝色 - 静态
    • CLOTH_VALIDBOUNDS - 使布料有效边界可见。
    • CLOTH_TEARABLE_VERTICES - 使可撕裂的布料顶点可见。
  • Fluid(流体)
    • FLUID_PACKETS - 使流体包可见。
    • FLUID_POSITION - 使粒子位置可见。
    • FLUID_MESH_PACKETS - 使现有的流体网格物体包可见。
    • FLUID_PACKET_DATA - 使流体数据包可见。
    • FLUID_BOUNDS - 使流体 AABB 可见。
    • FLUID_VELOCITY - 使粒子速度可见。
    • FLUID_KERNEL_RADIUS - 使粒子 kernel 半径可见。
    • FLUID_DRAINS - 使流体排水通道形状可见。
    • FLUID_EMITTERS - 使发射器可见。
  • Force Fields(力场)
    • FORCEFIELDS - 使力场形状可见。
  • Softbody(软体)
    • SOFTBODY_MESH - 使软体网格物体可见。
    • SOFTBODY_ATTACHMENT - 使软体附加物可见。
    • SOFTBODY_COLLISIONS - 显示与刚体发生碰撞的软体。
    • SOFTBODY_SLEEP_VERTEX - 显示软体的睡眠状态及基于每个顶点的全面信息。
    • SOFTBODY_SLEEP - 显示软体休眠。
    • SOFTBODY_VALIDBOUNDS - 显示软体有效边界。

刚体的物体碰撞


PhysX 钢体物理引擎的工作方式是为接触的物体在每一帧产生 contact points(接触点) 。这是一个比执行一次线性检测更加复杂的过程,所以为了获得较好的速度及行为,保持真正物理物体(比如一个 ragdolls(布娃娃)要碰撞的几何体尽可能的简单是非常重要的。比如,很多小三角形可能会导致物理物体变得 snagged(受阻碍的) ,并且也要花很长的时间来处理。

首先,对于一个阻挡物理 Actor 的 Actor 来说,它必须设置 bBlockRigidBodytrue(真) 。这项的设置对于静态网格物体和阻挡体积是默认值。

如果 UseSimpleRigidBodyCollisiontrue(真) (请查看那上面的碰撞模型部分获得更多详情),引擎将会采用这个碰撞模型,并把它转换为用于产生联系的一组凸面外壳。如果您从静态网格物体编辑器用户指南View(视图) 菜单选择 Collision(碰撞) 菜单项,它将为您显示所有的图元数量。最理想的状态时保持那个数量低于10,但一定要低于 100。

钢体 actor 基于每个三角形和 BSP 及地形发生碰撞。因为这个原因,您必须确保您的 BSP 和地形中没有非常小的三角形。对于小的细节,可以使用阻挡体积/碰撞模型。

过滤刚体碰撞

您可以使用 Component(组件)中的 RBChannelRBCollidesWithChannel 选项来控制钢体和那个物体发生碰撞。

  • RBChannel - 这说明了碰撞所考虑的物理类型。
  • RBCollidesWithChannel - 这说明了要和这个物体产生碰撞的物体的类型。

默认情况下,像 BSP、地形及静态网格物体在 Default(默认值) 通道中。所以如果您有一个想要与其进行碰撞的物理物体,您需要确保 RBCollidesWithChannel 中的 Default 处于选中状态。通常关卡中的静态物体将不会设置 RBCollidesWithChannel 中的任何标记,以便动态物体可以‘选择’和哪个物体发生碰撞。

这是一个特殊的通道 RBCC_Nothing ,意味着默认情况下任何东西都不和这个物体发生碰撞。然而,您仍然可以在 RBCollidesWithChannel 中设置选项。比如,如果您想使关卡中的某个物体仅和车辆发生碰撞,您应该设置它为 RBCC_Nothing 通道,然后把 RBCollidesWithChannel 中的 Vehicles(车辆) 标记设置为打开状态。