ALCCSectionPlane: 3DGS-Schnittebene
Schnittebenen-Actor, der eine LCC-Szene mit einer Ebene schneidet und eine Seite davon behält.
| Modul | LCC4UnrealRuntime |
| Header | Tools/LCCSectionPlane.h |
| Basisklasse | AVolume |
| Angezeigter Name im Panel | LCC Section Plane |
#include "Tools/LCCSectionPlane.h"
Zu den Schritten der Verwendung, einer Vorführung und der Beschreibung des Eigenschaften-Panels siehe Szenenbearbeitung - Schnittebenen. Diese Seite nennt nur die Schnittstellen.
Der Editor zeigt eine Arrow-Component, die die Ausrichtung der Ebene angibt; die Seite, auf die der Pfeil zeigt, ist Upside.
Eigenschaften
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
bEnabled | bool | Ob sie am Schneiden teilnimmt |
Mode | ESectionType | Upside schneidet weg, was über der Ebene liegt, Downside schneidet weg, was darunter liegt |
Oben und unten beziehen sich auf die Ausrichtung der Ebene selbst, nicht auf die Weltkoordinaten. Das Drehen der Schnittebene ergibt einen Schnitt in beliebiger Richtung. Zur Bedeutung der Werte siehe ESectionType.
Keine der beiden Eigenschaften hat einen Setter, und eine Zuweisung zur Laufzeit erfordert einen Aufruf von Refresh, um wirksam zu werden. Dasselbe gilt für eine Änderung des Transforms zur Laufzeit.
Methoden
SetUpdateComponent
UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetUpdateComponent(ULCCComponentBase* Component);
Bindet die zu aktualisierende LCC Component.
Refresh() benötigt diese Bindung, um wirksam zu werden, da es intern die gebundene Component als „Render-Zustand neu aufzubauen“ markiert. Ohne Bindung wird keine Aktualisierung des Renderings ausgelöst.
Refresh
UFUNCTION(BlueprintCallable, Category = "XGrids")
void Refresh();
Löst eine Aktualisierung des Schnittergebnisses von Hand aus; intern wird die gebundene LCC Component als „Render-Zustand neu aufzubauen“ markiert.
Ein Aufruf ist nach dem Ändern einer Schnittebene zur Laufzeit erforderlich, damit die Änderung wirksam wird, darunter:
- Änderungen von Eigenschaften:
bEnabled,Mode. Diese Eigenschaften haben keinen Setter, und eine unmittelbare Zuweisung benachrichtigt die Rendering-Seite nicht. - Änderungen des Transforms:
SetActorLocation,SetActorRotation.
Automatische Aktualisierungen finden nur im Editor statt: Änderungen von Eigenschaften im Details-Panel laufen über PostEditChangeProperty, das Ziehen der Gizmo über Funktionen wie EditorApplyTranslation. Diese Wege liegen alle unter WITH_EDITOR und existieren zur Laufzeit nicht.
Es erfordert, dass SetUpdateComponent aufgerufen wurde oder dass die Zuordnung über AddSectionPlane hergestellt wurde. Solange keine Component gebunden ist, wird keine Aktualisierung des Renderings ausgelöst.
Werden mehrere Schnittebenen auf einmal geändert, Refresh() an jeder einzelnen aufrufen, nachdem ihre Eigenschaften geändert wurden.
Erzeugen zur Laufzeit
#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; // wegschneiden, was über der Ebene liegt
Plane->bEnabled = true;
Plane->SetUpdateComponent(Component);
Component->AddSectionPlane(Plane);
return Plane;
}
Einige gängige Konfigurationen:
| Wirkung | Position und Rotation | Mode |
|---|---|---|
| Aufsicht in das Innere eines Gebäudes | Eine bestimmte Höhe, FRotator::ZeroRotator | Upside |
| Senkrechter Schnitt zum Betrachten einer Fassade | FRotator(0, 0, 90), damit die Ebene senkrecht steht | Upside |
| Nur die mittlere Schicht behalten | Eine Ebene darüber und eine darunter | Downside für die untere Grenze, Upside für die obere Grenze |
Das Bewegen der Schnittebene ergibt eine Animation, die Schicht für Schicht freilegt. Zur Laufzeit nach jeder Bewegung Refresh() aufrufen:
FVector Loc = SectionPlane->GetActorLocation();
Loc.Z = FMath::FInterpTo(Loc.Z, TargetHeight, DeltaTime, 1.0f);
SectionPlane->SetActorLocation(Loc);
SectionPlane->Refresh(); // Änderungen des Transforms zur Laufzeit aktualisieren nicht automatisch
Änderungen von Eigenschaften erfordern ebenfalls eine Aktualisierung:
SectionPlane->bEnabled = false;
SectionPlane->Refresh();
Zu den Blueprint-Nodes siehe Szenenbearbeitung - Blueprint-Methoden.
Hinweise
- Das Schneiden wirkt nur auf das Rendering, nicht auf die Kollision. Ein weggeschnittener Teil kann weiterhin von einem Strahl getroffen werden und blockiert weiterhin einen Charakter.
UpsideundDownsidebeziehen sich auf die Ausrichtung der Ebene selbst. Nach einer Rotation erneut bestätigen, welche Seite „oben“ ist; der Pfeil im Editor ist dafür der unmittelbarste Weg.- Die Z-Skalierung wird beim Konstruieren auf 0.01 gesetzt (eine dünne Scheibe), und eine Änderung der Skalierung im Editor wird auf diesen Wert zurückgesetzt. Eine Änderung der Skalierung zur Laufzeit unterliegt dieser Einschränkung nicht, ist aber normalerweise nicht nötig.
- Die Anzahl der gleichzeitig wirksamen Schnittebenen ist begrenzt, ohne Lizenz auf 50; die überzähligen nehmen nicht am Rendering teil und es wird eine Warnung protokolliert. Schnittebenen und Clipping-Volumen teilen sich dieses Kontingent. Zur Lizenzierung siehe Editionen und Lizenzierung.
- Das Zerstören einer Schnittebene löst nur eine Aktualisierung des Renderings aus und entfernt das Element nicht aus dem Array
SectionPlanesder Component, sodass ein veralteter Zeiger im Array bleibt (beim Rendering automatisch übersprungen). Um das Array sauber zu halten, vor dem ZerstörenRemoveSectionPlaneaufrufen.
Siehe auch
- Szenenbearbeitung: vollständige Beschreibung der Verwendung
- ALCCClippingVolume: Beschneiden mit einem begrenzten Volumen
- ULCCComponentBase:
AddSectionPlaneundRemoveSectionPlane