Отрисовка с помощью Three.js, загрузка моделей GLTF и текстур PNG | Rendering with Three.js, loading of GLTF models and PNG textures
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.5KB

  1. // // // //
  2. форматИзображенияДляБазы64 = (файл) =>
  3. {
  4. var форматы = {
  5. ".png": "png",
  6. ".jpg": "jpeg",
  7. ".jpeg": "jpeg",
  8. ".gif": "gif",
  9. };
  10. for (var окончание in форматы)
  11. {
  12. if (файл.toLowerCase().endsWith(окончание))
  13. {
  14. return форматы[окончание];
  15. }
  16. }
  17. return null;
  18. };
  19. // // // //
  20. загрузитьТекстуру = (мир, указатель, файл, откликУспех, откликПровал = null) =>
  21. {
  22. var модуль = мир.модули.модульПоУказателю(указатель);
  23. var содержимое = модуль.содержимое[файл];
  24. var представление = мир.база64ИзДвоичногоМассива(new Uint8Array(содержимое));
  25. var формат = форматИзображенияДляБазы64(файл);
  26. var адрес = `data:image/${формат};base64,${представление}`;
  27. мир.текстурщик.load(
  28. адрес,
  29. function(текстура) {
  30. текстура.flipY = false;
  31. откликУспех(текстура);
  32. },
  33. null,
  34. function(error) {
  35. var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Не удалось загрузить текстуру ⚬ 无法加载纹理 ⚬ Could not load texture";
  36. console.error(ошибка, указатель, файл);
  37. if (откликПровал)
  38. {
  39. откликПровал();
  40. }
  41. }
  42. );
  43. };
  44. // // // //
  45. загрузитьПолигональнуюСетку = (мир, указатель, файл, откликУспех, откликПровал = null) =>
  46. {
  47. var м = мир.модули.модульПоУказателю(указатель);
  48. var адрес = `${window.location.origin}${файл}`;
  49. THREE.Cache.enabled = true;
  50. THREE.Cache.add(адрес, м.содержимое[файл]);
  51. мир.модельер.load(
  52. адрес,
  53. function(gltf) {
  54. THREE.Cache.remove(адрес);
  55. // Вычленяем полигональную сетку.
  56. // Take polygon mesh.
  57. var успех = false;
  58. gltf.scene.traverse(function(ребёнок) {
  59. if (!успех && ребёнок.isMesh)
  60. {
  61. откликУспех(ребёнок);
  62. успех = true;
  63. }
  64. });
  65. if (успех)
  66. {
  67. return;
  68. }
  69. var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Отсутствует полигональная сетка ⚬ 不存在多边形网格 ⚬ Polygon mesh is absent";
  70. console.error(ошибка, указатель, файл);
  71. if (откликПровал)
  72. {
  73. откликПровал();
  74. }
  75. },
  76. null,
  77. function(error) {
  78. var ошибка = "ОШИБКА ⚬ 错误 ⚬ ERROR: Не удалось загрузить полигональную сетку ⚬ 无法加载多边形网格 ⚬ Could not load polygon mesh";
  79. console.error(ошибка, указатель, файл);
  80. if (откликПровал)
  81. {
  82. откликПровал();
  83. }
  84. }
  85. );
  86. };