You need to enable JavaScript to run this app. Three.js中如何获取无任何子级的骨骼尾端的世界位置
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 18:48:01