应用bone
的正确方法是什么?矩阵到顶点,以便实际几何图形在不使用 GPU 的情况下表示变换后的形状?
我有一个角色模型,我正在应用 skeleton
为此,我想以不同的姿势进行 3D 打印,所以我想使用 STLExporter
导出 3D 可打印文件,但它仅导出原始几何体。
如果可以scene.traverse()
在每个SkinnedMesh
和 geometry.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 ) );
+
+ }
+
+ }
因此,要烘焙变形,您必须执行以下步骤:
- 遍历所有顶点
- 得到它们对应的
skinIndices
和skinWeights
- 获取每个顶点的关联骨骼及其权重
- 遍历所有骨骼
- 获取骨骼的变换矩阵并将其转换为
Geometry
的坐标系
- 通过关联的
skinWeights[boneIdx]
对矩阵进行加权
- 应用最终矩阵
编辑:修复问题的导出器版本。 ( https://github.com/mrdoob/three.js/blob/1be00d5ad075b2305b86c6385403d0e56b4621dd/examples/js/exporters/STLExporter.js )
关于Three.js - 将骨骼转换为几何体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51015987/