转换JSON后Object3D骨骼位置异常,导入threejs-editor如何修复?
问题:Three.js导出带骨骼模型JSON后导入编辑器显示异常(骨骼集中在零点)
我想导出仅含一个人形3D对象的场景为JSON格式,导入threejs-editor后模型显示异常,所有骨骼都集中在零点位置。请问操作中的问题出在哪里,该如何修复?
以下是我导出.json格式模型的代码:
function saveString( text, filename ) { save(new Blob([text], {type: "text/plain",}), "scene.json"); } function createJSONFunction() { let output = scene.toJSON(); output = JSON.stringify( output ); metadata = `"metadata":{"type":"App"},"project":{"shadows":true,"shadowType":1,"vr":false,"physicallyCorrectLights":false,"toneMapping":0,"toneMappingExposure":1},"camera":{"metadata":{"version":4.5,"type":"Object","generator":"Object3D.toJSON"},"object":{"uuid":"${camera.uuid}","type":"PerspectiveCamera","name":"Camera","layers":1,"matrix":[0.8551272907805305,1.3877787807814457e-17,0.5184180905045175,0,0.13009003113625428,0.9680035450955323,-0.2145826658457063,0,-0.5018305494500295,0.25093651922843285,0.8277662489834916,0,-5.6106361087816765,2.805555575159794,9.254708011035515,1],"fov":50,"zoom":1,"near":0.01,"far":1000,"focus":10,"aspect":1.9214145383104126,"filmGauge":35,"filmOffset":0}}`; result = `{${metadata},"scene":${output}`; saveString(result); }
threejs-editor中的显示效果:
问题分析与修复方案
1. 核心问题:手动拼接JSON破坏了数据结构
你当前的代码存在两个致命问题:
- 手动拼接的JSON缺少闭合的
},语法完全不合法,编辑器无法正确解析完整的模型数据 - 直接将自定义的
metadata、camera字段与scene.toJSON()的结果强行拼接,干扰了Three.js编辑器对骨骼层级、变换数据的读取逻辑,导致骨骼位置信息丢失,全部集中到零点
2. 正确的导出方式
Three.js内置的toJSON()方法已经可以生成编辑器兼容的格式,不需要手动拼接额外内容。如果只需要导出那个人形模型,直接对该模型对象调用toJSON()即可:
修复后的代码示例:
function saveString(text, filename) { save(new Blob([text], { type: "text/plain" }), filename || "model.json"); } function createJSONFunction() { // 替换成你场景中实际的人形模型对象(比如通过名称获取) const humanoidModel = scene.getObjectByName("Humanoid"); if (!humanoidModel) { console.error("未找到目标人形模型"); return; } // 直接对模型调用toJSON,生成编辑器可识别的完整数据 const modelJSON = humanoidModel.toJSON(); // 格式化JSON方便查看和校验 const jsonString = JSON.stringify(modelJSON, null, 2); saveString(jsonString, "humanoid-model.json"); }
3. 额外注意事项
- 确保导出前,人形模型的
SkinnedMesh与Skeleton已经正确绑定,骨骼层级关系正常 - 如果需要保留场景、相机信息,直接调用
scene.toJSON()即可,编辑器会自动识别其中的所有合法数据 - 导出后可以用在线JSON校验工具检查文件格式是否合法,避免语法错误
内容的提问来源于stack exchange,提问作者shikitos
相关产品推荐
相关产品推荐

