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

Actor SOG / SPZ / PLY: загрузка одиночных файлов 3DGS

Три Actor — ASogActor, ASpzActor и APlyActor — соответствуют форматам .sog, .spz и .ply и служат для загрузки одиночного файла 3DGS без структуры каталогов LCC. Все они наследуют ALCCActorBase.

МодульLCC4UnrealRuntime
Заголовочные файлыSogActor.h, SpzActor.h, PlyActor.h
Родительский классALCCActorBase
Внутренний ComponentULCC2Component
#include "SogActor.h"
#include "SpzActor.h"
#include "PlyActor.h"

Все три внутри повторно используют полный конвейер рендеринга LCC2, конструируя виртуальную FLCC2MetaInfo. То есть возможности LCC2 так же доступны для этих трёх форматов, включая управление полосами сферических гармоник, режимы нормалей для освещения, обрезку и секущие плоскости, коррекцию цвета. По той же причине наследуются и ограничения конвейера LCC2, например неработающие интерфейсы для нескольких вьюпортов.

Поддерживаемые форматы

ActorРасширениеОбласть применения
ASogActor.sogСжатый формат, малый объём, быстрая загрузка
ASpzActor.spzСжатый формат
APlyActor.plyУниверсальный формат обмена облаками точек и 3DGS, штатный вывод большинства инструментов обучения

Объём поддержки каждого формата см. в Введении — поддерживаемые форматы.

Сравнение с форматами каталогов LCC

.sog / .spz / .plyКаталог LCC / LCC2
Организация файловОдин файлФайл метаинформации + несколько блоков данных
Уровни LODНетЕсть, потоковая загрузка по расстоянию
Подходящий масштабНебольшие и средние сценыБольшие сцены
Данные коллизийНетМогут быть
Удобство распространенияВысокое, один файлТребуется сохранять целостность каталога

Основание для выбора: эти три формата подходят, когда объём данных невелик, нужно быстро проверить результат или требуется распространение одним файлом. Для больших сцен, где производительность держится на LOD, обязательны форматы каталогов LCC / LCC2.

Методы

Все публичные интерфейсы этих трёх Actor унаследованы от ALCCActorBase; переопределены только перечисленные ниже методы.

SelectFile

// ASogActor
virtual void SelectFile() override;   // the dialog lists only .sog

// ASpzActor
virtual void SelectFile() override;   // the dialog lists only .spz

// APlyActor
virtual void SelectFile() override;   // the dialog lists only .ply

Открывает диалог выбора файла, каждый со своим фильтром расширения. В панели Details отображается как кнопка Load.

Доступно только в редакторе; в упакованной сборке используй Load.

Load (переопределён только в APlyActor)

// APlyActor
virtual void Load(const FString& String) const override;

Загружает файл .ply. Путь с расширением, отличным от .ply, отклоняется сразу, попытка разбора не выполняется.

ASogActor и ASpzActor не переопределяют Load и используют реализацию базового класса.

Примеры

Загрузка одиночного файла .sog

#include "SogActor.h"
#include "LCC2Component.h"

void AMyLoader::LoadSogFile()
{
    ASogActor* SogActor = GetWorld()->SpawnActor<ASogActor>(
        ASogActor::StaticClass(), FVector::ZeroVector, FRotator::ZeroRotator);
    if (!SogActor)
    {
        return;
    }

    SogActor->Load(TEXT("D:/Data/scene.sog"));

    // Internally it is a ULCC2Component, so all LCC2 capabilities are available
    ULCC2Component* Comp = Cast<ULCC2Component>(SogActor->GetLCCComponent());
    if (Comp)
    {
        Comp->SetSHBands(2);
        Comp->SetSplatScale(0.9f);
    }
}

Автоматический выбор Actor по расширению

У каждого формата свой Actor, поэтому в реальных проектах обычно требуется распределение по расширению.

Не полагайся для этого на DetermineFileFormat: эта функция распознаёт только .lcc, .splats, .las и .ply, а для .lcc2, .sog и .spz неизменно возвращает None. Прямая проверка расширения надёжнее:

