THREE.js FBXLoader обрабатывает .png как .psd и не загружает материал

При использовании THREE.js FBXLoader для загрузки файла .fbx модель загружается частично, а части модели с альфа-текстурой не загружаются.

Я получаю сообщение об ошибке:

FBXLoader: PSD textures are not supported, creating empty placeholder texture for pinebranchColor.psd

Несмотря на то, что в папке с материалами нет файлов .psd. Как вы можете видеть на скриншоте ниже, кажется, что в материале alphaMap имя текстуры pinebranchColor.psd.

THREE.js FBXLoader обрабатывает .png как .psd и не загружает материал

Вот как отображается модель FBX:

THREE.js FBXLoader обрабатывает .png как .psd и не загружает материал

И это то, что он отображает, как если бы я загружал версию GLTF (примечание: прозрачные части для листьев не подхватываются как прозрачные) - что ближе к тому, как это должно выглядеть, но не полностью.

THREE.js FBXLoader обрабатывает .png как .psd и не загружает материал

Вот как модель должна выглядеть согласно скетчфаб:

THREE.js FBXLoader обрабатывает .png как .psd и не загружает материал

Как вы думаете, почему там написано, что альфа-материал — это .psd? Может быть, это указано в самом файле .fbx? Первоначальная проблема заключалась в как мне получить альфу/прозрачность для правильного рендеринга листьев, а не в цвете блока. Может быть, я мог бы установить свойство в материале THREE.js версии GLTF, и это сработало бы?

Это первая модель, которую я когда-либо импортировал в THREE.js, так как я только начал учиться, поэтому, пожалуйста, объясните, как можете.

Обновлено: В инструментах разработчика я нашел материал для листьев и установил прозрачность true. Это сработало! По мере. Но есть еще некоторые проблемы с рендерингом. Так что я думаю, что это путь вниз.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
523
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, почему не удалось загрузить альфа-материал FBX, но я решил проблему прозрачности с версией GLTF, используя функцию THREE.js scene.traverse и установив для свойства materialtransparent значение true для всех листовых материалов в сцене. .

Это решило основную проблему, но остались некоторые артефакты, как видно на этом изображении, где листья затемнены:

transparent with artifact

Решение заключалось в том, чтобы также установить alphaTest на 0.5 для материала, что дало следующий результат:

transparent without artifacts

Вот код:

gltf.scene.traverse(child => {
  if (child.isMesh && child.name.includes('leaf')) {
    child.material.alphaTest = 0.5;
    child.material.transparent = true;
  }
});

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