SceneLoader.Append и AppendAsync

Библиотека Babylon.js предоставляет мощные возможности для создания 3D-графики в браузере. Одной из полезных функций является загрузка сцены, включая геометрию, материалы, освещение и другие элементы, из внешних файлов. Метод SceneLoader.Append и его асинхронный аналог SceneLoader.AppendAsync обеспечивают удобный способ интеграции внешних сцен в текущую рабочую среду.

Загрузка сцены с помощью SceneLoader.Append

Метод SceneLoader.Append используется для синхронной загрузки 3D-сцен из внешнего источника. Он позволяет загружать файлы, такие как .babylon, .glb или .gltf, в существующую сцену, добавляя новые объекты и компоненты.

Синтаксис:
BABYLON.SceneLoader.Append(rootUrl, sceneFileName, scene, onSuccess, onProgress, onError);

Параметры:

  • rootUrl — базовый URL для поиска ресурса, например, путь к папке, где расположены модели.
  • sceneFileName — имя файла сцены, который будет загружен.
  • scene — объект сцены, в который будет добавлена загруженная модель.
  • onSuccess — функция, которая будет вызвана при успешной загрузке. Получает сцену и список загруженных объектов.
  • onProgress — функция, которая вызывается во время загрузки и может использоваться для отображения прогресса загрузки.
  • onError — функция для обработки ошибок, возникающих при загрузке.
Пример использования:
BABYLON.SceneLoader.Append("https://example.com/assets/", "model.babylon", scene, function (newMeshes) {
    console.log("Модели успешно загружены:", newMeshes);
}, function (progress) {
    console.log("Прогресс загрузки:", progress.loaded / progress.total * 100, "%");
}, function (scene, message) {
    console.log("Ошибка при загрузке:", message);
});

В данном примере сцена загружается из папки https://example.com/assets/, а файл сцены называется model.babylon. После успешной загрузки сцена будет добавлена в текущую. В функции onProgress можно отслеживать прогресс загрузки, а в случае ошибки, она будет обработана в onError.

Асинхронная загрузка с SceneLoader.AppendAsync

Метод SceneLoader.AppendAsync является асинхронной версией SceneLoader.Append. Он позволяет выполнять загрузку сцен без блокировки основного потока выполнения, что особенно полезно при работе с большим количеством данных или большими моделями.

Синтаксис:
BABYLON.SceneLoader.AppendAsync(rootUrl, sceneFileName, scene, onProgress);

Параметры:

  • rootUrl — базовый URL для поиска файла сцены.
  • sceneFileName — имя файла сцены.
  • scene — объект сцены.
  • onProgress — функция, которая будет вызываться во время загрузки для отслеживания прогресса.
Пример использования:
async function loadSceneAsync() {
    try {
        await BABYLON.SceneLoader.AppendAsync("https://example.com/assets/", "model.glb", scene, function (progress) {
            console.log("Прогресс загрузки:", progress.loaded / progress.total * 100, "%");
        });
        console.log("Сцена успешно загружена.");
    } catch (error) {
        console.error("Ошибка при загрузке сцены:", error);
    }
}

loadSceneAsync();

Здесь загрузка выполняется асинхронно, и код не блокирует выполнение, пока сцена не будет загружена. В случае успеха выводится сообщение о завершении, а при возникновении ошибки, она будет поймана и выведена в консоль.

Важные особенности и различия

  1. Синхронность и асинхронность:

    • SceneLoader.Append выполняет загрузку синхронно, что означает блокировку основного потока до завершения процесса загрузки. Этот подход может замедлить выполнение программы, если сцена достаточно тяжелая или включает множество объектов.
    • SceneLoader.AppendAsync позволяет загружать сцену в фоновом потоке, не блокируя выполнение остальной части программы, что улучшает пользовательский опыт.
  2. Обработка ошибок:

    • В обоих случаях можно указать функцию для обработки ошибок. Однако асинхронный метод AppendAsync использует стандартные конструкции обработки ошибок в JavaScript (например, try-catch), что дает больше гибкости.
  3. Прогресс загрузки:

    • В обоих методах можно отслеживать прогресс загрузки через коллбек onProgress, который информирует о количестве загруженных данных. Это полезно для отображения индикаторов прогресса или выполнения других задач, связанных с состоянием загрузки.
  4. Совместимость форматов:

    • Методы Append и AppendAsync поддерживают несколько форматов сцен, таких как .babylon, .gltf, .glb. Важно убедиться, что файл сцены имеет правильное расширение и соответствующий формат для успешной загрузки.

Советы по использованию

  • При использовании синхронного метода SceneLoader.Append важно помнить, что он может привести к задержкам в рендеринге, если сцена содержит большое количество объектов. Лучше использовать этот метод в ситуациях, когда нужно загрузить небольшие или простые сцены.
  • Для более сложных и больших сцен предпочтительнее использовать SceneLoader.AppendAsync, чтобы не блокировать основной поток и обеспечить плавную работу приложения.
  • Всегда следует обрабатывать ошибки, так как загрузка внешних файлов может быть прервана по различным причинам (например, отсутствие файла, проблемы с сетью).

Заключение

Методы SceneLoader.Append и SceneLoader.AppendAsync являются мощными инструментами для загрузки внешних 3D-сцен в Babylon.js. Важно правильно выбирать метод в зависимости от требований проекта: синхронный метод подходит для небольших сцен, а асинхронный — для более сложных и крупных.