前言

  传统的角色眼球做法,特别是次世代一类的,通常会做比较复杂的眼球模型。
  我目前的项目是做手游了,为了能够 hold 住资源消耗,所以眼球就完全是个面片了。
  面片怎么实现眼球的挪移呢?
  本文就来探讨一下怎么利用 UV 节点控制眼球贴图的偏移,并且通过控制器来进行控制。

贴图偏移

  Maya 控制贴图的的 UV 的方式是通过 Place2dTexture 节点
  这个节点默认添加贴图就会自动生成并且连接到 贴图 的 UV 属性上。

  通过 Place2dTexture 可以实现贴图 UV 的多种控制效果。
  其中我们这里需要用到的主要是 Offset 属性。

alt

  通过控制偏移属性,就已经有点眼球移动的味道了。
  但是当眼球运动到面片的边缘的时候,会出现左右接缝相接了。

alt

  要解决这个问题需要将 WrapU 和 WrapV 属性关闭。
  这两个属性主要实现了贴图在多象限下的重复效果

alt

  关闭了之后,超出边界的地方会变成灰色。
  变成灰色是因为 贴图的 Default Color 默认设置为灰色的。

alt

  这里的操作主要参考了我看的第一个 Maya 教程里面的投射贴图的操作 链接

  如此 offset 就没有问题了。

Locator 控制贴图偏移朝向

  默认是两个 UV 属性的偏移,让动画师去控制两个属性 K 动画显然非常不方便。
  怎么通过一个 Locator 实现类似 AimConstraint 的效果呢?

  这里就需要 Maya 隐藏节点的 closestPointOnMesh
  这个节点在创建节点的面板上是找不到的,不过可以在节点编辑器里通过 Tab 键输入找到它

  这个节点接受一个模型和一个点,会自动计算出距离模型最近点的相关信息。
  其中就有我们这里所需要的 UV 信息。

alt

  然后将输出 UV 的填入 Offset 里面
  直接填入会有数值偏差,因为 Locator 的中心区域是 UV 0.5 0.5 的区域,需要分别减去 0.5 才是对的。
  所以需要建一个 plusMinusAverage 进行处理

alt

  这样就可以通过 locator 控制 UV 眼球的运动了

alt

更新问题

  设置完上面的效果之后进行 K 帧,发现视窗没有及时更新。
  需要将 Maya 的刷新机制改为 DG 模式

alt

总结

  其实这个设置不复杂,如果需要双眼单独控制需要做两个材质贴两张图。

2020-9-24 更新

添加缩放功能

  美术想要通过一张贴图复用到大多数的角色眼睛上。
  这需要解决贴图的缩放问题。

alt

  通过上图可以看到 Coverage 是从 0,0 位置为原点进行缩放的。
  为了修正偏移,我用 TranslateFrame 的方式确保缩放之后的图片在 locator 中心。

  然而使用了 offset 配合 Coverage 会导致边缘无法覆盖的问题。

alt

  这就牵涉到 TranslateFrame 和 offset 的区别了。

alt

  这是使用 offset

alt

  这是使用 TranslateFrame

  可以看到 TranslateFrame 可以避开 Coverage 裁切的问题
  所以我后续放弃了 offset 属性使用,全部用 TranslateFrame 来实现偏移以及缩放校正。

alt
alt

对接虚幻引擎

  参考文档 链接
  将 Place2dTexture 的属性连接到骨骼上,导出动画的时候可以获取到骨骼属性上的曲线。
  根据文档勾选 Anim Curves 窗口的 Material 选项即可将相关参数传递到 Shader 里,还原 Maya 的控制效果。

2020-11-14

  回来补充一下,因为后续想要实现一张贴图带四个眼球,通过 shader 采样实现在一张贴图下切换眼球的效果。
  所以用 Maya 的节点已经不可能实现这么夸张的效果,这个时候就需要 dx11 shader 来帮忙了。
  通过 DirectX11 的 hlsl 语言可以实现我们想要的效果。

  举动上也做了很多优化,比如说眼睛的模型精度不够的话,使用 closestPointOnMesh 会有跳动问题。
  所以我复制了一个面片,然后通过 wrap 变形器实现绑定模型的同步,这样可以在复制面片上进一步细分面数达到更好的控制效果。
  后面是直接通过工具一键生成眼睛控制,在绑定环节之后进行添加,方便修改。