CCD反向运动学问题

时间:2011-03-07 15:44:15

标签: c++ animation game-engine inverse-kinematics

部屋 我目前正在完成我的学位最终年度项目,这是2部分A)创建一个好的3D引擎,B)在其中实现IK系统并评估几种类型的IK解决方案。 CCD(Cyclic-Coordinate Descent)是我开始的地方,我遇到了一个问题。 我已经使用了大量的资源来尝试掌握IK,特别是在CCD方面,我使用了源代码作为基础:http://www.darwin3d.com/gdm1998.htm

在我开始发布我的源代码之前,我希望我的问题是某个人之前遇到过的明显或简单的问题。 以下是显示问题的简短视频:http://www.youtube.com/watch?v=XtU8rFR-DuE

显然这是不对的,IK旋转并且通常看起来很混乱! 如果目标保持不变,那么它会很好地收敛,但即使是最小的运动(由于我的引擎中的目标由基于IR的运动捕捉驱动,在该系统中发生很多)并且它似乎重新计算并再次开始旋转。

当关节超出范围时,您会假设遵循CCD技术,关节将全部指向目标并且只是达到循环限制,但您仍然会以正确的方式获得IK目标,但很明显在视频中,如果目标超出范围,则IK会再次迭代并旋转。

如果有人可以提供帮助,我会真的!欣赏它。 如果需要更多信息(代码等),请随时提问。

提前致谢 克里斯

1 个答案:

答案 0 :(得分:0)

大量的事情可能是错的;你必须调试你的程序。

对于每个关节:

  1. 检索目标位置target和末端效应器位置end
  2. 知道关节的变换,计算新的关节值q
  3. 计算新关节值endNew的末端效应器位置q
  4. 如果从endtarget的距离小于从endNewtarget的距离,则表示您发现了一个错误(所有旋转错误)。要么是在2.中选择q,要么在1.和3中计算末端效应器位置。

    我不愿意使用其他人的随机示例代码(or even my own)。例如Lander写道

    CrossProduct(&curVector, &targetVector, &crossResult);
    NormalizeVector(&crossResult);
    

    但是我们确定这不会因为除零而崩溃(例如,如果curVector = -targetVector)?

    如果关节是旋转的(并且不像兰德的例子那样是球形的),那么请参见Wang&陈在兰德的数学参考文献中。