Three.js中如何获取无任何子级的骨骼尾端的世界位置
你给出的获取骨骼头部世界位置的代码是正确的,直接读取matrixWorld的12、13、14位元素就是世界空间坐标的x、y、z值:
let worldpos_head_x = skinnedMesh.skeleton.bones[111].matrixWorld.elements[12] let worldpos_head_y = skinnedMesh.skeleton.bones[111].matrixWorld.elements[13] let worldpos_head_z = skinnedMesh.skeleton.bones[111].matrixWorld.elements[14]
针对没有子级的末端骨骼,获取尾端世界位置的方案如下:
核心逻辑
Three.js 中骨骼默认沿自身*+Y轴*方向延伸,末端骨骼没有子骨骼的头部可以直接作为尾端参考,所以需要先确认该骨骼的自身长度,再通过矩阵变换把骨骼本地空间的尾端点转换到世界空间即可。
实现步骤
- 提前记录目标末端骨骼的长度,可在建模导出阶段直接记录对应骨骼的长度数值,也可以在初始化绑定姿势时预先计算缓存
- 构造骨骼本地空间下的尾端坐标向量,乘以骨骼的世界矩阵得到世界空间下的尾端坐标
代码示例
const targetBone = skinnedMesh.skeleton.bones[111] // 替换为当前骨骼的实际长度 const boneLength = 0.25 // 骨骼默认沿+Y轴延伸,本地空间内尾端坐标为(0, 骨骼长度, 0) const localTail = new THREE.Vector3(0, boneLength, 0) // 应用世界矩阵转换到世界空间 const worldTail = localTail.applyMatrix4(targetBone.matrixWorld) // 尾端世界坐标取值 const worldpos_tail_x = worldTail.x const worldpos_tail_y = worldTail.y const worldpos_tail_z = worldTail.z
特殊情况处理
如果你的项目自定义了骨骼的延伸轴向(比如沿+Z轴延伸),只需要修改本地尾端向量的对应轴向即可,例如轴向为+Z时将本地向量改为new THREE.Vector3(0, 0, boneLength)。
内容的提问来源于stack exchange,提问作者user2977702
相关产品推荐
相关产品推荐

