ALCCClippingVolume: volume di taglio del 3DGS
Actor del volume di taglio che rimuove parte di una scena LCC con un volume a scatola o a sfera.
| Modulo | LCC4UnrealRuntime |
| Header | Tools/LCCClippingVolume.h |
| Classe padre | AVolume |
| Nome visualizzato nel pannello | LCC Clipping Volume |
#include "Tools/LCCClippingVolume.h"
Per i passi d'uso, una dimostrazione e la descrizione del pannello delle proprietà, vedere Modifica della scena - Volumi di taglio. Questa pagina elenca solo le interfacce.
Proprietà
| Proprietà | Tipo | Descrizione |
|---|---|---|
bEnabled | bool | Se partecipa al taglio |
Mode | EClipType | Inside rimuove l'interno del volume, Outside rimuove l'esterno |
VolumeType | EClipVolumeType | Box per una scatola, Sphere per una sfera |
Per il significato dei valori vedere EClipType e EClipVolumeType.
Nessuna delle tre proprietà ha un Setter, e un'assegnazione a runtime richiede una chiamata a Refresh per avere effetto. Lo stesso vale per una modifica del transform a runtime.
Metodi
SetUpdateComponent
UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetUpdateComponent(ULCCComponentBase* Component);
Associa il Component LCC da aggiornare.
| Parametro | Tipo | Descrizione |
|---|---|---|
Component | ULCCComponentBase* | Component di destinazione |
Refresh() ha bisogno di questa associazione per avere effetto, perché internamente contrassegna il Component associato come da ricostruire nello stato di rendering. Senza associazione, Refresh() non innesca alcun aggiornamento del rendering.
Aggiungere un volume con AddClippingVolume di norma stabilisce già l'associazione; quando una modifica a un volume di taglio creato dinamicamente a runtime non ha effetto, verificare prima se questo metodo sia stato chiamato.
Refresh
UFUNCTION(BlueprintCallable, Category = "XGrids")
void Refresh();
Innesca manualmente un aggiornamento del risultato del taglio; internamente contrassegna il Component LCC associato come da ricostruire nello stato di rendering.
Una chiamata è necessaria dopo aver modificato un volume di taglio a runtime perché la modifica abbia effetto, comprese:
- Modifiche delle proprietà:
bEnabled,Mode,VolumeType. Queste proprietà non hanno un Setter e un'assegnazione diretta non notifica il lato rendering. - Modifiche del transform:
SetActorLocation,SetActorRotation,SetActorScale3D.
Gli aggiornamenti automatici avvengono solo nell'editor: le modifiche delle proprietà nel pannello Details passano per PostEditChangeProperty e il trascinamento del gizmo passa per funzioni come EditorApplyTranslation. Questi percorsi sono tutti sotto WITH_EDITOR e non esistono a runtime.
Richiede che SetUpdateComponent sia stato chiamato, oppure che l'associazione sia stata stabilita tramite AddClippingVolume. Nessun aggiornamento del rendering viene innescato finché non è associato alcun Component.
Quando si modificano più volumi di taglio in una volta, chiamare Refresh() su ciascuno dopo aver modificato le sue proprietà.
Creazione a runtime
#include "Tools/LCCClippingVolume.h"
#include "LCCComponentBase.h"
ALCCClippingVolume* AMyTool::CreateBoxClip(
ULCCComponentBase* Component, const FVector& Location, const FVector& Extent)
{
ALCCClippingVolume* Volume = GetWorld()->SpawnActor<ALCCClippingVolume>(
ALCCClippingVolume::StaticClass(), Location, FRotator::ZeroRotator);
if (!Volume)
{
return nullptr;
}
Volume->VolumeType = EClipVolumeType::Box;
Volume->Mode = EClipType::Inside;
Volume->bEnabled = true;
// la dimensione di un AVolume è controllata tramite la scalatura
Volume->SetActorScale3D(Extent / 100.0f);
Volume->SetUpdateComponent(Component);
Component->AddClippingVolume(Volume);
return Volume;
}
Per attivare e disattivare temporaneamente l'effetto di taglio, non aggiungere e rimuovere elementi dell'array; modificare bEnabled è più leggero. Ricordare di chiamare Refresh() dopo la modifica:
for (ALCCClippingVolume* Volume : MyVolumes)
{
if (Volume)
{
Volume->bEnabled = bEnable;
Volume->Refresh();
}
}
Anche spostare un volume di taglio a runtime per un'animazione richiede un refresh ogni volta:
// far scorrere il volume di taglio attraverso la scena
FVector Loc = ClipVolume->GetActorLocation();
Loc.X += 200.0f * DeltaTime;
ClipVolume->SetActorLocation(Loc);
ClipVolume->Refresh(); // le modifiche del transform a runtime non si aggiornano automaticamente
Per i nodi Blueprint vedere Modifica della scena - Metodi Blueprint.
Note
- Il taglio influisce solo sul rendering, non sulle collisioni. Un'area rimossa dal taglio può ancora essere colpita da un raggio e continua a bloccare un personaggio.
- Più volumi di taglio attivi contemporaneamente vengono valutati in modo indipendente e i loro effetti si sommano. Mescolare
InsideeOutsideproduce facilmente risultati inattesi. - Il numero di volumi di taglio attivi contemporaneamente è limitato, a 50 senza licenza; quelli in eccesso non partecipano al rendering e viene registrato un avviso. Volumi di taglio e piani di sezione condividono questa quota. Per le licenze vedere Edizioni e licenze.
- Distruggere un volume di taglio innesca solo un aggiornamento del rendering e non rimuove l'elemento dall'array
ClippingVolumesdel Component, lasciando un puntatore obsoleto nell'array (ignorato automaticamente durante il rendering). Per mantenere l'array pulito, chiamareRemoveClippingVolumeprima della distruzione.
Vedere anche
- Modifica della scena: descrizione d'uso completa
- ALCCSectionPlane: sezionamento con un piano
- ULCCComponentBase:
AddClippingVolumeeRemoveClippingVolume