Qt Quick 3D Physics - 简单示例
演示如何设置一个简单的物理场景。
本示例通过一个简单示例的代码,介绍了 Quick 3D 物理功能的基本概况。请注意,本介绍假定您已熟悉Qt Quick 3D 模块。
设置
整个示例包含并设置在main.qml文件中。我们首先来看看创建物理世界的对象。该节点名为PhysicsWorld :
PhysicsWorld { scene: viewport.scene }
我们将scene 属性设置为View3D 的场景。scene
属性定义了模拟将在哪里寻找要模拟的物理节点。任何放置在场景节点之外的物理节点都不会成为模拟的一部分。
场景
让我们来看看场景。
View3D { id: viewport anchors.fill: parent environment: SceneEnvironment { clearColor: "#d6dbdf" backgroundMode: SceneEnvironment.Color } PerspectiveCamera { position: Qt.vector3d(-200, 100, 500) eulerRotation: Qt.vector3d(-20, -20, 0) clipFar: 5000 clipNear: 1 } DirectionalLight { eulerRotation.x: -45 eulerRotation.y: 45 castsShadow: true brightness: 1 shadowFactor: 50 } StaticRigidBody { position: Qt.vector3d(0, -100, 0) eulerRotation: Qt.vector3d(-90, 0, 0) collisionShapes: PlaneShape {} Model { source: "#Rectangle" scale: Qt.vector3d(10, 10, 1) materials: PrincipledMaterial { baseColor: "green" } castsShadows: false receivesShadows: true } } DynamicRigidBody { position: Qt.vector3d(-100, 100, 0) collisionShapes: BoxShape { id: boxShape } Model { source: "#Cube" materials: PrincipledMaterial { baseColor: "yellow" } } } DynamicRigidBody { position: Qt.vector3d(0, 100, 0) collisionShapes: SphereShape { id: sphereShape } Model { source: "#Sphere" materials: PrincipledMaterial { baseColor: "blue" } } } DynamicRigidBody { position: Qt.vector3d(75, 200, 0) collisionShapes: CapsuleShape { id: capsuleShape } Model { geometry: CapsuleGeometry {} materials: PrincipledMaterial { baseColor: "red" } } } }
我们的场景只是一个View3D ,因为我们要绘制物理对象。它包含一个PerspectiveCamera 和一个DirectionalLight 用于渲染,但更重要的是,它包含一个StaticRigidBody 和三个DynamicRigidBody 节点。在物理学中,刚体是一种不可变形、密度均匀的实体。我们有两种类型的刚体:StaticRigidBody 和DynamicRigidBody 。StaticRigidBody 是一个 QML 节点,包含一个静态(不可移动)的刚体。从技术上讲,刚体是可以移动的,但这将导致性能下降。而DynamicRigidBody 则用于可移动的对象。DynamicRigidBody 有一个isKinematic 属性,当该属性设置为 true 时,刚体将不受外力影响,并可由脚本和动画控制。例如,足球就不属于运动刚体,但电梯或移动平台通常属于运动刚体。这也意味着,如果您更新足球的position
属性,它不会移动到该位置,而电梯则会。
为了能够与其他物理对象交互,需要设置collisionShapes 属性。collisionShapes 属性是一个列表,可以包含一个或多个形状,并作为一个刚性单元组合在一起。您可以将这些形状相互定位和旋转。请注意,平面、三角网格和高度图形状只有在动态物体是运动物体的情况下才能与动态物体一起使用。
形状
我们的场景包含四个物理对象(平面、方框、球和胶囊)。我们将逐一介绍。
平面
StaticRigidBody { position: Qt.vector3d(0, -100, 0) eulerRotation: Qt.vector3d(-90, 0, 0) collisionShapes: PlaneShape {} Model { source: "#Rectangle" scale: Qt.vector3d(10, 10, 1) materials: PrincipledMaterial { baseColor: "green" } castsShadows: false receivesShadows: true } }
我们通过创建一个StaticRigidBody 节点来创建平面。在该节点中,我们将collisionShapes 属性设置为包含PlaneShape 。平面将空间分为 "上方 "和 "下方"。在平面 "下方 "的所有物体都会与平面发生碰撞,并被推到平面上方。平面位于 YZ 平面上,"上方 "指向正 X。我们在StaticRigidBody 节点内放置一个模型来渲染平面。这是一种常见的模式,它可以确保当物理对象在场景中交互时,模型也以相同的方式移动和旋转。由于我们希望平面位于 XY 平面上,因此使用eulerRotation
属性对其进行旋转。我们以类似的方式旋转模型。
方框
DynamicRigidBody { position: Qt.vector3d(-100, 100, 0) collisionShapes: BoxShape { id: boxShape } Model { source: "#Cube" materials: PrincipledMaterial { baseColor: "yellow" } } }
我们通过在collisionShapes 中创建一个DynamicRigidBody 节点和一个BoxShape 来创建一个球体。由于这是一个动态节点,因此方框将通过碰撞和移动与场景进行交互,就像一个自由物体。由于立方体模型比单位立方体大 100 倍,我们需要对其进行相应的缩放。由于这是一个动态物体,因此具有物理重量,我们设置了density 属性。
球体
DynamicRigidBody { position: Qt.vector3d(0, 100, 0) collisionShapes: SphereShape { id: sphereShape } Model { source: "#Sphere" materials: PrincipledMaterial { baseColor: "blue" } } }
我们通过在collisionShapes 中创建一个DynamicRigidBody 节点和一个SphereShape 来创建一个球体。
胶囊
DynamicRigidBody { position: Qt.vector3d(75, 200, 0) collisionShapes: CapsuleShape { id: capsuleShape } Model { geometry: CapsuleGeometry {} materials: PrincipledMaterial { baseColor: "red" } } }
我们通过在collisionShapes 中创建一个DynamicRigidBody 节点和一个CapsuleShape 来创建一个胶囊。我们使用Qt Quick 3D Physics 提供的内置CapsuleGeometry 来创建胶囊模型。
文件:
© 2025 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.