1

我为逆运动学实现了 CCD 算法,它工作得很好,但由于限制而失败,我想实现一个系统,如果手臂无法到达目标,它会尝试靠近它。

我试图将约束放在 CCD 算法中,也就是说,如果我的旋转角度高于或低于约束,我将其限制为最大值或最小值。例如,如果旋转角度为 100 度且约束为 90,那么我旋转 90 度并在此基础上计算其他角度,它适用于某些情况,但适用于大多数情况。

谁能告诉我一个处理约束的 3D IK 算法?

4

1 回答 1

3

CCD 本身就像一个魅力。如果您正在处理 3D,请首先找到您应该在每个轴上进行的旋转而不应用骨骼限制。

之后,该方法

expectedRotation.X = min(expectedRotation.X, maxLimit.X)
expectedRotation.X = max(expectedRotation.X, minLimit.X)
expectedRotation.Y = min(expectedRotation.Y, maxLimit.Y)
expectedRotation.Y = max(expectedRotation.Y, minLimit.Y)
expectedRotation.Z = min(expectedRotation.Z, maxLimit.Z)
expectedRotation.Z = max(expectedRotation.Z, minLimit.Z)

错了。因为,如果你不能在其中一个轴上进一步移动,另外两个轴会继续移动,你会得到奇怪的结果。

修复:

如果 3 个轴中的任何一个与限制约束不匹配,则根本不能更改旋转。

首先将所有角度转换为 -180 到 180 格式的度数。然后下面会做

vector3df angleDifference = expectedRotation - baseRotation; //baseRotation is just the initial rotation from which the bone limits are calculated.

if(angleDifference.X < boneLimits.minRotation.X || angleDifference.Y < boneLimits.minRotation.Y || angleDifference.Z < boneLimits.minRotation.Z || angleDifference.X > boneLimits.maxRotation.X || angleDifference.Y > boneLimits.maxRotation.Y || angleDifference.Z > boneLimits.maxRotation.Z)
    return currentRotation;

return expectedRotation;
于 2014-06-07T10:55:43.743 回答