#include "Tools/LCCUtilLibrary.h"
#include "LCCActor.h"
#include "LCC2Actor.h"
#include "SogActor.h"
#include "SpzActor.h"
#include "PlyActor.h"

ALCCActorBase* AMyLoader::LoadAnyFormat(const FString& Path)
{
    if (!ULCCUtilLibrary::CheckPathValid(Path))
    {
        UE_LOG(LogTemp, Error, TEXT("Path does not exist: %s"), *Path);
        return nullptr;
    }

    const FString Ext = FPaths::GetExtension(Path).ToLower();

    UClass* ActorClass = nullptr;
    if (Ext == TEXT("lcc"))       ActorClass = ALCCActor::StaticClass();
    else if (Ext == TEXT("lcc2")) ActorClass = ALCC2Actor::StaticClass();
    else if (Ext == TEXT("sog"))  ActorClass = ASogActor::StaticClass();
    else if (Ext == TEXT("spz"))  ActorClass = ASpzActor::StaticClass();
    else if (Ext == TEXT("ply"))  ActorClass = APlyActor::StaticClass();

    if (!ActorClass)
    {
        UE_LOG(LogTemp, Error, TEXT("Unsupported format: %s"), *Path);
        return nullptr;
    }

    ALCCActorBase* Actor = GetWorld()->SpawnActor<ALCCActorBase>(
        ActorClass, FVector::ZeroVector, FRotator::ZeroRotator);
    if (Actor)
    {
        Actor->Load(Path);
    }
    return Actor;
}

В Blueprint нет узла, напрямую получающего расширение, поэтому можно использовать проверку строки:

[Custom Event: LoadAnyFormat]
        Path (String)
        │
        ▼
[Check Path Valid]
        Path = Path
        │ Return Value ──┐
        ▼                │
[Branch] ◀───────────────┘
        │ True
        ▼
[Ends With]
        Source String = Path
        In Suffix = ".sog"
        Search Case = Ignore Case
        │ Return Value ──┐
        ▼                │
[Branch] ◀───────────────┘
        │ True
        ▼
[Spawn Actor from Class]
        Class = SogActor
        │ Return Value ──┐
        ▼                │
[Load] ◀─────────────────┘
        Target = (Return Value)
        String = Path

(the False branch keeps checking ".spz", ".ply", ".lcc2", ".lcc" with Ends With)

Замечания

  • У этих трёх форматов нет уровней LOD. При загрузке строится дерево из одного уровня с одним узлом (общее число уровней 1, у корневого узла нет дочерних), поэтому параметры LOD StartLevel, EndLevel и LevelFactor хотя и читаются, но выбирать уровни не из чего, и фактически они не действуют. Производительностью управляют главным образом через MaxSplatNum и SplatScale.
  • Эти три формата не содержат данных коллизий, альтернативы см. в Коллизиях — альтернативы для одиночных форматов.
  • Файлы большого объёма загружаются целиком за один раз, расход видеопамяти постоянен и не меняется вместе с ракурсом. Предел загрузки и способ его расчёта см. в Рендеринге — ограничения загрузки одиночных форматов.
  • В панели Details всех трёх отображается bSyncLoadAtRuntime (по умолчанию включено), которое определяет, выполняется ли в упакованной сборке синхронная загрузка на этапе BeginPlay, см. ULCC2Component.
  • Используется конвейер рендеринга LCC2, поэтому интерфейсы для нескольких вьюпортов из базового класса не применимы.
  • Все три при конструировании задают компоненту bUseMipFilter значение false (в базовом классе по умолчанию true) и устанавливают поворот Actor в (0, 0, 90).
  • У .ply есть несколько подформатов; плагин поддерживает вариант с атрибутами 3DGS. Загрузка обычного геометрического меша .ply завершится ошибкой.

Смотрите также

  • ALCCActorBase: все унаследованные интерфейсы
  • ULCC2Component: компонент, который используют эти три Actor внутри
  • ULCCUtilLibrary: определение формата и проверка пути
Назад
ULCC2Component
Далее
ALCC2ProxyMesh