1

我有一个面部动画装备,我以两种不同的方式驾驶它:它在 Maya 视口中有一个艺术家 UI,这对于交互式动画来说很常见,我已经将它与 FaceShift 无标记动作捕捉系统连接起来。

我设想了一个工作流程,其中捕获表演,导入 Maya,平滑和减少样本数据,然后动画师接管完成。

我们的面部绑定具有由三个对象(全局lookAtTarget 和左右眼偏移)的迷你层次结构控制的眼睛注视。

因为眼睛注视是由这个 LookAt 设置控制的,所以在导入包含眼睛注视的动作捕捉数据时需要禁用它们。

导入动作捕捉数据后,现在可以使用动作捕捉旋转设置眼睛注视。

我正在寻找一个简短的 Mel 例程,它执行以下操作:它通过运动捕捉眼睛旋转样本,向后计算并设置每只眼睛的 LookAt 目标位置,并对两者进行平均以获得全局 LookAt 目标的位置。

运行 Mel 例程后,我可以重新打开眼睛的 LookAt 约束,眼睛注视控制返回到绑定,视觉上没有任何变化,动画师的眼睛 UI 将再次在 Maya 视口中工作。

我认为这应该是任何进行面部动作捕捉的人的共同逻辑。有人已经得到了这样的东西吗?

4

3 回答 3

1

动作捕捉中的眼动追踪有多好?如果目标距离很远,可能会出现问题:根据数据的采样,您可能会得到看起来不收敛的“疯狂的眼睛”,或者数据跳跃。如果是这种情况,您可能需要完全丢弃眼睛数据,或者在重新定位之前对其进行大量平滑处理。

为了找到两只眼睛的交汇点,你试试这个(比如@julian,我正在使用定位器等,因为在 mel 中进行所有数学运算会很烦人)。

1)将定位器约束到一只眼睛,使一个轴沿观察向量定向,另一个轴位于第二只眼睛的平面内。假设眼睛向下瞄准 Z,第二只眼睛在 XZ 平面上

2)制作第二个定位器,以第一个定位器为父,并以相同的方式约束到第二只眼睛:指向Z,第一只眼睛在XZ平面上

3)第二个定位器的局部Y旋转是两只眼睛之间的会聚角。

在此处输入图像描述

4)使用正弦定律和第二只眼睛相对于第一只眼睛偏移的作弊计算焦距。第二只眼睛的局部 X 距离是直角三角形的一条腿。三角形的角度是来自#3 的会聚角和 90 的会聚角。换句话说:

focal distance                    eye_locator2.tx
--------------       =            ---------------
sin(90 - eye_locator2.ry)         sin( eye_locator2.ry)

所以代数上:

focal distance =   eye_locator2.tx * sin(90 - eye_locator2.ry) / sin( eye_locator2.ry)

您必须减去 eye2 的局部 Z,因为我们正在求解的三角形向后或向前移动了这么多:

  focal distance =   (eye_locator2.tx * sin(90 - eye_locator2.ry) / sin( eye_locator2.ry)) -  eye_locator2.tz

5)将目标沿眼睛定位器的局部 Z 方向定位在上面得出的距离处。听起来实际控制使用两个可以分开以避免交叉眼的观察目标 - 这是一种判断调用,以了解使用多少与实际会聚距离。对于许多真实世界的数据,收敛可能太远了,不利于动画师:使用 30 米外的目标是非常不切实际的,但可以用 10 米外的目标进行模拟,并且传播范围很大。不幸的是,没有经验的答案 - 这是一个判断电话。

于 2013-08-19T05:53:23.233 回答
0

解决方案最终变得非常简单。这种情况是眼睛旋转节点上的运动捕捉数据,同时需要(非技术)动画师对眼睛注视进行覆盖控制。在 Maya 中,约束具有权重因子:控制约束影响的参数 0-1 值。解决方案是动画师在他们想要控制眼睛注视时简单地将眼睛的 lookAt 约束权重设置为 1,当他们想要运动捕获的眼睛注视时将这些相同的权重设置为 0,并使用这些约束权重的平滑过渡掩盖过渡。这比我上面描述的原始想法要好,因为原始动作捕捉数据保留在原处,可作为参考,允许动画师在需要时来回切换。

于 2013-08-23T22:29:33.550 回答
0

我没有这个脚本,但它会相当简单。你能提供一个玛雅场景的例子吗?你不需要任何数学。您可以这样做:

假设通过瞳孔的轴为正 X,焦距为 10 个单位。

  1. 创建 2 个定位器。每只眼睛一个父母。将它们的翻译设置为 (10, 0, 0)。
  2. 在世界空间中再创建 2 个定位器。点将它们约束到其他点。
  3. 创建一个 plusMinusAverage 节点。
  4. 将世界空间定位器的翻译连接到 plusMinusAverage1 输入 1 和 2
  5. 创建另一个定位器(lookAt)
  6. 将 plusMinusAverage1 的输出连接到 lookAt 定位器的平移。
  7. 烘焙lookAt 定位器的翻译。
  8. 删除其他 4 个定位器。
  9. Aim 将眼睛的 X 轴约束到lookAt。

这都可以使用以下命令在脚本中完成:spaceLocator、createNode、connectAttr、setAttr、bakeSimulation、pointConstraint、aimConstraint、delete。

于 2013-08-18T09:54:20.990 回答