Javascript Three.js从3ds max导入具有骨架的角色 我以SEA3D格式从3ds max导出了一个装配好的角色 已加载到Three.js中 骨骼旋转具有初始值。当我将这些XYZ值设置为0,0,0时,我的模型看起来完全一团糟

Javascript Three.js从3ds max导入具有骨架的角色 我以SEA3D格式从3ds max导出了一个装配好的角色 已加载到Three.js中 骨骼旋转具有初始值。当我将这些XYZ值设置为0,0,0时,我的模型看起来完全一团糟,javascript,model,three.js,motion,3dsmax,Javascript,Model,Three.js,Motion,3dsmax,混合器中的模型骨骼的初始值均为0、0、0 我已经尝试过先将模型导出为FBX格式,在blender中导入,然后导出为JSON格式。成功了!不幸的是,这造成了其他问题和太多的步骤。另外,Sea3d格式比JSON小得多,我在整个项目中成功地使用了这种格式 此外,我还尝试使用SEA3D Studio将每个骨骼的“反向绑定矩阵”旋转设置为0、0、0,这有助于初始位置,但对轴顺序没有帮助 如果我对矩阵的了解超过0,我会制作一个脚本,在加载时重置每个模型,但这是我需要的帮助或从3ds max导出的帮助,因此

混合器中的模型骨骼的初始值均为0、0、0

我已经尝试过先将模型导出为FBX格式,在blender中导入,然后导出为JSON格式。成功了!不幸的是,这造成了其他问题和太多的步骤。另外,Sea3d格式比JSON小得多,我在整个项目中成功地使用了这种格式

此外,我还尝试使用SEA3D Studio将每个骨骼的“反向绑定矩阵”旋转设置为0、0、0,这有助于初始位置,但对轴顺序没有帮助


如果我对矩阵的了解超过0,我会制作一个脚本,在加载时重置每个模型,但这是我需要的帮助或从3ds max导出的帮助,因此初始旋转值为0,轴的顺序正确经过无数的尝试和错误实验后,中断了初始旋转值的设置bones我发现在SEA3D loader中编辑这段代码就可以了

THREE.SEA3D.prototype.flipMatrix = function(mtx) {
    var mtx_data = THREE.SEA3D.BUFFER0.copy( mtx );

    mtx.setPosition( THREE.SEA3D.VECZERO ); 
    mtx.multiplyMatrices( THREE.SEA3D.BUFFER1.makeRotationAxis( THREE.SEA3D.VECBUF0.set(0, 0, 1), THREE.Math.degToRad( 180 ) ), mtx );      
    mtx.makeRotationFromQuaternion( THREE.SEA3D.QUABUF0.setFromRotationMatrix( mtx ) ); 

    var pos = THREE.SEA3D.VECBUF0.setFromMatrixPosition( mtx_data );
    pos.z = -pos.z;
    mtx.setPosition(pos);

    return mtx;
}
正是这一行:

mtx.makeRotationFromQuaternion( THREE.SEA3D.QUABUF0.setFromRotationMatrix( mtx ) ); 
应改为:

mtx.makeRotationFromQuaternion( new THREE.Quaternion(0, 0, 0, 1) ); 

这不是一个解决方案,而是一个变通方法,因此如果您有一个真正的解决方案(如何正确地从3ds max导出它或在加载后处理它),请毫不犹豫地发布它

在无数次尝试和错误实验中断设置骨骼的初始旋转值后,我发现在SEA3D loader中编辑这段代码就可以了

THREE.SEA3D.prototype.flipMatrix = function(mtx) {
    var mtx_data = THREE.SEA3D.BUFFER0.copy( mtx );

    mtx.setPosition( THREE.SEA3D.VECZERO ); 
    mtx.multiplyMatrices( THREE.SEA3D.BUFFER1.makeRotationAxis( THREE.SEA3D.VECBUF0.set(0, 0, 1), THREE.Math.degToRad( 180 ) ), mtx );      
    mtx.makeRotationFromQuaternion( THREE.SEA3D.QUABUF0.setFromRotationMatrix( mtx ) ); 

    var pos = THREE.SEA3D.VECBUF0.setFromMatrixPosition( mtx_data );
    pos.z = -pos.z;
    mtx.setPosition(pos);

    return mtx;
}
正是这一行:

mtx.makeRotationFromQuaternion( THREE.SEA3D.QUABUF0.setFromRotationMatrix( mtx ) ); 
应改为:

mtx.makeRotationFromQuaternion( new THREE.Quaternion(0, 0, 0, 1) ); 

这不是一个解决方案,而是一个变通方法,因此如果您有一个真正的解决方案(如何正确地从3ds max导出它或在加载后处理它),请毫不犹豫地发布它

在three.js中评论这一行之后,我有了很大的进步!骨四元数集(q[0],q[1],q[2],q[3]);在three.js中评论这一行之后,我有了很大的进步!骨四元数集(q[0],q[1],q[2],q[3]);在three.js中评论这一行之后,我有了很大的进步!骨四元数集(q[0],q[1],q[2],q[3]);