En esta página

Qt Quick Física 3D - Ejemplo simple

Demuestra la configuración de una escena de física simple.

Captura de pantalla de un paisaje verde con tres objetos 3d diferentes uno al lado del otro

Este ejemplo da una visión introductoria de las características básicas de Quick 3D Physics a través del código de un ejemplo simple. Tenga en cuenta que esta introducción asume una familiaridad con el módulo Qt Quick 3D.

Configuración

Todo el ejemplo está contenido y configurado en el archivo main.qml. Veamos primero el objeto que crea el mundo físico. Este nodo se llama PhysicsWorld:

PhysicsWorld {
    scene: viewport.scene
}

Establecemos la propiedad scene a la escena de nuestro View3D. La propiedad scene define donde la simulación buscará los nodos de física a simular. Cualquier nodo de física situado fuera del nodo de escena no formará parte de la simulación.

Escena

Echemos un vistazo a la escena.

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"
            }
        }
    }
}

Nuestra escena es sólo un View3D ya que queremos dibujar nuestros objetos físicos. Contiene un PerspectiveCamera y un DirectionalLight para el renderizado, pero lo más importante es que contiene un StaticRigidBody y tres nodos DynamicRigidBody. En física, un cuerpo rígido es un cuerpo sólido indeformable con densidad uniforme. Disponemos de dos tipos de cuerpos rígidos: StaticRigidBody y DynamicRigidBody. Un StaticRigidBody es un nodo QML que contiene un cuerpo rígido estático (inamovible). Técnicamente es posible mover el cuerpo, pero el rendimiento se verá afectado. En cambio, DynamicRigidBody se utiliza para objetos que pueden moverse. Un DynamicRigidBody tiene una propiedad isKinematic, cuando se establece en true el cuerpo rígido no será influenciado por fuerzas externas y puede ser controlado desde scripts y animaciones. Por ejemplo un balón de fútbol no sería cinemático pero un ascensor o una plataforma móvil típicamente sí. Esto también significa que si actualizas la propiedad position del balón no se moverá a esa posición mientras que el ascensor sí.

Para poder interactuar con otros objetos físicos es necesario establecer la propiedad collisionShapes. La propiedad collisionShapes es una lista que puede contener una o más formas y actuará como una unidad rígida combinada. Puedes posicionar y rotar estas formas en relación a otras. Tenga en cuenta que las formas de plano, malla triangular y mapa de altura sólo funcionan con cuerpos dinámicos si el cuerpo es cinemático.

Formas

Nuestra escena contiene cuatro objetos físicos (plano, caja, bola, cápsula). Los veremos uno a uno.

Plano
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
    }
}

Creamos un plano haciendo un nodo StaticRigidBody. En este nodo establecemos la propiedad collisionShapes para que contenga un PlaneShape. Los planos dividen el espacio en "encima" y "debajo" de ellos. Todo lo que esté "debajo" del plano colisionará con él y será empujado por encima. El Plano se encuentra en el plano YZ con "arriba" apuntando hacia X positivo. Colocamos un Modelo dentro de nuestro nodo StaticRigidBody para renderizar el plano. Este es un patrón común que asegura que el modelo también se mueve y rota de la misma manera cuando el objeto físico interactúa en la escena. Como queremos que el plano esté en el plano XY lo rotamos usando la propiedad eulerRotation. Rotamos el modelo de forma similar.

Caja
DynamicRigidBody {
    position: Qt.vector3d(-100, 100, 0)
    collisionShapes: BoxShape {
        id: boxShape
    }
    Model {
        source: "#Cube"
        materials: PrincipledMaterial {
            baseColor: "yellow"
        }
    }
}

Creamos una esfera haciendo un nodo DynamicRigidBody y un único BoxShape en collisionShapes. Como este es un nodo dinámico la caja interactuará con la escena colisionando y moviéndose como un objeto libre. Como el modelo del cubo es cien veces más grande que un cubo unitario necesitamos escalarlo en consecuencia. Como este es un cuerpo dinámico y por lo tanto tiene un peso físico establecemos la propiedad density.

Esfera
DynamicRigidBody {
    position: Qt.vector3d(0, 100, 0)
    collisionShapes: SphereShape {
        id: sphereShape
    }
    Model {
        source: "#Sphere"
        materials: PrincipledMaterial {
            baseColor: "blue"
        }
    }
}

Creamos una esfera haciendo un nodo DynamicRigidBody y un solo SphereShape en collisionShapes.

Cápsula
DynamicRigidBody {
    position: Qt.vector3d(75, 200, 0)
    collisionShapes: CapsuleShape {
        id: capsuleShape
    }

    Model {
        geometry: CapsuleGeometry {}
        materials: PrincipledMaterial {
            baseColor: "red"
        }
    }
}

Creamos una cápsula creando un nodo DynamicRigidBody y un único CapsuleShape en collisionShapes. Construimos un modelo de cápsula utilizando la CapsuleGeometry incorporada proporcionada por Qt Quick 3D.

Archivos:

© 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.