vrPhysicsService

vrPhysicsService

(继承 vrBaseService

vrPhysicsService 类。

此类提供对 VRED 中的物理模拟的访问权限。它允许在模拟中添加、移除和操纵物理对象。

这是一项实验性功能,在未来版本中可能会发生更改。目前,它仅可用于碰撞检测,而不适用于实际物理模拟。

有三种类型的物理对象可以添加到模拟:运动学、动力学和静态。运动学对象是不受力影响但可由用户手动控制的物理对象。运动学对象仅支持凸面形状,这意味着不能使用任何三角形网格。动力学对象是受力影响的物理对象,可与模拟中的其他对象交互。无法手动移动它。动力学对象当前未在 VRED 中使用。静态对象是不受力影响且无法手动或者由其他对象或用户移动的物理对象。静态对象的唯一有效配置是三角形网格配置。

有关使用此服务的一些注意事项:

此时,仅实际支持凸面形状。因此,建议使用凸面外壳线。三角形网格仅部分受支持。它们可用于静态对象,但不能用于移动对象。这意味着,在将它们添加到物理模拟后,不得在 VRED 中以任何方式移动它们,否则其碰撞形状将与实际对象不同步。PhysX 对三角形网格的细分也非常严格。如果细分不够好,则它们可能会导致问题甚至错误。

对于复杂对象,可以使用凸面分解,这会将对象分解为多个较小的凸面形状。用于该操作的库是 v-hacd (https://github.com/kmammou/v-hacd)。几乎库的所有参数都可以在 vrdPhysicsConfig 对象中设置,以微调分解过程。

对象的碰撞形状当前在 VRED 中未可视化。它们可以在 NVidia PhysX 可视调试器中可视化,可以使用 connectDebugger(host, port) 函数将该调试器连接到物理模拟。该调试器必须在与 VRED 相同的计算机上启动,然后才能建立连接。该调试器可以从 NVidia 网站 (https://developer.nvidia.com/nvidia-physx-visual-debugger) 下载。

另请注意,当前不会检测是否移动或移除了注册节点的子节点。如果已注册节点的场景图形中存在结构更改,则应移除该节点,然后将其重新添加到物理模拟中。无法将节点添加到已注册父节点的物理模拟。检测到此错误,并导致在尝试添加节点时出错。

摘要

函数:
信号:

函数

vrPhysicsService.addKinematicObject(node, config)

将运动学对象添加到物理模拟中。

运动学对象是不受力影响,但可以与模拟中的其他对象交互,并且可以手动(操纵器、脚本等)移动的物理对象。有效配置为 vrdPhysicsHullConfigvrdPhysicsConvexConfig

参数:
返回值:

如果成功添加了对象,则为 True,否则为 False。

返回值类型:

bool

vrPhysicsService.clearCollisionData(node)

清除节点的碰撞数据。

此函数将清除节点的持久碰撞数据。将移除节点及其所有子节点的存储碰撞形状,并且将不再保存到 VPB 文件。这仅影响使用 vrPhysicsService.storeCollisionData(node) 存储的数据。碰撞形状本身不会从物理模拟中移除,为此,您需要使用 vrPhysicsService.removeObject(node)

参数:

node (vrdNode) - 要从中清除碰撞数据的节点。

返回值:

如果可以成功清除碰撞数据,则为 True,否则为 False。

返回值类型:

bool

vrPhysicsService.addStaticObject(node, config)

将静态对象添加到物理模拟中。

静态对象是不受力影响且无法手动或由其他对象移动的物理对象。静态对象的唯一有效配置是三角形网格配置,请参见 vrdPhysicsTrianglesConfig

参数:
返回值:

如果成功添加了对象,则为 True,否则为 False。

返回值类型:

bool

vrPhysicsService.clearFilters()

从物理模拟中清除所有节点过滤器。

此函数将从物理模拟中清除所有节点过滤器。调用此函数后,所有节点将能够相互碰撞。

vrPhysicsService.connectDebugger(host='127.0.0.1', port=5425)

连接物理调试器。

此函数将 NVidia PhysX 可视调试器连接到物理模拟。调用此函数之前,必须已启动调试器。

参数:
  • host (string) - 调试器的主机地址(默认值:127.0.0.1)
  • port (integer) - 调试器的端口(默认值:5425)

vrPhysicsService.deregisterNodeFilter(node)

从物理模拟中注销节点过滤器。

此函数从物理模拟中注销节点过滤器。调用此函数后,该节点将能够与其他节点发生碰撞。

参数:node (vrdNode) - 要注销的节点。

vrPhysicsService.deregisterNodePairFilter(node1, node2)

从物理模拟中注销节点对过滤器。

此函数从物理模拟中注销节点对过滤器。调用此函数后,节点将能够相互碰撞。

参数:
  • node1 (vrdNode) - 对中的第一个节点。
  • node2 (vrdNode) - 对中的第二个节点。

vrPhysicsService.disconnectDebugger()

断开物理调试器。

此函数将 NVidia PhysX 可视调试器与物理模拟断开。

vrPhysicsService.getKinematicObjects()

获取物理模拟中的所有运动学对象。

返回值:模拟中所有运动学对象的列表。
返回值类型:List[vrdNode]

vrPhysicsService.getStaticObjects()

获取物理模拟中的所有静态对象。

返回值:模拟中所有静态对象的列表。
返回值类型:List[vrdNode]

vrPhysicsService.hasCollisionData(node)

检查碰撞数据是否可用于节点。

此函数检查碰撞数据是否可用于节点。如果节点使用 vrPhysicsService.storeCollisionData(node) 在附件中存储了碰撞形状,则碰撞数据可用。

参数:node (vrdNode) - 要检查的节点。
返回值:如果碰撞数据可用,则为 True,否则为 False。
返回值类型:bool

vrPhysicsService.hasPhysicsObject(node)

检查节点是否已在物理模拟中注册。

参数:node (vrdNode) - 要检查的节点。
返回值:如果节点已注册,则为 True,否则为 False。
返回值类型:bool

vrPhysicsService.isActive()

返回模拟当前是否处于活动状态。

返回值:活动状态。
返回值类型:bool

vrPhysicsService.registerNodeFilter(node)

注册用于物理模拟的节点过滤器。

此函数注册用于物理模拟的节点过滤器。节点过滤器用于指定不应与任何其他节点碰撞的节点。可用于暂时禁用节点的碰撞,而无需将其从模拟中移除。

参数:node (vrdNode) - 要过滤的节点。

vrPhysicsService.registerNodePairFilter(node1, node2)

注册用于物理模拟的节点对过滤器。

此函数注册用于物理模拟的节点对过滤器。节点对过滤器用于指定不应彼此碰撞的一对节点。

参数:
  • node1 (vrdNode) - 对中的第一个节点。
  • node2 (vrdNode) - 对中的第二个节点。

vrPhysicsService.removeAllObjects()

从物理模拟中移除所有对象。

vrPhysicsService.removeObject(node)

从物理模拟中移除对象。

参数:node (vrdNode) - 要移除的节点。
返回值:如果成功移除了对象,则为 True,否则为 False。
返回值类型:bool

vrPhysicsService.restoreCollisionData(node)

恢复节点的碰撞数据。

此函数可以恢复节点的碰撞数据。碰撞数据包括节点及其所有子节点的碰撞形状。碰撞数据存储在节点的附件中,并且必须是之前已存储。碰撞数据受版本控制,且特定于平台。如果基础物理引擎发生更改,则碰撞数据可能不再兼容,并且将失效。如果碰撞数据保存在其他平台(例如,Windows 与 Linux)上,情况也是如此。在这种情况下,碰撞数据将在加载时被丢弃,并使用保存数据时使用的相同参数从节点的实际几何体重新创建。之后,可以再次为当前平台保存 VPB。

参数:node (vrdNode) - 要为其恢复碰撞数据的节点。
返回值:如果碰撞数据已成功恢复,则为 True,否则为 False。
返回值类型:bool

vrPhysicsService.setActive(state)

设置模拟的活动状态。

如果模拟处于活动状态,则物理对象在移动时将在模拟中更新。

参数:state (bool) - False 表示取消激活模拟,True 表示激活模拟。

vrPhysicsService.storeCollisionData(node)

存储节点的碰撞数据。

此函数将节点的碰撞数据存储到附件中,以便将其保存在 VPB 文件中。碰撞数据包括节点及其所有子节点的碰撞形状。

参数:node (vrdNode) - 要为其保存碰撞数据的节点。
返回值:如果碰撞数据已成功保存,则为 True,否则为 False。
返回值类型:bool

信号

vrPhysicsService.collisionContinues(info)

指示碰撞将继续的信号。

当两个对象之间的碰撞仍在进行中时,将发出该信号。

参数:info (vrdPhysicsInfo) - 与碰撞相关的物理信息。包含碰撞节点及其根节点。

vrPhysicsService.collisionStarted(info)

指示碰撞已开始的信号。

当检测到两个对象之间的碰撞时,将发出该信号。

参数:info (vrdPhysicsInfo) - 与碰撞相关的物理信息。包含碰撞节点及其根节点。

vrPhysicsService.collisionStopped(info)

指示碰撞已停止的信号。

当两个对象之间的碰撞停止时,将发出该信号。

参数:info (vrdPhysicsInfo) - 与碰撞相关的物理信息。包含以前的碰撞节点及其根节点。