Как использовать предварительно загруженные изображения в качестве текстур в THREE.js

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

** Вот JS **

function MAIN_PRELOAD() {

 var Preload_List = [];
 var Preload_Loaded = 0;
 var Preload_Errors = 0;

 function preload_scene() {

  // Skip Empty List...
  if(SceneAssets.length < 1) return;
  for(var i in SceneAssets) {

   // Skip Blanks...
   if(SceneAssets[i]['material']['map'].length < 1) continue;

   // Skip Repeats...
   if(Preload_List.indexOf(SceneAssets[i]['material']['map']) >= 0) continue;

   // Add to list...
   console.log('Image added to preloader: '+SceneAssets[i]['material']['map']);
   Preload_List[Preload_List.length] = SceneAssets[i]['material']['map'];

  }
 }

 function preload_masks() {

  // Skip Empty List...
  if(MaskLayer['textures'].length < 1) return;
  for(var i in MaskLayer['textures']) {

   // Skip Blanks...
   if(MaskLayer['textures'][i].length < 1) continue;

   // Skip Repeats...
   if(Preload_List.indexOf(MaskLayer['textures'][i]) >= 0) continue;

   // Add to list...
   console.log('Image added to preloader: '+MaskLayer['textures'][i]);
   Preload_List[Preload_List.length] = MaskLayer['textures'][i];

  }
 }

 function preload_finished() {

  console.log('Preloading has finished!');
  // NYI: Hide the loading overlay...
  init();
  animate();

 }

 function preload_init() {

  // Preload Assets...
  preload_scene();
  preload_masks();

  // Finish if empty...
  if(Preload_List.length < 1) {
   preload_finished();
   return;
  }

  // Iterate if filled...
  for(var i in Preload_List) {

   // Enclosure for event trapping...
   (function(i) {

    var imageElement = document.createElement('img');

    imageElement.onload = function() {
     console.log('Image "'+Preload_List[i]+'" done loading!');
     Preload_Loaded ++;
     if(Preload_Loaded + Preload_Errors == Preload_List.length) {
      preload_finished();
     }
    };

    imageElement.onerror = function() {
     console.log('Image "'+Preload_List[i]+'" failed to load...');
     Preload_Errors ++;
     if(Preload_Loaded + Preload_Errors == Preload_List.length) {
      preload_finished();
     }
    };

    imageElement.src = Preload_List[i];

   })(i);

  }

 }
 preload_init();

}

MAIN_PRELOAD();

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

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

В презентации также есть периодические заикания, когда она загружает маскирующие слои по мере необходимости, и каждый раз, когда это происходит, она делает это из нового HTTP-запроса, а не из кеша браузера через THREE.ImageUtils.loadTexture(),

Мое лучшее предположение, что я должен как-то использовать незаписанный img элемент, созданный в предварительном загрузчике в качестве замены THREE.ImageUtils.loadTexture()Я просто не могу найти никого, кто бы делал то же самое, и я думаю, что это был бы отличный способ кешировать ресурсы сцены для THREE.js, если бы я мог заставить его работать.

Альтернативные методы решения этой проблемы также будут рассмотрены.

Использование THREE.js R70

1 ответ

var texture;
var imageElement = document.createElement('img');
imageElement.onload = function(e) {
    texture = new THREE.Texture( this );
    texture.needsUpdate = true;
    init();
};
imageElement.src = "myimage.png";

init() {
    material = new THREE.MeshPhongMaterial( { map : texture } );
}

Вот скрипка для демонстрации.
ПРИМЕЧАНИЕ: в скрипте я использую imageUrl изображения, это просто, чтобы я мог использовать изображение в качестве текстуры, не получая ошибку CORS. На сайте вы должны иметь возможность просто установить для изображения src путь к файлу, как обычно.

Другие вопросы по тегам