我为逆运动学实现了 CCD 算法,它工作得很好,但由于限制而失败,我想实现一个系统,如果手臂无法到达目标,它会尝试靠近它。
我试图将约束放在 CCD 算法中,也就是说,如果我的旋转角度高于或低于约束,我将其限制为最大值或最小值。例如,如果旋转角度为 100 度且约束为 90,那么我旋转 90 度并在此基础上计算其他角度,它适用于某些情况,但适用于大多数情况。
谁能告诉我一个处理约束的 3D IK 算法?
我为逆运动学实现了 CCD 算法,它工作得很好,但由于限制而失败,我想实现一个系统,如果手臂无法到达目标,它会尝试靠近它。
我试图将约束放在 CCD 算法中,也就是说,如果我的旋转角度高于或低于约束,我将其限制为最大值或最小值。例如,如果旋转角度为 100 度且约束为 90,那么我旋转 90 度并在此基础上计算其他角度,它适用于某些情况,但适用于大多数情况。
谁能告诉我一个处理约束的 3D IK 算法?
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;