【发布时间】:2017-01-05 14:45:48
【问题描述】:
我正在编写自己的逆运动学,目前正在研究关节约束。大部分都很好,但我想从生成的动画中删除所有不连续性,而约束是最大的问题。
例如,假设您正在看一个围绕您的头旋转的球。它向右旋转,您看起来正确,直到您的颈部扭曲极限。球仍然在移动,当它经过你的背部时,你的头会突然被夹在对面的限制上,向左看。这就是我们通过典型的夹紧得到的结果,它给我带来了帧到帧的不连续性。
我需要的是,你的头会在几帧内从右向左移动。我的第一个想法是用我的 X 轴(在肩膀之间)反映源方向,如果反射方向满足约束限制 - 将其返回。如果它不符合限制 - 剪辑反射方向而不是源方向。
这应该给我带来不错的连续运动,这不是火箭科学,但有很多细节需要注意。我的限制可能像min < max,也可能像max < min,它们可能通过切换角度值(如360->0,或180->-180)或不通过。此外,当我的允许范围大于 180 度时,逻辑应该略有不同。
不同案例的数量增长非常快,所以我想知道我是否可以在某个地方找到它已经完成?
顺便说一句:我使用的是虚幻引擎,如果它有什么不同的话。
编辑:
如果我用我的头部示例误导了你,我很抱歉 - 这只是一个可视化我的需求的类比。我不会使用此代码在最终动画中定位头骨(或任何其他)。我打算将它用作解决 IK 的一个非常基本的操作。它将在每个 IK 链中的每个迭代中,对每个骨骼,多次使用。所以它需要尽可能快。如果需要,所有更高级别的概念,如运动规划、动力学等,都将添加到另一层。
现在我只是要求这样的功能:
float clampAngle( float angle, float min, float max )
这将返回一个用于更改输入的连续值。
我目前正在处理不同的问题,但当我回到这个问题时我会发布我的代码。
【问题讨论】:
-
单独剪辑是不够的,您需要在几帧的过程中安排从 +clip 到 -clip 的旋转
-
@Alnitak 我不想添加任何计划,因为我不知道未来。我需要它尽可能简单,但要持续输出。我认为我的描述会做到这一点,我只需要对其进行编码:)。
-
我会选择将头部旋转限制在每次更新的最大角度变化。当球经过头后的中间点时,不要立即将视线从右侧约束转移到左侧约束,而是朝那个方向移动,但不要超过您选择的最大角度。这会更自然,也能反映现实的动态约束。你所描述的内容听起来很奇怪,注视着一个并不真正存在的图像。
标签: c++ 3d geometry unreal-engine4