Condividi tramite


Override dello stato gerarchico

In molti casi, è necessario modificare in modo dinamico l'aspetto di parti di un modello, ad esempio nascondere sottografi o passare parti al rendering trasparente. La modifica dei materiali di ogni parte interessata non è pratica perché richiede di scorrere l'intero grafico della scena e gestire la clonazione e l'assegnazione dei materiali in ogni nodo.

Per completare questo caso d'uso con il minor sovraccarico possibile, utilizzare HierarchicalStateOverrideComponent. Questo componente implementa gli aggiornamenti dello stato gerarchico in rami arbitrari del grafo della scena. Ciò significa che uno stato può essere definito in qualsiasi livello del grafico della scena e si insidia nella gerarchia fino a quando non viene sottoposto a override da un nuovo stato o applicato a un oggetto foglia.

Nel caso del modello di un'automobile, ad esempio, è possibile rendere l’intera automobile trasparente, ad eccezione della parte interna del motore. Questo caso d'uso coinvolge solo due istanze del componente:

  • Il primo componente viene assegnato al nodo radice del modello e attiva il rendering trasparente per l'intera automobile.
  • Il secondo componente viene assegnato al nodo radice del motore e sostituisce di nuovo lo stato disattivando in modo esplicito la modalità trasparente.

Nota

Le nuvole di punti non espongono un grafico a scena completa (vedere differenze tra i tipi di mesh), quindi l'assegnazione di un override gerarchico all'entità radice di un modello cloud di punti applicherà lo stato al cloud del punto completo. Inoltre, alcune funzionalità di override dello stato non sono supportate per i cloud di punti, come indicato nella rispettiva sezione.

Funzionalità

Il set fisso di stati di cui è possibile eseguire l'override sono:

  • Hidden: le rispettive mesh nel grafico della scena sono nascoste o visualizzate.

  • Tint color: un oggetto di cui è stato eseguito il rendering può essere colorato con il colore e il peso della tinta individuali. L'immagine seguente mostra la colorazione del cerchione di una ruota.

    Tint color used to turn an object green

  • See-through: viene eseguito il rendering semitrasparente della geometria, ad esempio per rivelare le parti interne di un oggetto. Nell'immagine seguente viene mostrata l'intera automobile sottoposta a rendering in modalità trasparente, ad eccezione della pinza del freno rossa:

    See-through mode used to make selected objects transparent

    Importante

    L'effetto see-through funziona solo quando viene usata la modalità di rendering TileBasedComposition.

    Nota

    L'effetto see-through viene ignorato per le nuvole di punti.

  • Shell: viene eseguito il rendering della geometria come shell trasparente e saturazione. Questa modalità consente di dissolvere parti non importanti di una scena mantenendo comunque un senso di forma e posizionamento relativo. Per modificare l'aspetto del rendering della shell, usare lo stato ShellRendering Impostazioni. Vedere l'immagine seguente per il modello di auto di cui viene eseguito il rendering interamente in shell, ad eccezione delle sorgenti blu:

    Shell mode used to fade out specific objects

    Importante

    L'effetto shell funziona solo quando viene usata la modalità di rendering TileBasedComposition.

    Nota

    L'effetto shell viene ignorato per le nuvole di punti.

  • Selected: viene eseguito il rendering della geometria con un contorno di selezione.

    Outline option used to highlight a selected part

    Nota

    Il rendering della struttura di selezione viene ignorato per le nuvole di punti.

  • DisableCollision: la geometria è esente da query spaziali. Il Hidden flag non influisce sul flag di stato di collisione, quindi questi due flag vengono spesso impostati insieme.

  • TransparencyWritesDepth: attiva la scrittura approfondita per See-through le trasparenze materiali e nell'albero della scena dell'entità del componente. Usando questo flag, See-through le trasparenze possono avere una scrittura approfondita abilitata o disabilitata in un sottoalbero, anche se TransparencyWritesDepth è forzata a livello globale. Per la trasparenza del materiale, il flag si comporta in modo inclusivo, ovvero se TransparencyWritesDepth è abilitato con override, forzato a livello globale o tramite i flag del materiale, la scrittura di profondità verrà abilitata per gli oggetti sottoposti a rendering con questo materiale.

  • UseCutPlaneFilterMask: usare una maschera di bit di filtro singola per controllare la selezione del piano di taglio. Questo flag determina se la maschera di filtro singola deve essere utilizzata o ereditata dal relativo elemento padre. La maschera di bit del filtro viene impostata tramite la CutPlaneFilterMask proprietà . Per informazioni dettagliate sul funzionamento del filtro, vedere il paragrafo Piani di taglio selettivo. Vedere l'esempio seguente in cui solo il pneumatico e il bordo vengono tagliati mentre il resto della scena rimane invariato. Selective cut planes

Suggerimento

In alternativa alla disattivazione della visibilità e delle query spaziali per un sottografo completo, è possibile attivare/disattivare lo enabled stato di un oggetto gioco. Se una gerarchia è disabilitata, questa preferenza è rispetto a qualsiasi HierarchicalStateOverrideComponentoggetto .

Override gerarchici

HierarchicalStateOverrideComponent può essere collegato a più livelli di una gerarchia di oggetti. Poiché può essere presente solo un componente di ciascun tipo in un'entità, ogni HierarchicalStateOverrideComponent gestisce gli stati per hidden, see-through, selected, color tint e collision.

Pertanto, ogni stato può essere impostato su uno dei seguenti:

  • ForceOn - lo stato è abilitato per tutte le mesh su questo nodo e sotto di esso
  • ForceOff - lo stato è disabilitato per tutte le mesh su questo nodo e sotto di esso
  • InheritFromParent - lo stato non è interessato da questo componente di override

È possibile modificare gli stati direttamente o tramite la funzione 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);

Colore tinta

L'override tint color è leggermente speciale in quanto è presente sia uno stato on/off/inherit che una proprietà colore tinta. La parte alfa del colore della tinta definisce il peso dell'effetto tinta: se impostato su 0,0, non è visibile alcun colore di tinta e se impostato su 1,0 verrà eseguito il rendering dell'oggetto con colore tinta puro. Per i valori intermedi, il colore finale verrà combinato con il colore tinta. Il colore tinta può essere modificato per i singoli frame per ottenere un'animazione di colori.

Considerazioni sulle prestazioni

Un'istanza di HierarchicalStateOverrideComponent non aggiunge molto sovraccarico in fase di esecuzione. Tuttavia, è sempre consigliabile fare in modo che il numero di componenti attivi sia basso. Ad esempio, quando si implementa un sistema di selezione che evidenzia l'oggetto selezionato, è consigliabile eliminare il componente quando l'evidenziazione viene rimossa. Il mantenimento di componenti con funzionalità neutre può aggiungere rapidamente sovraccarico.

Il rendering trasparente aggiunge un carico di lavoro maggiore sulle GPU del server rispetto al rendering standard. Se parti di grandi dimensioni del grafo della scena sono impostate come see-through, con molti livelli di geometria visibili, si potrebbe verificare un collo di bottiglia nelle prestazioni. Lo stesso vale per gli oggetti con contorni di selezione e per il rendering della shell .

Documentazione sull'API

Passaggi successivi