ALCCSectionPlane: секущая плоскость 3DGS
Actor секущей плоскости, разрезающий сцену LCC одной плоскостью и сохраняющий одну её сторону.
| Модуль | LCC4UnrealRuntime |
| Заголовочный файл | Tools/LCCSectionPlane.h |
| Родительский класс | AVolume |
| Отображаемое имя в панели | LCC Section Plane |
#include "Tools/LCCSectionPlane.h"
Порядок применения, демонстрацию и описание панели свойств см. в Редактировании сцены — секущие плоскости. На этой странице приведены только интерфейсы.
В редакторе отображается компонент-стрелка, указывающий ориентацию плоскости; сторона, куда направлена стрелка, и есть Upside.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
bEnabled | bool | Участвует ли она в сечении |
Mode | ESectionType | Upside отсекает то, что выше плоскости, Downside — то, что ниже |
Верх и низ отсчитываются от собственной ориентации плоскости, а не от мировых координат. Поворот секущей плоскости даёт сечение в любом направлении. Значение элементов см. в ESectionType.
Ни у одного из двух свойств нет сеттера, присваивай значение напрямую. Изменение свойства или преобразования во время выполнения вступает в силу на следующем кадре, уведомлять сторону рендеринга вручную не нужно.
Методы
SetUpdateComponent / Refresh (устарело)
UFUNCTION(BlueprintCallable, Category = "XGrids", meta = (DeprecatedFunction))
void SetUpdateComponent(ULCCComponentBase* Component);
UFUNCTION(BlueprintCallable, Category = "XGrids", meta = (DeprecatedFunction))
void Refresh();
Оба метода устарели и реализованы как пустые операции: вызов не даёт никакого эффекта и не приводит к ошибке.
Данные сечения теперь читаются каждый кадр, поэтому изменения свойств и преобразования отражаются в изображении на следующем кадре. Прежний порядок, когда сначала нужно было установить привязку через SetUpdateComponent, а после каждого изменения вызывать Refresh(), больше не нужен.
Вызовы в существующем коде можно просто удалить. В Blueprint эти два узла показывают предупреждение об устаревании, и замена сводится к удалению узла.
Создание во время выполнения
#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; // cut away what is above the plane
Plane->bEnabled = true;
Component->AddSectionPlane(Plane);
return Plane;
}
Несколько типичных конфигураций:
| Эффект | Положение и поворот | Mode |
|---|---|---|
| Вид сверху на внутреннюю часть строения | Заданная высота, FRotator::ZeroRotator | Upside |
| Вертикальное сечение для просмотра фасада | FRotator(0, 0, 90), чтобы плоскость стала вертикальной | Upside |
| Сохранить только средний слой | Одна плоскость сверху и одна снизу | Downside для нижней границы, Upside для верхней |
Перемещение секущей плоскости даёт анимацию послойного раскрытия: достаточно менять положение каждый кадр:
FVector Loc = SectionPlane->GetActorLocation();
Loc.Z = FMath::FInterpTo(Loc.Z, TargetHeight, DeltaTime, 1.0f);
SectionPlane->SetActorLocation(Loc);
Свойства изменяются так же напрямую:
SectionPlane->bEnabled = false;
Узлы Blueprint см. в Редактировании сцены — методы Blueprint.
Замечания
- Сечение влияет только на рендеринг, но не на коллизии. Отсечённая часть по-прежнему может быть поражена лучом и по-прежнему преграждает путь персонажу.
UpsideиDownsideотсчитываются от собственной ориентации плоскости. После поворота заново уточни, какая сторона считается «верхом»; проще всего посмотреть на стрелку в редакторе.- При конструировании масштаб по оси Z задаётся равным 0.01 (тонкий срез), и изменение масштаба в редакторе возвращается к этому значению. На изменение масштаба во время выполнения это ограничение не действует, но обычно менять его не требуется.
- Количество одновременно действующих секущих плоскостей ограничено, без лицензии — 50; лишние не участвуют в рендеринге, и выводится предупреждение. Секущие плоскости и объёмы обрезки используют общую квоту. О лицензировании см. Редакции и лицензирование.
- Уничтожение секущей плоскости вызывает лишь одно обновление рендеринга и не удаляет элемент из массива
SectionPlanesу Component, поэтому в массиве остаётся недействительный указатель (при рендеринге он автоматически пропускается). Чтобы массив оставался чистым, вызовиRemoveSectionPlaneперед уничтожением.
Смотрите также
- Редактирование сцены: полное описание применения
- ALCCClippingVolume: обрезка ограниченным объёмом
- ULCCComponentBase:
AddSectionPlaneиRemoveSectionPlane