Three.js中基于MediaPipe 3D姿态关键点的绑定人形模型动作重定向方案问询
Three.js中基于MediaPipe 3D姿态关键点的绑定人形模型动作重定向方案问询
我正在尝试通过从视频中逐帧提取人物的3D姿态关键点(使用MediaPipe / PoseFormat),在Three.js中实现3D化身。目前我有一个.pose文件,提供了从视频中提取的每帧身体、左手和右手的关键点。每个关键点包含(x,y,z)坐标以及置信度c。因为它们原本是像素单位,我已经做了归一化处理,方便在3D空间中渲染。
我已完成的工作
火柴人动画
我为每个关节(比如肩膀、手肘、手腕)创建了小球体,并用圆柱体连接它们形成“火柴人”。通过将每个球体定位在关键点的(x,y,z)坐标,再在球体之间绘制圆柱体,我得到了一个大致的角色,它能正确模仿视频中人物的动作,运动轨迹完全准确。
[火柴人动画效果示意图]
加载绑定骨骼的3D模型
我导入了一个带骨骼系统的.gltf人形模型(每个身体部位都对应骨骼)。
代码示例:
model.traverse((child) => { if (child.isBone) { bonesMap[child.name] = child; } });
尝试动作重定向
逐帧计算肢体的方向向量(比如上臂→前臂 = 手肘位置 - 肩膀位置),然后尝试通过一个函数设置骨骼的旋转:
代码示例:
function setBoneDirection(bone, parentPos, childPos) { const direction = new THREE.Vector3() .subVectors(childPos, parentPos) .normalize(); // 尝试设置骨骼的四元数... }
[模型动作重定向尝试效果示意图]
骨骼确实会移动,但方向不对,手臂/前臂会出现尴尬的翻转。手肘弯曲的角度大致正确,但扭转方向有误。
我的核心问题
局部空间 vs 世界空间
我的关键点数据是在世界空间中的,但骨骼系统中每个骨骼的变换是定义在局部空间(相对于父骨骼)的。比如移动上臂时,下臂的旋转也会受影响。我该如何正确地将姿态数据转换为每个骨骼的局部空间坐标,让骨骼链能正确运动?
绑定姿态/默认姿态的方向
绑定姿态下,模型骨骼的默认轴可能并不是沿着(0,1,0)或(0,-1,0)方向的。我该如何确定每个骨骼的默认轴,从而计算出正确的旋转偏移量?
可靠的实现方案/库
有没有这样的库、算法或代码模式,能做到以下几点:
- 将关键点数据从世界空间转换为父骨骼的局部空间
- 通过测量模型绑定姿态,确定每个骨骼的“默认姿态方向”
- 计算所有骨骼的最终旋转角度,让模型动作完全匹配我的火柴人动画?
我目前有一个包含火柴人动画和3D模型重定向尝试的实现项目。
备注:内容来源于stack exchange,提问作者AzizStark




