You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)方向的。我该如何确定每个骨骼的默认轴,从而计算出正确的旋转偏移量?

可靠的实现方案/库

有没有这样的库、算法或代码模式,能做到以下几点:

  1. 将关键点数据从世界空间转换为父骨骼的局部空间
  2. 通过测量模型绑定姿态,确定每个骨骼的“默认姿态方向”
  3. 计算所有骨骼的最终旋转角度,让模型动作完全匹配我的火柴人动画?

我目前有一个包含火柴人动画和3D模型重定向尝试的实现项目。


备注:内容来源于stack exchange,提问作者AzizStark

火山引擎 最新活动