Отрисовка с помощью Three.js, загрузка моделей GLTF и текстур PNG | Rendering with Three.js, loading of GLTF models and PNG textures
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

101 Zeilen
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. };