Как использовать предварительно загруженные изображения в качестве текстур в 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


person MLK.DEV    schedule 24.02.2015    source источник
comment
что вы отправляете THREE.ImageUtils.loadTexture() ?   -  person 2pha    schedule 25.02.2015
comment
В настоящее время он использует относительный путь к изображению, поэтому логично, что он загружает изображение из нового HTTP-запроса. Вместо этого я хотел бы использовать кешированную версию изображения.   -  person MLK.DEV    schedule 25.02.2015
comment
Почему бы вам не создать текстуру, когда ее загружает прелоадер?   -  person 2pha    schedule 25.02.2015
comment
Это мой вопрос. Предварительный загрузчик использует элемент img для загрузки изображения, мой вопрос заключается в том, как использовать этот элемент предварительного загрузчика img в качестве источника текстуры БЕЗ вызова другого HTTP-запроса (в противном случае предварительная загрузка бесполезна).   -  person MLK.DEV    schedule 25.02.2015
comment
ответ добавлен с примером.   -  person 2pha    schedule 26.02.2015


Ответы (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 } );
}

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

person 2pha    schedule 26.02.2015