【问题标题】:Unity: Create AnimationClip With World Scale AnimationCurvesUnity:使用世界比例的 AnimationCurves 创建 AnimationClip
【发布时间】:2020-10-30 17:16:17
【问题描述】:

我一直在寻找解决这个问题的方法很长一段时间(意味着几天),但我还没有找到任何东西。可能是我想错了,没有办法,但我们试试吧!

我正在 Hololens 上记录手数据(目前是 Unity Hololens 输入模拟)。这基本上给了我一个float AnimationCurve 用于每个transform.position.xzrotation.xw 的每个手关节。现在我的目标是将这些曲线放入AnimationClip 并将其添加到AnimatorController(通过AnimatorOverrideController),它可以为手动装置制作动画并重放录音。到目前为止一切正常!

但是,Hololens 记录的手数据是世界范围的,而不是本地范围的。 (这是有道理的,因为当您想知道手在哪里时通常需要绝对坐标。)但是要为手设置动画,似乎我只能设置本地坐标,而我没有。

例子:

clip.SetCurve("", typeof(Transform), "localPosition.x", curve.PositionX);

在这里,剪辑从某个手部关节获取 x 坐标,并将其放到相应手部绑定关节的 localPosition.x 中。问题:curve.PositionX 是世界比例(绝对坐标),但 localPosition.x 采用本地比例(相对于其父级的坐标)。

我不能像这样简单地将"localPosition.x" 更改为"position.x"

clip.SetCurve("", typeof(Transform), "position.x", curve.PositionX);

即使 Transform 类具有两个属性,并且 position 是对象的世界比例位置。我不确定为什么这不起作用,但它给了我以下错误:

Cannot bind generic curve on Transform component, only position, rotation and scale curve are supported.

我知道对动画使用绝对坐标没有多大意义,但我根本没有其他任何东西。

有没有人有办法让我以一种明智、不太麻烦的方式处理这个问题?似乎我拥有所有重要的部分,我只是不知道如何将它们组合在一起。已经非常感谢了! :)

【问题讨论】:

    标签: unity3d animation hololens


    【解决方案1】:

    根据我的基本理解,您似乎使用的是 MRTK 提供的Input animation recording service。不幸的是,MRTK 不提供localPosition 版本的曲线数据。但是,您可以在InputRecordingService 停止录制后修改recordingBuffer 中的数据。

    所以,这是一个值得你尝试的方法:在recordingBuffer 字段的handJointCurves 字典属性中,为每个关节存储了一组姿势曲线。然后,根据这张表:Joint pose curves,从每个关键帧中其他关节的位置值中减去关键None的位置值,得到基于关键NonelocalPosition

    【讨论】:

    • 谢谢!我想我已经尝试过类似的方法。而不是等到InputRecordingService 停止记录,对于写入的每一帧,我立即计算localPosition,但w.r.t.其父关节。像这样:jointPose.Rotation = parentJointPose.Rotation * Quaternion.Inverse(jointPose.Rotation); 会 w.r.t.到无关节更有意义?我认为这是有道理的,但旋转仍然关闭(方向错误)。这里的翻译有什么遗漏吗?我应该提到:我正在使用 HandCoach 功能提供的手柄(由 MRTK)
    猜你喜欢
    • 2017-12-15
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多