XGRIDSДокументация
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Lixel CyberColor

    • Руководство пользователя LCC Studio

      • Начало работы
      • Версия и обновления
      • Загрузка и установка
      • Обзор интерфейса и навигация
      • Перед реконструкцией
      • Реконструкция модели
      • Реконструкция одиночной модели
      • Объединение карт
      • Воздушно-наземное объединение
      • Воздушная реконструкция
      • Мои модели
      • Другие функции
      • Настройки и учётная запись
      • Конвертер
      • Реконструкция по видео
      • Часто задаваемые вопросы
    • LCC Scene Editor

      • Версия и обновления
      • Учётная запись и вход
      • Обзор продукта и главная страница
      • Интерфейс редактора
      • Режимы навигации по сцене
      • Файл
      • Настройки
      • Операции редактирования
      • Окно
      • Глобальная панель инструментов
      • Ресурсы и свойства
      • Левая панель инструментов
      • Точки обзора
      • Портал
      • Skybox
      • Аннотации
      • Измерение
      • Flythrough
      • Отчёт по сцене
      • 3D Layout
      • Мини-карта
      • Preview Mode (Viewer)
      • Справка
      • Часто задаваемые вопросы
      • Точка появления
    • LCC Model Editor

      • Версия и обновления
      • Руководство пользователя
      • Обзор и интерфейс
      • Операции с файлами
      • Инструменты выбора
      • Редактирование моделей
      • Измерение
      • Цветокоррекция
      • Управление ресурсами
      • Настройки и справка
      • Часто задаваемые вопросы
  • Plugin & SDK

    • Unreal

      • Введение
      • Быстрый старт — Windows
      • Быстрый старт — Linux
      • Быстрый старт — Quest3
      • Редакции и лицензирование
      • Рендеринг
      • Растеризация Tiled (экспериментально)
      • Визуальные настройки
      • Нормали и освещение
      • Редактирование сцены
      • Параметры производительности
      • Руководство по оптимизации производительности
      • Интеграция со сторонними и движковыми плагинами
      • Прокси-меш
      • Анимация загрузки
      • Коллизии
      • Поддержка системы навигации
      • Поддержка однослойной воды
      • Локализация
      • Частые вопросы
      • Устранение неполадок
      • Журналы и диагностика
      • Свяжитесь с нами
      • Рекомендуемые практики

        • Переосвещение 3DGS с помощью меша LixelStudio
      • Справочник API

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • Actor SOG / SPZ / PLY
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • Журнал изменений

        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1

ULCCComponent: компонент конвейера LCC

Component, специфичный для конвейера LCC1, наследует ULCCComponentBase. Помимо возможностей базового класса, дополнительно предоставляет трассировку луча по положениям splat и устранение швов.

МодульLCC4UnrealRuntime
Заголовочный файлLCCComponent.h
Родительский классULCCComponentBase
Кто им владеетALCCActor
#include "LCCComponent.h"

Получение экземпляра:

ULCCComponent* Comp = Cast<ULCCComponent>(LCCActor->GetLCCComponent());

Свойства

СвойствоТипПо умолчаниюОписание
bEnableSeamCuttingboolfalseВключить устранение швов вручную, см. Устранение швов. Для файлов LCC версии 5.0 и выше включать вручную не нужно, оно работает автоматически
LCCPerformanceFLCCRenderInfo—Параметры производительности, специфичные для LCC1, см. таблицу ниже

MetaInfo (тип FLCCMetaInfo) — защищённый член, недоступный извне на стороне C++, и виден только Blueprint (в панели Details только для чтения). В C++ используй GetMetaInfo() базового класса, чтобы получить базовые поля.

LCCPerformance

Здесь тоже используется форма «переключатель плюс значение»: когда переключатель выключен, применяется значение по умолчанию из настроек проекта.

ПолеТипПо умолчаниюПереключательОписание
SortFactorfloat1bCanSetSortFactorКоэффициент масштабирования частоты сортировки, диапазон 0.2~5, см. Sort Factor
bAddExtraPreNodesbooltruebEnableExtraPreNodesДобавлять дополнительные узлы предзагрузки, см. 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 сантиметров)LineTraceSingleLineTraceMulti
Пользовательский радиусLineTraceSingleWithRadiusLineTraceMultiWithRadius

Общие для всех четырёх отладочные параметры:

ПараметрТипОписание
Startconst FVector&Начало луча, мировые координаты
Endconst FVector&Конец луча, мировые координаты
bDrawDebugLineboolРисовать ли отладочную линию
DurationfloatВремя существования отладочной линии, в секундах
ThicknessfloatТолщина отладочной линии

Примечание: на стороне 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 сантиметрам.

ПараметрТипОписание
OutHitFLCCSplat&Выходная информация о попадании, содержит мировое положение 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;

Одиночная трассировка луча с указанием радиуса проверки.

ПараметрТипОписание
RadiusfloatРадиус проверки, в сантиметрах

Замечания по применению:

  • Облако точек дискретно, и при слишком малом радиусе луч легко проходит между точками, так что попадания нет, хотя ты явно указываешь на объект. В таком случае увеличь радиус.
  • Чем больше радиус, тем легче попасть, но тем ниже точность: возвращённая точка может отклоняться от того места, куда ты действительно указывал.
  • Для разреженных данных начинай с 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 сантиметрам.

ПараметрТипОписание
OutHitsTArray<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
Назад
ULCCComponentBase
Далее
ULCC2Component