Qt Quick 3D 物理形状、物体和关节
模拟中的物体由以下四种物体类型之一表示:StaticRigidBody 、DynamicRigidBody 、CharacterController 和TriggerBody 。物体的物理形状由CollisionShape 的子类型表示。
形状
碰撞形状用于定义物体的物理形状和范围,以满足物理模拟的需求。通常,碰撞形状会比物体的视觉外观更简单。
引擎内置了一些预定义的形状:BoxShape 、CapsuleShape 、SphereShape 和PlaneShape 。这些形状的处理经过了优化,因此使用它们进行模拟通常性能更佳。
此外,还有由数据定义的自定义形状:ConvexMeshShape 、HeightFieldShape 和TriangleMeshShape 。这些形状虽然提供了更大的灵活性,但会牺牲部分性能。
物体
body 代表仿真中的物理对象。这些物体之间会相互作用并发生碰撞。主要有两种类型:静态物体(StaticRigidBody )和动态物体(DynamicRigidBody )。物体的物理形状由一组形状列表指定。有效形状是这些形状的并集。各形状的相对位置是固定的:物体是刚体的。
动态物体
动态物体能够移动。isKinematic 属性决定了其移动方式。当isKinematic 为true 时,通过修改kinematicPosition 和kinematicRotation 属性来显式设定物体的位置。当isKinematic 为false 时,物体由模拟控制:它将受重力作用下落,并从其他物体上弹开。
当 isKinematic 为true 时,允许使用所有形状。然而,非运动学物体则受到更多限制:只能使用凸形。 这些预定义形状包括:BoxShape 、CapsuleShape 和SphereShape ;以及自定义形状ConvexMeshShape 。这并不意味着无法创建非凸的物理几何体:可以将多个凸形状组合成单一物体。《复合形状示例》演示了如何基于凸形状形成环形物体。
静态物体
静态物体不会移动。它们代表其他物体移动的环境。 请注意,从技术上讲,移动静态物体是可行的,但物理模拟的结果会出乎意料。特别是,如果一个动态物体已在静态物体上进入静止状态,则当静态物体移动时,该动态物体不会被“唤醒”。这意味着即使静态物体被移动,动态物体仍将保持在原位置。
角色控制器
CharacterController 类型是一个特例。它代表一个在环境中移动的角色。一个典型的用例是第一人称视角,其中camera 是角色控制器的子对象,其移动由键盘/鼠标或游戏手柄控制。
触发体
还有一种名为TriggerBody 的类型,这也是另一种特例。与其他刚体不同,它并非物理刚体,这意味着它不会与其他刚体发生碰撞交互。顾名思义,它仅用于在另一个刚体进入或离开其碰撞形状定义的体积时触发动作。 如果另一个物体的“sendTriggerReports ”属性设置为“true ”,且其碰撞体积进入“TriggerBody ”时,将触发“bodyEntered ”信号。
下表总结了不同类型物体的特性、它们之间的交互方式以及使用方法:
| 物体 | 交互方式 | 允许的形状 |
|---|---|---|
| StaticRigidBody | 不移动 | 所有形状 |
DynamicRigidBody isKinematic true | 通过编程定位。影响动态物体。无物可阻。 | 所有形状 |
DynamicRigidBody 借助isKinematic false | 完全由模拟控制 | 受限形状 |
| CharacterController | 通过程序移动。影响动态物体。被静态物体阻挡。 | 仅有一个CapsuleShape |
| TriggerBody | 无 | 所有形状 |
物理材质
PhysicsMaterial 类型指定了物体在与另一个物体碰撞时的行为方式。dynamicFriction 和staticFriction 属性决定了物体的滑动程度,而restitution 则决定了其弹跳程度。
关节
关节用于限制两个物体之间的相对运动方式。例如,关节可用于模拟门铰链、绳索或手臂。 系统支持多种关节类型以满足不同使用场景,详见DistanceJoint 、FixedJoint 、PrismaticJoint 、RevoluteJoint 以及SphericalJoint 。每个关节均基于Joint QML 类型,包含两个被连接的物体,以及描述其在每个连接物体上位置的朝向。每种关节类型都有不同的属性,用于控制其特定的物理约束。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.