#json #animation #three.js #loading
#json #Анимация #three.js #Загрузка
Вопрос:
ob = JSON.stringify( that.char_elements[0].anim_manager.anim_list[0].obj.toJSON(), null, 3 );
require("fs").writeFile( "./src/data/obj.pr", ob , 'utf8', function(err) {
console.log(err);
});
Вот как я пишу .файл json, который будет загружен позже. И, похоже, у него не возникает никаких проблем с импортом, поскольку результирующий файл имеет этот формат:
{
"metadata": {
"version": 4.5,
"type": "Object",
"generator": "Object3D.toJSON"
},
"geometries": [
{
"uuid": "447BF091-8882-4377-97C0-6E5102476B59",
"type": "BufferGeometry",
"name": "pCylinder2.000",
"data": {...
Но когда я пытаюсь загрузить его позже, используя ТРИ.ObjectLoader, я получаю эту странную ошибку из заголовка этого фрагмента кода, когда пытаюсь загрузить его таким образом:
var f2 = require('fs').readFileSync("./src/data/project.pr", 'utf8', function(err) {
console.log(err);
});
char.anim_manager.loader_helper.js_loader.load( f2, char.anim_manager.loader_helper.true_load);
// gives this error: Three.js Uncaught TypeError: Cannot read property '0' of
// undefined when loading 3D object...at XMLHttpRequest.<anonymous> (three.js:34342)
Функция загрузки:
function load_init( anim ) {
viewer.mixer = new THREE.AnimationMixer( anim );
if(viewer.cur_anim)
viewer.scene.remove(viewer.cur_anim);
cur_anim.anim = anim;
viewer.cur_anim = cur_anim.anim;
var that = this;
anim.name = "animation_name";
var mat_dict = {};
anim.traverse( function ( child ) {
if ( child.isMesh ) {
//anim.mat_manager.mat_list
const oldMat = child.material;
if(oldMat.length == undefined)//only one material in the mesh
{
if(!mat_dict[oldMat.name])
{
child.material = new THREE.MeshToonMaterial( {
color: oldMat.color,
skinning: true,
name: oldMat.name,
side: THREE.DoubleSide,
shininess: 0,
specular: 0,
reflectivity: 0,
} );
mat_dict[oldMat.name] = child.material;
cur_anim.mat_manager.mat_list.push(child.material);
}
else
child.material = mat_dict[oldMat.name];
}
else//multiple materials
{
for(var i = 0; i < oldMat.length; i )
{
if(!mat_dict[oldMat[i].name])
{
child.material[i] = new THREE.MeshToonMaterial( {
color: oldMat[i].color,
skinning: true,
name: oldMat[i].name,
side: THREE.DoubleSide,
shininess: 0,
specular: 0,
reflectivity: 0,
} );
mat_dict[oldMat[i].name] = child.material[i];
cur_anim.mat_manager.mat_list.push(child.material[i]);
}
else
child.material[i] = mat_dict[oldMat[i].name];
}
}
}
} );
var action = viewer.mixer.clipAction( anim.animations[ 0 ] );
action.play();
viewer.scene.add( cur_anim.anim );
}
Но я использую привязку, чтобы избежать использования этой ошибки. Это называется true_load
var true_load = load_init.bind(this);
Комментарии:
1. Не могли бы вы, пожалуйста, предоставить общий доступ ко всему вашему файлу JSON?
2. Извините за задержку. Вот файл: mediafire.com/file/h1mhyv9sydida65/obj.pr/file
3.Я смог загрузить вашу модель JSON в
three.js
редактор. Результат выглядит следующим образом: imgur.com/a/BUqbano . Похоже,THREE.ObjectLoader
он может загрузить ваш файл. Вероятно, вы делаете что-то не так в своем приложении. Не могли бы вы продемонстрировать на живом примере, как вы загружаете файл?4. Я не могу сказать вам точно , как я это делаю, потому что я забыл нажать на git (все функции загрузки соответствуют моей версии), и я нахожусь на своем рабочем месте, поэтому нет доступа к этому компьютеру. Но в принципе, у меня есть вспомогательный загрузчик ‘class’ для управления загрузкой за меня. Когда я нажимаю кнопку, json будет сохранен точно так же, как вы видели это в OP. Как только я нажму на кнопку загрузить, он прочитает файл, как вы видите в OP. В диспетчере анимации (куда я помещаю всех персонажей и анимации) я вызову загрузку оттуда (будь то FBX или что-то еще), как вы это видите там. Но истинная загрузка выглядит следующим образом:
5. Извините за отсутствие js.fiddle, но я действительно не знаю, как его использовать, и прямо сейчас я не могу остановиться, чтобы взглянуть на него. Функция, которую я использую, находится в OP