Three.js обратный вызов, когда сетка полностью визуализируется

#three.js

#three.js

Вопрос:

У меня большая сетка. Для полного отображения на экране требуется 3-4 секунды. Есть ли three.js функция обратного вызова, которая может быть вызвана при рендеринге сетки?

 const fbxLoader = new FBXLoader();
const model = await fbxLoader.load('xxx.fbx');
scene.add(model);
//
model.onRenderedCallback = () => { // do something } // callback like this ?
  

Ответ №1:

FBXLoader имеет встроенный обратный вызов при загрузке ресурса. Посмотрите на исходный код этой демонстрации

 loader.load(
    'models/fbx/Samba Dancing.fbx',
    function ( object ) {
        // This is your callback, add actions here
        scene.add( object );
    }
);
  

Однако разбор и загрузка данных FBX и текстурных ресурсов на ваш графический процессор также могут занять некоторое время, и, к сожалению, нет обратного вызова, когда эти данные будут загружены в графический процессор. Есть несколько способов уменьшить эту задержку, вы можете предварительно скомпилировать материалы и текстуры, а не ждать до первого кадра:

  • WebGLRenderer.compile() Компилирует все материалы в сцене с помощью камеры. Это полезно для предварительной компиляции шейдеров перед первым рендерингом.
  • WebGLRenderer.initTexture() Инициализирует заданную текстуру. Полезно для предварительной загрузки текстуры, а не для ожидания первого рендеринга

Комментарии:

1. Я нахожусь в аналогичной ситуации. Я думаю, что единственный реальный способ справиться с этим — проверить время рендеринга кадра и эвристически определить, когда граница свободна. Таким образом, мы можем делать такие вещи, как очистка загрузочных блесен. Было бы хорошо иметь что-то подобное, но, похоже, WebGL не дает нам никаких полезных API для этого.