2014-01-27 6 views
1

역 운동학에 대한 CCD 알고리즘을 구현했지만 작동이 좋았지 만 구속 조건에 실패했습니다. 팔이 목표에 도달 할 수없는 경우 가까이 접근하려고하는 시스템을 구현하고 싶습니다 그것에.관절 각에 대한 제약이있는 최상의 역 기구학 알고리즘

CCD 알고리즘에 제약 조건을 두려고했는데, 회전 각도가 제약 조건보다 높거나 낮 으면 최대 또는 최소로 제한합니다. 예를 들어 회전 각도가 100 도이고 구속 조건이 90 인 경우 90을 회전하고 다른 각도를 계산할 때 어떤 경우에는 작동하지만 대부분 실패합니다.

누구나 제약 조건을 처리하는 3D IK 알고리즘을 말해 줄 수 있습니까?

+0

사용할 수있는 IK 라이브러리가 있습니까? –

답변

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;