ALCCSectionPlane: plano de sección del 3DGS
Actor de plano de sección que corta una escena LCC con un plano y conserva uno de sus lados.
| Módulo | LCC4UnrealRuntime |
| Cabecera | Tools/LCCSectionPlane.h |
| Clase padre | AVolume |
| Nombre mostrado en el panel | LCC Section Plane |
#include "Tools/LCCSectionPlane.h"
Para los pasos de uso, una demostración y la descripción del panel de propiedades, consultar Edición de escenas - Planos de sección. Esta página solo enumera las interfaces.
El editor muestra un componente de flecha que indica la orientación del plano, y el lado hacia el que apunta la flecha es Upside.
Propiedades
| Propiedad | Tipo | Descripción |
|---|---|---|
bEnabled | bool | Si participa en el seccionado |
Mode | ESectionType | Upside recorta lo que queda por encima del plano, Downside recorta lo que queda por debajo |
Arriba y abajo son relativos a la orientación del propio plano, no a las coordenadas del mundo. Rotar el plano de sección permite obtener una sección en cualquier dirección. Para el significado de los valores, consultar ESectionType.
Ninguna de las dos propiedades tiene Setter, y una asignación en tiempo de ejecución requiere una llamada a Refresh para surtir efecto. Lo mismo se aplica a un cambio del transform en tiempo de ejecución.
Métodos
SetUpdateComponent
UFUNCTION(BlueprintCallable, Category = "XGrids")
void SetUpdateComponent(ULCCComponentBase* Component);
Vincula el Component LCC que se debe actualizar.
Refresh() necesita esta vinculación para surtir efecto, ya que internamente marca el Component vinculado como necesitado de reconstruir su estado de renderizado. Sin vinculación, no se provoca ninguna actualización del renderizado.
Refresh
UFUNCTION(BlueprintCallable, Category = "XGrids")
void Refresh();
Provoca manualmente una actualización del resultado del seccionado; internamente marca el Component LCC vinculado como necesitado de reconstruir su estado de renderizado.
Es necesaria una llamada después de cambiar un plano de sección en tiempo de ejecución para que el cambio surta efecto, lo que incluye:
- Cambios de propiedades:
bEnabled,Mode. Estas propiedades no tienen Setter, y una asignación directa no notifica al lado del renderizado. - Cambios del transform:
SetActorLocation,SetActorRotation.
Las actualizaciones automáticas solo se producen en el editor: los cambios de propiedades en el panel Details pasan por PostEditChangeProperty, y arrastrar el gizmo pasa por funciones como EditorApplyTranslation. Todas esas vías están bajo WITH_EDITOR y no existen en tiempo de ejecución.
Requiere que se haya llamado a SetUpdateComponent, o que la asociación se haya establecido mediante AddSectionPlane. No se provoca ninguna actualización del renderizado mientras no haya ningún Component vinculado.
Al cambiar varios planos de sección a la vez, llamar a Refresh() en cada uno después de cambiar sus propiedades.
Creación en tiempo de ejecución
#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; // recortar lo que queda por encima del plano
Plane->bEnabled = true;
Plane->SetUpdateComponent(Component);
Component->AddSectionPlane(Plane);
return Plane;
}
Algunas configuraciones habituales:
| Efecto | Posición y rotación | Mode |
|---|---|---|
| Vista superior del interior de un edificio | Una altura dada, FRotator::ZeroRotator | Upside |
| Sección vertical para ver una fachada | FRotator(0, 0, 90) para poner el plano en vertical | Upside |
| Conservar solo la capa intermedia | Un plano por encima y otro por debajo | Downside para el límite inferior, Upside para el límite superior |
Mover el plano de sección produce una animación de descubrimiento capa por capa. Llamar a Refresh() después de cada movimiento en tiempo de ejecución:
FVector Loc = SectionPlane->GetActorLocation();
Loc.Z = FMath::FInterpTo(Loc.Z, TargetHeight, DeltaTime, 1.0f);
SectionPlane->SetActorLocation(Loc);
SectionPlane->Refresh(); // los cambios del transform en tiempo de ejecución no se actualizan automáticamente
Los cambios de propiedades también necesitan una actualización:
SectionPlane->bEnabled = false;
SectionPlane->Refresh();
Para los nodos de Blueprint, consultar Edición de escenas - Métodos de Blueprint.
Notas
- El seccionado solo afecta al renderizado, no a la colisión. Una parte seccionada puede seguir siendo impactada por un rayo y sigue bloqueando a un personaje.
UpsideyDownsideson relativos a la orientación del propio plano. Después de una rotación, confirmar de nuevo qué lado es "arriba"; mirar la flecha en el editor es la forma más directa.- La escala Z se establece en 0.01 durante la construcción (una lámina fina), y cambiar la escala en el editor se fuerza de vuelta a ese valor. Un cambio de escala en tiempo de ejecución no está sujeto a esta restricción, pero normalmente no necesita cambiarse.
- El número de planos de sección activos a la vez está limitado, a 50 sin licencia; los excedentes no participan en el renderizado y se registra una advertencia. Los planos de sección y los volúmenes de recorte comparten esta cuota. Para las licencias, consultar Ediciones y licencias.
- Destruir un plano de sección solo provoca una actualización del renderizado y no elimina el elemento del array
SectionPlanesdel Component, lo que deja un puntero obsoleto en el array (se omite automáticamente durante el renderizado). Para mantener el array limpio, llamar aRemoveSectionPlaneantes de destruirlo.
Véase también
- Edición de escenas: descripción completa de uso
- ALCCClippingVolume: recorte con un volumen delimitado
- ULCCComponentBase:
AddSectionPlaneyRemoveSectionPlane