Three.js - 将骨骼转换为几何体

标签 three.js 3d

应用bone的正确方法是什么?矩阵到顶点,以便实际几何图形在不使用 GPU 的情况下表示变换后的形状?

我有一个角色模型,我正在应用 skeleton为此,我想以不同的姿势进行 3D 打印,所以我想使用 STLExporter导出 3D 可打印文件,但它仅导出原始几何体。

如果可以scene.traverse()在每个SkinnedMeshgeometry.applyMatrix(???)以正确的顺序使用正确的骨骼矩阵,我应该能够导出应用了转换的 STL,对吗?

var objects = [];
var triangles = 0;
scene.traverse( function ( object ) {
    if ( object.isMesh ) {
        var geometry = object.geometry;
        if ( geometry.isBufferGeometry ) {
            geometry = new THREE.Geometry().fromBufferGeometry( geometry );
        }
        // TODO: Apply skeleton transform
        if ( geometry.isGeometry ) {
            triangles += geometry.faces.length;
            objects.push( {
                geometry: geometry,
                matrixWorld: object.matrixWorld
            } );
        }
    }
} );

最佳答案

看看这个拉取请求:https://github.com/mrdoob/three.js/pull/8953/files

特别是这部分:

THREE.SkinnedMesh.prototype.boneTransform = 
...snip...
for ( var i = 0; i < 4; i ++ ) {
+
+           var skinWeight = skinWeights[ properties[ i ] ];
+
+           if ( skinWeight != 0 ) {
+
+               var boneIndex = skinIndices[ properties[ i ] ];
+               tempMatrix.multiplyMatrices( this.skeleton.bones[ boneIndex ].matrixWorld, this.skeleton.boneInverses[ boneIndex ] );
+               result.add( temp.copy( clone ).applyMatrix4( tempMatrix ).multiplyScalar( skinWeight ) );
+
+           }
+
+       }

因此,要烘焙变形,您必须执行以下步骤:

  1. 遍历所有顶点
  2. 得到它们对应的skinIndicesskinWeights
  3. 获取每个顶点的关联骨骼及其权重
  4. 遍历所有骨骼
  5. 获取骨骼的变换矩阵并将其转换为Geometry
  6. 的坐标系
  7. 通过关联的skinWeights[boneIdx]
  8. 对矩阵进行加权
  9. 应用最终矩阵

编辑:修复问题的导出器版本。 ( https://github.com/mrdoob/three.js/blob/1be00d5ad075b2305b86c6385403d0e56b4621dd/examples/js/exporters/STLExporter.js )

关于Three.js - 将骨骼转换为几何体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51015987/

相关文章:

javascript - 如何在Javascript中正确声明和调用3维 map ?

javascript - three.js 看起来很奇怪的影子

javascript - Three.js 场景实用程序分离/附加角色武器

java - 使用四元数旋转模型

javascript - 将 3d 坐标转换为 2d 屏幕坐标(平面网格)

java - 在 Java3d 中旋转查看平台

three.js - 为什么我必须标准化坐标?

javascript - Three.js 上的平滑相机控制开关

javascript - 如何在 Three.js 中与场景中的对象进行交互?

3d - 四元数旋转导致场景拉伸(stretch)