En esta página

Qt Quick 3D - Ejemplo de picking

Ejemplo de recogida de modelos.

Este ejemplo muestra el picking. Hay 3 modelos animados diferentes que pueden ser escogidos. Cuando se selecciona un modelo, la animación se detiene y el color del modelo cambia para dejar claro qué modelo se ha seleccionado. En la parte superior de la ventana de la aplicación se muestra información detallada sobre el resultado de la selección.

Tres objetos con información de picking que muestran la posición del cubo seleccionado

Seleccionar un modelo

Para hacer un modelo seleccionable, la propiedad pickable necesita ser establecida a true. También añadimos objectName para que el modelo pueda mostrar el nombre del modelo seleccionado.

Model {
    id: cubeModel
    objectName: "Cube"
    source: "#Cube"
    pickable: true
    property bool isPicked: false

La propiedad isPicked fue añadida para ser utilizada para alternar la animación y el color.

materials: PrincipledMaterial {
    baseColor: cubeModel.isPicked ? "#41cd52" : "#09102b"
    ...
SequentialAnimation on eulerRotation {
    running: !cubeModel.isPicked

Obtención de los resultados de la selección

Para hacer el picking necesitamos añadir un MouseArea para cubrir todo el View3D.

MouseArea {
    anchors.fill: view

En el manejador onClicked del área del ratón, utilizamos el método pick para obtener el resultado real del picking.

var result = view.pick(mouse.x, mouse.y);

Si el resultado tiene un target object, repasamos los detalles del resultado, y los mostramos en el campo de texto en la parte superior de la vista de la aplicación.

if (result.objectHit) {
    var pickedObject = result.objectHit;
    // Toggle the isPicked property for the model
    pickedObject.isPicked = !pickedObject.isPicked;
    // Get picked model name
    pickName.text = pickedObject.objectName;
    // Get other pick specifics
    uvPosition.text = "("
            + result.uvPosition.x.toFixed(2) + ", "
            + result.uvPosition.y.toFixed(2) + ")";
    distance.text = result.distance.toFixed(2);
    scenePosition.text = "("
            + result.scenePosition.x.toFixed(2) + ", "
            + result.scenePosition.y.toFixed(2) + ", "
            + result.scenePosition.z.toFixed(2) + ")";
    localPosition.text = "("
            + result.position.x.toFixed(2) + ", "
            + result.position.y.toFixed(2) + ", "
            + result.position.z.toFixed(2) + ")";
    worldNormal.text = "("
            + result.sceneNormal.x.toFixed(2) + ", "
            + result.sceneNormal.y.toFixed(2) + ", "
            + result.sceneNormal.z.toFixed(2) + ")";
    localNormal.text = "("
            + result.normal.x.toFixed(2) + ", "
            + result.normal.y.toFixed(2) + ", "
            + result.normal.z.toFixed(2) + ")";

Proyecto de ejemplo @ code.qt.io

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