En esta página

Qt Quick Nivel de detalle 3D

Nivel de detalle (LoD)

Nivel de detalle (LoD) se refiere a la técnica de utilizar versiones alternativas de un modelo 3D a diferentes distancias de la cámara. El objetivo de esta técnica es optimizar el uso de recursos utilizando versiones más sencillas del modelo cuando está lejos o ocupa una pequeña parte de la pantalla, mientras que se utilizan versiones más detalladas cuando está más cerca o ocupa una porción mayor del espacio de la pantalla. Este enfoque permite un uso eficiente de los recursos de la GPU manteniendo la fidelidad visual.

Qt Quick 3D proporciona un sistema de nivel de detalle tanto automático como explícito. El sistema automático se basa en el uso de una única malla con varios niveles de detalle almacenados en el archivo de malla. El sistema explícito se basa en el uso de un componente LodManager para especificar los diferentes niveles de detalle como modelos hijos.

Nivel de detalle automático

La principal forma de utilizar el nivel automático de detalle es importando contenido con la herramienta de importación de activos de Balsam. Utilizando la bandera --generateMeshLevelsOfDetail al importar activos, la herramienta generará niveles de detalle para cada malla cuando sea posible. Esto se hace tratando de simplificar la geometría de la malla original, manteniendo al mismo tiempo las características generales. El resultado es una geometría adicional y nuevos valores de índice para cada nivel de detalle adicional, así como un factor de distancia utilizado para determinar qué malla utilizar para un tamaño de renderizado determinado. Este factor de distancia está relacionado con la distancia del objeto que se está renderizando a la cámara, pero lo más importante es tener una buena proporción de geometría por píxel. Estos datos se escriben en el archivo .mesh y se utilizarán automáticamente cuando los utilice un Modelo.

Configuración de Balsam UI con la opción de generación LOD resaltada

Una contrapartida del sistema automático, y la razón por la que no está activado por defecto, es que es posible que al reducir la geometría también se introduzcan artefactos visuales. El algoritmo de simplificación de la geometría utilizado intenta preservar las características del modelo, pero en algunos casos puede ser necesario recalcular las normales de la malla para mantener el aspecto visual deseado. Esto puede hacerse utilizando la bandera --recalculateLodNormals al importar el activo. El proceso de recálculo de normales puede ajustarse aún más pasando valores de ángulo de Euler a los argumentos --recalculateLodNormalsMergeAngle y --recalculateLodNormalsSplitAngle para controlar el ángulo en el que se fusionan o dividen las normales respectivamente.

La principal ventaja del sistema automático es que es fácil de utilizar una vez que el activo se ha importado con la configuración adecuada. No se necesita código adicional para utilizar el sistema automático y cualquier Modelo que haga referencia a los archivos de malla generados que contengan geometría de niveles de detalle elegirá automáticamente la geometría adecuada en función de cuántos píxeles ocupe el modelo en la pantalla.

Es posible ajustar el comportamiento de la selección automática del nivel de detalle en global level o en per-model level utilizando la propiedad levelOfDetailBias de Camera o Model. El nivel por defecto de 1.0 de cada una de estas propiedades de sesgo significa confiar en el valor calculado por el sistema automático. Este valor es un sesgo respecto al valor ideal, de forma que un valor inferior a 1,0 requerirá un tamaño de renderizado aún menor antes de pasar a un nivel de detalle menor. Los valores superiores a 1,0 harán que se utilicen antes niveles de detalle inferiores. Un valor de 0,0 desactivará por completo el uso de niveles de detalle y utilizará siempre la geometría de malla original.

El sistema automático no es tan flexible como el sistema explícito. Por ejemplo, el sistema automático siempre utiliza el mismo material para todos los niveles de detalle, lo que no siempre es deseable. Otra desventaja potencial es que no hay transición entre los diferentes niveles de detalle, lo que idealmente no debería ser necesario con el nivel de detalle automático, pero puede ser deseable para ciertos casos de uso.

Nivel de detalle explícito

El sistema de nivel de detalle explícito es más flexible que el automático, pero requiere más trabajo para utilizarlo. El sistema explícito se basa en el uso de un componente LodManager para especificar los distintos niveles de detalle como componentes hijos de Model. Todos los hijos de LodManager que sean instancias de Model se considerarán un nivel de detalle. Esto es bastante potente porque cada nivel de detalle puede ser un modelo completamente personalizado, con sus propias geometrías y materiales.

El componente LodManager también tiene una propiedad distances que se utiliza para determinar qué hijo Model utilizar. El nodo LodManager pasará al siguiente hijo Model a medida que la distancia de la cámara se acerque a cada límite de distancia. La propiedad fadeDistance se puede utilizar para establecer a qué distancia comienza y termina la transición de fundido cruzado alrededor de los límites de distancia.

Este es un ejemplo de cómo utilizar el sistema de nivel de detalle explícito:

Escultura de busto con objetos instanciados con distintos niveles de detalle

En el ejemplo referenciado el LodManager se utiliza para especificar explícitamente diferentes archivos de malla para cada nivel de detalle del busto de mármol.

LodManager {
    camera: camera
    distances: [100, 140, 180]
    fadeDistance: 10

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_0.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_1.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_2.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_3.mesh"
        materials: [ marbleMaterial ]
    }
}

Para este código este es un diagrama de lo que se está definiendo que señala cómo la lista de distancias se utiliza para definir dónde están los límites entre los diferentes niveles de detalle, así como la propiedad fadeDistance que se utiliza para definir la transición de fundido cruzado.

Diagrama de arquitectura del sistema LOD

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