Re: [美术] 如何调整旋转数值为0但不改变模型形状

楼主: newyellow (newyellow)   2020-08-09 13:53:28
这个问题以前有研究过
那时是为了制作一个把动画从 unity 转到 maya 的工具
这个 project 我有放在 github 上 有兴趣可以参考
https://github.com/newyellow/Unity-Runtime-Animation-Recorder
首先 模型之所以汇入的时候 每一个关节的 rotation 都不太一样
这是因为这个关节的 rotation 数值 是在建模过程时决定的
影片是 maya 在做 rigging 的过程 从 1:30 开始是在新增骨架的节点
那一个一个的 (+) 形状符号 就是骨头的节点
仔细看他在点的过程中 (+) 的旋转会改变 那便代表了那一段骨头的 axis
https://youtu.be/1wvdQy2Fdhw
节点的 rotation 代表了骨头的 axis 也就是两个节点之间的方向向量
那便不可能让他们为 0 (除非两点之间的角度刚好是 0)
但熟悉 maya 的人可能会说 在 maya 里面有一个功能叫做 freeze transform
如果在节点上使用 freeze transform 该节点的 rotation 会变成 0
(freeze transform 可以让 position、rotation 归零,scale 变成 1)
但事实上 如果再汇入 unity,会发现他的 rotation 并不是 0
这是因为,实际上 freeze rotation 做的事情,并不是真的把数值归零
而是把这些数值存到另外一个 pre-rotation 数值里
接口上虽然 rotation 变成 0,实际运算上会再把 pre-rotation 加回去
rotation 归零只是让使用者在视觉上比较干净、人脑好理解
这样后续 key 动画如果要调整数值 也比较好调整
(不然如果数字很碎 例如 -1.5768344 之类的 应该会觉得很烦)
但是 pre-rotation 这个参数在 unity 里面并不支援
所以在 unity 汇入模型的时候会直接把 pre-rotation 的数值加回到 rotation 上
因此在 unity 里面看到的 rotation 仍不是零
(这个东西我是在写动画工具的时 仔细看 fbx 档的 ascii 编码才发现的
事实上除了 pre-rotation 还有另一个参数 post-rotation 但我就没有细究其作用)
但我想 rotation 是不是真的归零并不重要 主要还是看你想要做什么
例如我们可以利用一个 script 去模仿归零这件事情
例如这样:
Quaternion _preRotation;
public Vector3 newRotation = Vector3.zero;
void Awake () {
_preRotation = transform.rotation;
}
void Update () {
transform.rotation = _preRotation * Quaternion.Euler(newRotation);
}
这样你在操作 script 的 newRotation 时 感觉上就跟归零一样
那如果你是想要把角色的动画 套用到其他人形角色上
那就不用那么麻烦,unity 的 animator 就有内建类似的功能
只要人形角色在 import 的时候型态都设定为 humanoid 他们的动画就可以互相套用
(而这个系统背后的逻辑 大概也跟上面那段 script 类似 只是还有加入其他的功能)
不过 unity 这个动画转换的功能只限于人型模型 其他的骨架就要自己写脚本
最后分享一下以前制作的一个专案
这个专案是把即时的 motion capture 资料套用到模型上
那时候用的 mocap 系统有两三种不一样的 每种传进来的格式有些差别
再来有些模型不是人型的 所以就做了很多 rotation 资料转换的研究
https://www.youtube.com/watch?v=GIyD6h8rem0
作者: powenyu (powen0706)   2020-08-09 14:30:00
感谢 我会去研究看看
作者: oopFoo (3d)   2020-08-10 09:26:00
Maya这样做等于另外包个rig,如Snegi大建议的。直接transfrom vertex。你model的transform就归初始值真的,这些基本要了解。

Links booklink

Contact Us: admin [ a t ] ucptt.com