ALCCSectionPlane: piano di sezione del 3DGS
Actor del piano di sezione che taglia una scena LCC con un piano e ne mantiene un lato.
| Modulo | LCC4UnrealRuntime |
| Header | Tools/LCCSectionPlane.h |
| Classe padre | AVolume |
| Nome visualizzato nel pannello | LCC Section Plane |
#include "Tools/LCCSectionPlane.h"
Per i passi d'uso, una dimostrazione e la descrizione del pannello delle proprietà, vedere Modifica della scena - Piani di sezione. Questa pagina elenca solo le interfacce.
L'editor mostra un componente a freccia che indica l'orientamento del piano, e il lato verso cui punta la freccia è Upside.
Proprietà
| Proprietà | Tipo | Descrizione |
|---|---|---|
bEnabled | bool | Se partecipa al sezionamento |
Mode | ESectionType | Upside rimuove ciò che si trova sopra il piano, Downside rimuove ciò che si trova sotto |
Sopra e sotto sono relativi all'orientamento del piano stesso, non alle coordinate del mondo. Ruotando il piano di sezione si ottiene una sezione in qualsiasi direzione. Per il significato dei valori vedere ESectionType.
Nessuna delle due 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.
Refresh() ha bisogno di questa associazione per avere effetto, perché internamente contrassegna il Component associato come da ricostruire nello stato di rendering. Senza associazione non viene innescato alcun aggiornamento del rendering.
Refresh
UFUNCTION(BlueprintCallable, Category = "XGrids")
void Refresh();
Innesca manualmente un aggiornamento del risultato del sezionamento; internamente contrassegna il Component LCC associato come da ricostruire nello stato di rendering.
Una chiamata è necessaria dopo aver modificato un piano di sezione a runtime perché la modifica abbia effetto, comprese:
- Modifiche delle proprietà:
bEnabled,Mode. Queste proprietà non hanno un Setter e un'assegnazione diretta non notifica il lato rendering. - Modifiche del transform:
SetActorLocation,SetActorRotation.
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 AddSectionPlane. Nessun aggiornamento del rendering viene innescato finché non è associato alcun Component.
Quando si modificano più piani di sezione in una volta, chiamare Refresh() su ciascuno dopo aver modificato le sue proprietà.
Creazione a runtime
#include "Tools/LCCSectionPlane.h"
#include "LCCComponentBase.h"
ALCCSectionPlane* AMyTool::CreateSectionPlane(
ULCCComponentBase* Component, const FVector& Location, const FRotator& Rotation)
{
ALCCSectionPlane* Plane = GetWorld()->SpawnActor<ALCCSectionPlane>(
ALCCSectionPlane::StaticClass(), Location, Rotation);
if (!Plane)
{
return nullptr;
}
Plane->Mode = ESectionType::Upside; // rimuove ciò che si trova sopra il piano
Plane->bEnabled = true;
Plane->SetUpdateComponent(Component);
Component->AddSectionPlane(Plane);
return Plane;
}
Alcune configurazioni comuni:
| Effetto | Posizione e rotazione | Mode |
|---|---|---|
| Vista dall'alto dell'interno di un edificio | Un'altezza determinata, FRotator::ZeroRotator | Upside |
| Sezione verticale per osservare una facciata | FRotator(0, 0, 90) per rendere il piano verticale | Upside |
| Mantenere solo lo strato intermedio | Un piano sopra e uno sotto | Downside per il limite inferiore, Upside per quello superiore |
Spostare il piano di sezione produce un'animazione di rivelazione strato per strato. Chiamare Refresh() dopo ogni spostamento a runtime:
FVector Loc = SectionPlane->GetActorLocation();
Loc.Z = FMath::FInterpTo(Loc.Z, TargetHeight, DeltaTime, 1.0f);
SectionPlane->SetActorLocation(Loc);
SectionPlane->Refresh(); // le modifiche del transform a runtime non si aggiornano automaticamente
Anche le modifiche delle proprietà richiedono un refresh:
SectionPlane->bEnabled = false;
SectionPlane->Refresh();
Per i nodi Blueprint vedere Modifica della scena - Metodi Blueprint.
Note
- Il sezionamento influisce solo sul rendering, non sulle collisioni. Una parte rimossa dal sezionamento può ancora essere colpita da un raggio e continua a bloccare un personaggio.
UpsideeDownsidesono relativi all'orientamento del piano stesso. Dopo una rotazione, verificare di nuovo quale lato sia «sopra»; guardare la freccia nell'editor è il modo più diretto.- La scala Z è impostata a 0.01 alla costruzione (una fetta sottile) e modificare la scala nell'editor la riporta a quel valore. Una modifica della scala a runtime non è soggetta a questo vincolo, ma di norma non serve.
- Il numero di piani di sezione attivi contemporaneamente è limitato, a 50 senza licenza; quelli in eccesso non partecipano al rendering e viene registrato un avviso. Piani di sezione e volumi di taglio condividono questa quota. Per le licenze vedere Edizioni e licenze.
- Distruggere un piano di sezione innesca solo un aggiornamento del rendering e non rimuove l'elemento dall'array
SectionPlanesdel Component, lasciando un puntatore obsoleto nell'array (ignorato automaticamente durante il rendering). Per mantenere l'array pulito, chiamareRemoveSectionPlaneprima della distruzione.
Vedere anche
- Modifica della scena: descrizione d'uso completa
- ALCCClippingVolume: taglio con un volume delimitato
- ULCCComponentBase:
AddSectionPlaneeRemoveSectionPlane