问题描述
我正在尝试使用https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/OBJExporter.js
从Three.js场景中导出模型某些网格是基础网格,而另一些是SkinnedMesh,所以我从中编辑了第250行
if ( child instanceof Mesh ) {
到
if ( child instanceof Mesh || child instanceof SkinnedMesh ) {
,我可以看到导出文件中的所有网格,但是SkinnedMeshes的原点位置和方向错误。 如何编辑导出器以正确获得SkinnedMeshes,为什么会发生这种情况?
编辑: 我尝试使用答案中建议的STL导出器,但是它仍然无法导出姿势,因为它检查了以下三个属性:
if(typeof object.obj.geometry.attributes.skinIndex !== 'undefined' && typeof object.obj.geometry.attributes.skinWeight !== 'undefined' && typeof object.obj.skeleton !== 'undefined')
除“ object.obj.skeleton”外,均未定义。 我在SkinnedMesh对象中看到的属性是“ instanceIndex”,“ normal”,“ position”和“ uv”
编辑2:
很抱歉造成混乱,但是我误读了输出日志。有些网格具有上述属性,这意味着实际名称为“ skinWeight0”和“ skinIndex0”。 我试图将名称更改为代码中的名称,并且可以成功打印这些数组,但是导出的模型完全混乱:
解决方法
之所以会这样,是因为蒙皮网格的转换不仅取决于Object3D.position
,Object3D.rotation
和Object3D.scale
及其在对象层次结构中的位置。它也取决于其骨架。
到目前为止,您所做的更改不足以保留框架信息。如果要确保导出实际上反映了蒙皮网格物体的变换和形状,则需要类似此PR的代码:
https://github.com/mrdoob/three.js/pull/16942
因此,其想法是在计算顶点的最终位置(将在OBJ文件中定义)时实际上考虑骨骼变换。