ULCCComponent: компонент конвейера LCC
Component, специфичный для конвейера LCC1, наследует ULCCComponentBase. Помимо возможностей базового класса, дополнительно предоставляет трассировку луча по положениям splat и устранение швов.
| Модуль | LCC4UnrealRuntime |
| Заголовочный файл | LCCComponent.h |
| Родительский класс | ULCCComponentBase |
| Кто им владеет | ALCCActor |
#include "LCCComponent.h"
Получение экземпляра:
ULCCComponent* Comp = Cast<ULCCComponent>(LCCActor->GetLCCComponent());
Свойства
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
bEnableSeamCutting | bool | false | Включить устранение швов вручную, см. Устранение швов. Для файлов LCC версии 5.0 и выше включать вручную не нужно, оно работает автоматически |
LCCPerformance | FLCCRenderInfo | — | Параметры производительности, специфичные для LCC1, см. таблицу ниже |
MetaInfo (тип FLCCMetaInfo) — защищённый член, недоступный извне на стороне C++, и виден только Blueprint (в панели Details только для чтения). В C++ используй GetMetaInfo() базового класса, чтобы получить базовые поля.
LCCPerformance
Здесь тоже используется форма «переключатель плюс значение»: когда переключатель выключен, применяется значение по умолчанию из настроек проекта.
| Поле | Тип | По умолчанию | Переключатель | Описание |
|---|---|---|---|---|
SortFactor | float | 1 | bCanSetSortFactor | Коэффициент масштабирования частоты сортировки, диапазон 0.2~5, см. Sort Factor |
bAddExtraPreNodes | bool | true | bEnableExtraPreNodes | Добавлять дополнительные узлы предзагрузки, см. Add Extra Preload Nodes |
ULCCComponent* Comp = Cast<ULCCComponent>(LCCActor->GetLCCComponent());
if (Comp)
{
// Lower the sorting frequency to save performance
Comp->LCCPerformance.bCanSetSortFactor = true;
Comp->LCCPerformance.SortFactor = 2.0f;
// Head turns are fast in VR, add preload nodes
Comp->LCCPerformance.bEnableExtraPreNodes = true;
Comp->LCCPerformance.bAddExtraPreNodes = true;
}
Методы
GetUseSeamCut
bool GetUseSeamCut() const;
Включено ли устранение швов в шейдере. Возвращает true, если выполнено любое из условий: версия файла LCC не ниже 5.0 или вручную включено bEnableSeamCutting. Доступно только в C++.
Multi-Viewport
Интерфейсы для нескольких вьюпортов объявлены в базовом классе ULCCComponentBase, но работают только в конвейере LCC1. Методы SetPlayerLoadMode, SetPlayerRenderMode, SetSceneCaptureLoadMode, SetSceneCaptureRenderMode, ModifyPlayerTransform, CancelModifyPlayerTransform имеют смысл только при вызове на ULCCComponent.
Причина в том, что стратегию рендеринга по вьюпортам и планирование узлов обрабатывает путь рендеринга LCC1, а LCC2 к нему ещё не подключён. Вызов на ULCC2Component (включая ALCC2Actor и .sog / .spz / .ply) не приводит к ошибке, но и не даёт ожидаемого результата.
Если нужен разный рендеринг вида «основной вьюпорт с высоким качеством, мини-карта с низким» или предзагрузка перед телепортацией, сейчас это возможно только на данных LCC1.
Трассировка луча
⚠️ Эта группа интерфейсов недостаточно протестирована и может работать не так, как ожидается. В производственной среде используй схему «включить коллизии + трассировка луча движком»: сначала загрузи данные коллизий через SetLCCCollisionEnable, затем выполняй проверку штатными интерфейсами движка вида
LineTraceByChannel. Подробнее см. Коллизии.
LCC1 предоставляет четыре функции трассировки луча по положениям splat: целью проверки служат сами данные облака точек, файл коллизий не требуется.
Четыре функции делятся на группы по двум измерениям:
| Одно попадание | Несколько попаданий | |
|---|---|---|
| Радиус по умолчанию (10 сантиметров) | LineTraceSingle | LineTraceMulti |
| Пользовательский радиус | LineTraceSingleWithRadius | LineTraceMultiWithRadius |
Общие для всех четырёх отладочные параметры:
| Параметр | Тип | Описание |
|---|---|---|
Start | const FVector& | Начало луча, мировые координаты |
End | const FVector& | Конец луча, мировые координаты |
bDrawDebugLine | bool | Рисовать ли отладочную линию |
Duration | float | Время существования отладочной линии, в секундах |
Thickness | float | Толщина отладочной линии |
Примечание: на стороне C++ эти четыре функции объявлены как
protected, а на стороне Blueprint их можно вызывать напрямую как узлы. В C++ используй их в подклассеULCCComponentлибо переходи на штатную трассировку луча движка.
Рекомендация по выбору
В первую очередь используй тела коллизий и трассировку луча движком. Начиная с v0.6.0, если данные содержат файл коллизий и коллизии включены, LineTraceByChannel возвращает полный FHitResult (нормаль, материал, задетый компонент и другое), а также бесшовно работает с физикой, ИИ и навигацией движка, и этот путь хорошо проверен.
Специальные интерфейсы, описанные здесь, стоит рассматривать только в следующих случаях, причём с достаточным самостоятельным тестированием:
- У данных нет файла коллизий, и перейти на данные с коллизиями невозможно.
- Обязательно нужна информация об узле, которому принадлежит точка попадания (
FLCCSplat::NodeVectorдаёт X, Y и Level).
LineTraceSingle
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceSingle(const FVector& Start, const FVector& End, FLCCSplat& OutHit,
bool bDrawDebugLine, float Duration, float Thickness) const;
Одиночная трассировка луча, возвращает одну ближайшую точку попадания. Радиус проверки фиксирован и равен 10 сантиметрам.
| Параметр | Тип | Описание |
|---|---|---|
OutHit | FLCCSplat& | Выходная информация о попадании, содержит мировое положение Location и информацию об узле NodeVector |
Возвращает bool: true при попадании.
// In a subclass of ULCCComponent
void UMyLCCComponent::PickFromCamera(const FVector& CamLocation, const FVector& CamForward)
{
const FVector Start = CamLocation;
const FVector End = Start + CamForward * 10000.f;
FLCCSplat Hit;
if (LineTraceSingle(Start, End, Hit, true, 2.0f, 2.0f))
{
UE_LOG(LogTemp, Log, TEXT("Hit at %s, node %s"),
*Hit.Location.ToString(), *Hit.NodeVector.ToString());
}
}
Blueprint в виде текста, выбор кликом мыши:
[Input Action: Pick]
│ Pressed
▼
[Get Player Camera Manager] ──▶ [Get Camera Location] → Start
└─▶ [Get Actor Forward Vector]
│
▼
[Multiply] (× 10000)
│
▼
[Add] (Start + previous step) → End
│
▼
[Line Trace Single]
Target = (LCC Component)
Start = Start
End = End
Draw Debug Line = true
Duration = 2.0
Thickness = 2.0
│ Return Value ──┐
▼ │
[Branch] ◀───────────────┘
│ True
▼
[Break LCCSplat] ← connect to Out Hit
Location → used to place a marker
LineTraceSingleWithRadius
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceSingleWithRadius(const FVector& Start, const FVector& End, float Radius,
FLCCSplat& OutHit, bool bDrawDebugLine,
float Duration, float Thickness) const;
Одиночная трассировка луча с указанием радиуса проверки.
| Параметр | Тип | Описание |
|---|---|---|
Radius | float | Радиус проверки, в сантиметрах |
Замечания по применению:
- Облако точек дискретно, и при слишком малом радиусе луч легко проходит между точками, так что попадания нет, хотя ты явно указываешь на объект. В таком случае увеличь радиус.
- Чем больше радиус, тем легче попасть, но тем ниже точность: возвращённая точка может отклоняться от того места, куда ты действительно указывал.
- Для разреженных данных начинай с 20~50 сантиметров, для плотных достаточно 5~10 сантиметров.
FLCCSplat Hit;
// Use a large radius for sparse point clouds to improve the hit rate
if (LineTraceSingleWithRadius(Start, End, 30.0f, Hit, false, 0.f, 0.f))
{
SpawnMarkerAt(Hit.Location);
}
LineTraceMulti
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceMulti(const FVector& Start, const FVector& End,
bool bDrawDebugLine, float Duration, float Thickness,
TArray<FLCCSplat>& OutHits) const;
Множественная трассировка луча, возвращает все точки попадания на пути. Радиус проверки фиксирован и равен 10 сантиметрам.
| Параметр | Тип | Описание |
|---|---|---|
OutHits | TArray<FLCCSplat>& | Выход со всеми точками попадания |
Замечания по применению:
- Используется для проникающей проверки, например чтобы измерить, сколько слоёв конструкции пересекает линия, или выполнить анализ сечения.
- Количество точек попадания может быть очень большим, поэтому не вызывай метод каждый кадр.
TArray<FLCCSplat> Hits;
if (LineTraceMulti(Start, End, true, 3.0f, 1.0f, Hits))
{
UE_LOG(LogTemp, Log, TEXT("Passed through %d splats"), Hits.Num());
for (const FLCCSplat& Hit : Hits)
{
DrawDebugPoint(GetWorld(), Hit.Location, 8.f, FColor::Yellow, false, 3.f);
}
}
LineTraceMultiWithRadius
UFUNCTION(BlueprintCallable, Category = "XGrids|Raycast")
bool LineTraceMultiWithRadius(const FVector& Start, const FVector& End, float Radius,
bool bDrawDebugLine, float Duration, float Thickness,
TArray<FLCCSplat>& OutHits) const;
Множественная трассировка луча с указанием радиуса проверки. Значение параметров то же, что выше.
При большом радиусе количество точек попадания заметно возрастает, что удобно для статистических задач (например, чтобы оценить плотность точек в пределах некоторого цилиндра).
FLCCSplat
USTRUCT(BlueprintType)
struct FLCCSplat
{
FVector Location; // world coordinates of the hit point
FLCCVector NodeVector; // node the hit point belongs to
};
Поля X, Y и Level структуры FLCCVector определяют положение узла в октодереве. Level отражает уровень детализации, загруженный в этом месте в данный момент, и по нему можно судить, «вижу я детальные данные или грубые».
Полный набор полей см. в Structs.
Смотрите также
- ULCCComponentBase: общие интерфейсы рендеринга и производительности
- ULCC2Component: соответствующий компонент конвейера LCC2
- Structs: описание полей
FLCCSplat,FLCCVector,FLCCRenderInfo