ALCCClippingVolume: объём обрезки 3DGS
Actor объёма обрезки, отсекающий часть сцены LCC объёмом в форме бокса или сферы.
| Модуль | LCC4UnrealRuntime |
| Заголовочный файл | Tools/LCCClippingVolume.h |
| Родительский класс | AVolume |
| Отображаемое имя в панели | LCC Clipping Volume |
#include "Tools/LCCClippingVolume.h"
Порядок применения, демонстрацию и описание панели свойств см. в Редактировании сцены — объёмы обрезки. На этой странице приведены только интерфейсы.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
bEnabled | bool | Участвует ли он в обрезке |
Mode | EClipType | Inside обрезает внутреннюю часть объёма, Outside — внешнюю |
VolumeType | EClipVolumeType | Box — бокс, Sphere — сфера |
Значение элементов см. в EClipType и EClipVolumeType.
Ни у одного из трёх свойств нет сеттера, присваивай значение напрямую. Изменение свойства или преобразования во время выполнения вступает в силу на следующем кадре, уведомлять сторону рендеринга вручную не нужно.
Методы
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/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;
// the size of an AVolume is controlled through scaling
Volume->SetActorScale3D(Extent / 100.0f);
Component->AddClippingVolume(Volume);
return Volume;
}
Чтобы временно переключить эффект обрезки, не добавляй и не удаляй элементы массива: изменить bEnabled легче:
for (ALCCClippingVolume* Volume : MyVolumes)
{
if (Volume)
{
Volume->bEnabled = bEnable;
}
}
Для анимации перемещения объёма обрезки во время выполнения достаточно изменить преобразование:
// sweep the clipping volume across the scene
FVector Loc = ClipVolume->GetActorLocation();
Loc.X += 200.0f * DeltaTime;
ClipVolume->SetActorLocation(Loc);
Узлы Blueprint см. в Редактировании сцены — методы Blueprint.
Замечания
- Обрезка влияет только на рендеринг, но не на коллизии. Обрезанная область по-прежнему может быть поражена лучом и по-прежнему преграждает путь персонажу.
- Несколько объёмов обрезки, действующих одновременно, вычисляются независимо, и их эффекты складываются. Смешивание
InsideиOutsideлегко приводит к неожиданным результатам. - Количество одновременно действующих объёмов обрезки ограничено, без лицензии — 50; лишние не участвуют в рендеринге, и выводится предупреждение. Объёмы обрезки и секущие плоскости используют общую квоту. О лицензировании см. Редакции и лицензирование.
- Уничтожение объёма обрезки вызывает лишь одно обновление рендеринга и не удаляет элемент из массива
ClippingVolumesу Component, поэтому в массиве остаётся недействительный указатель (при рендеринге он автоматически пропускается). Чтобы массив оставался чистым, вызовиRemoveClippingVolumeперед уничтожением.
Смотрите также
- Редактирование сцены: полное описание применения
- ALCCSectionPlane: сечение плоскостью
- ULCCComponentBase:
AddClippingVolumeиRemoveClippingVolume