Compartir vía


Invalidación de estado jerárquico

En muchos casos, es necesario cambiar de forma dinámica el aspecto de partes de un modelo, por ejemplo, ocultar subgráficos o cambiar partes a una representación transparente. No es práctico cambiar los materiales de cada parte implicada, ya que requiere recorrer en iteración todo el gráfico de la escena y administrar la clonación y asignación de materiales en cada nodo.

Para completar este caso de uso con la menor sobrecarga posible, use HierarchicalStateOverrideComponent. Este componente implementa las actualizaciones de estado jerárquico en ramas arbitrarias del gráfico de escena. Esto significa que un estado se puede definir en cualquier nivel del gráfico de escena y se filtra en la jerarquía hasta que se reemplaza por un estado nuevo o se aplica a un objeto hoja.

Como ejemplo, considere el modelo de un automóvil y que quiere cambiar el vehículo completo para que sea transparente, excepto la parte del motor interno. Este caso de uso solo implica dos instancias del componente:

  • El primer componente se asigna al nodo raíz del modelo y activa la representación transparente para todo el automóvil.
  • El segundo componente se asigna al nodo raíz del motor y reemplaza el estado de nuevo al desactivar explícitamente el modo transparente.

Nota:

Las nubes de puntos no exponen un gráfico de escena completo (consulte las diferencias de los tipos de malla), por lo que la asignación de una invalidación jerárquica a la entidad raíz de un modelo de nube de puntos aplicará el estado a toda la nube de puntos. Además, algunas características de invalidación de estado no se admiten para nubes de puntos, como se mencionó en la sección correspondiente.

Características

El conjunto fijo de estados que se pueden invalidar es:

  • Hidden: las mallas respectivas del gráfico de escenas se ocultan o se muestran.

  • Tint color: un objeto representado puede ser color-tintado con su color de tono individual y peso de tono. En la imagen siguiente se muestra el tinte de color del borde de una rueda.

    Tint color used to turn an object green

  • See-through: la geometría se representa de forma semitransparente, por ejemplo, para mostrar las partes internas de un objeto. En la imagen siguiente se muestra el coche completo que se representa en el modo transparente, excepto la mordaza de freno roja:

    See-through mode used to make selected objects transparent

    Importante

    El efecto transparente solo funciona cuando se usa el modo de representaciónTileBasedComposition.

    Nota:

    El efecto transparente se omite para las nubes de puntos.

  • Shell: la geometría se representa como un shell transparente y saturado. Este modo permite atenuar las partes no importantes de una escena mientras mantiene una sensación de forma y posicionamiento relativo. Para cambiar la apariencia de la representación del shell, use el estado ShellRenderingSettings. Vea la imagen siguiente del modelo de automóvil representado completamente en el shell, excepto los amortiguadores azules:

    Shell mode used to fade out specific objects

    Importante

    El efecto de shell solo funciona cuando se usa el modo de representaciónTileBasedComposition.

    Nota:

    El efecto del shell se omite para las nubes de puntos.

  • Selected: La geometría se representa con un contorno de selección.

    Outline option used to highlight a selected part

    Nota:

    La representación del esquema de selección se omite para las nubes de puntos.

  • DisableCollision: La geometría está exenta de consultas espaciales. La marca Hidden no afecta a la marca del estado de las colisiones, por lo que estas dos marcas se suelen establecer juntas.

  • TransparencyWritesDepth: activa la escritura de profundidad para See-through las transparencias de material y en el árbol de escena de la entidad del componente. Con esta marca, See-through las transparencias pueden tener la escritura en profundidad habilitada o deshabilitada en un subárbol, incluso si TransparencyWritesDepth se fuerza globalmente. Para la transparencia del material, la marca se comporta de forma inclusiva, lo que significa que si TransparencyWritesDepth está habilitada con invalidación, forzada globalmente o a través de las marcas del material, la escritura en profundidad se habilitará para los objetos representados con este material.

  • UseCutPlaneFilterMask: use una máscara de bits de filtro individual para controlar la selección del plano de corte. Esta marca determina si se debe usar la máscara de filtro individual o si se hereda de su elemento primario. La máscara de bits de filtro se establece mediante la propiedad CutPlaneFilterMask. Para obtener información detallada sobre cómo funciona el filtrado, vea el párrafo Planos de corte selectivos. En el ejemplo siguiente solo están cortados el neumático y la llanta, mientras que el resto de la escena permanece intacta. Selective cut planes

Sugerencia

Como alternativa a desactivar las consultas espaciales y de visibilidad de un subgráfico completo, se puede alternar el estado enabled de un objeto de juego. Si una jerarquía está deshabilitada, esto tiene preferencia sobre cualquier HierarchicalStateOverrideComponent.

Invalidaciones jerárquicas

HierarchicalStateOverrideComponent se puede adjuntar en varios niveles de una jerarquía de objetos. Puesto que solo puede haber un componente de cada tipo en una entidad, cada objeto HierarchicalStateOverrideComponent administra los estados oculto, transparente, selección, tono de color y colisión.

Por lo tanto, cada estado se puede establecer como:

  • ForceOn: el estado está habilitado para todas las mallas de este nodo y niveles inferiores.
  • ForceOff: el estado está deshabilitado para todas las mallas de este nodo y niveles inferiores.
  • InheritFromParent: el estado no se ve afectado por este componente de invalidación.

Puede cambiar los estados directamente o mediante la función SetState:

HierarchicalStateOverrideComponent component = ...;

// set one state directly
component.HiddenState = HierarchicalEnableState.ForceOn;

// set a state with the SetState function
component.SetState(HierarchicalStates.SeeThrough, HierarchicalEnableState.InheritFromParent);

// set multiple states at once with the SetState function
component.SetState(HierarchicalStates.Hidden | HierarchicalStates.DisableCollision, HierarchicalEnableState.ForceOff);
ApiHandle<HierarchicalStateOverrideComponent> component = ...;

// set one state directly
component->SetHiddenState(HierarchicalEnableState::ForceOn);

// or: set a state with the SetState function
component->SetState(HierarchicalStates::SeeThrough, HierarchicalEnableState::InheritFromParent);

// set multiple states at once with the SetState function
component->SetState(
    (HierarchicalStates)((int32_t)HierarchicalStates::Hidden | (int32_t)HierarchicalStates::DisableCollision), HierarchicalEnableState::ForceOff);

Color de tono

La invalidación de tint color es ligeramente especial, ya que hay tanto un estado activado/desactivado/heredado como una propiedad de color de tono. La parte alfa del color de tono define el peso del efecto de tinción: si se establece en 0,0, no hay ningún color de tono visible y, si se establece en 1,0, el objeto se representará con color de tono puro. En el caso de los valores intermedios, el color final se combinará con el color del tono. El color del tono se puede cambiar en cada fotograma para lograr una animación de color.

Consideraciones de rendimiento

Una instancia de HierarchicalStateOverrideComponent no agrega mucha sobrecarga en tiempo de ejecución. Sin embargo, siempre es recomendable mantener un número bajo de componentes activos. Por ejemplo, al implementar un sistema de selección que resalta el objeto seleccionado, se recomienda eliminar el componente al quitar el resaltado. El mantenimiento de los componentes en torno a características neutras puede sumar rápidamente.

La representación transparente coloca más carga de trabajo en las GPU del servidor que la representación estándar. Si las partes grandes del gráfico de escena cambian a transparente, con muchas capas de geometría visibles, puede convertirse en un cuello de botella de rendimiento. Todo esto se puede aplicar a los objetos con contornos de selección y para la representación del shell .

Documentación de la API

Pasos siguientes