다음 섹션에서는 HumanIK 역운동학 솔버를 사용하여 캐릭터의 새 위치를 계산하는 데 필요한 프로세스 개요를 설명합니다.
순운동학 애니메이션 중에 캐릭터가 수행하는 움직임을 변경하기 위해 HumanIK 역운동학 솔버를 호출하는 경우, 일반적으로 각 프레임에서 캐릭터의 현재 자세를 시작 지점으로 지정합니다. 초기화 단계에서 만든 HIKCharacterState에서 이 현재 자세를 제공합니다.
각 이펙터에 대해 설정한 도달 제약 조건을 평가할 때 역운동학 솔버가 이 현재 자세를 고려합니다. 예를 들어 캐릭터의 왼쪽 무릎 이펙트에 0.5의 변환 도달을 설정하면 왼쪽 무릎 이펙터에 대해 지정한 변환과 이 HIKCharacterState에 포함된 왼쪽 무릎 노드 변환 사이의 중간에 캐릭터의 왼쪽 무릎 노드를 배치합니다. 도달을(를) 참조하십시오.
HumanIK는 게임 엔진에서 현재 FK 위치 및 캐릭터의 관절 회전을 사용하여 HIKCharacterState의 노드를 동기화하기 위한 여러 가지 옵션을 제공합니다. 사용 가능한 모든 옵션에 대한 자세한 내용은 애니메이션 데이터 설정 및 검색을(를) 참조하십시오.
한 가지 일반적인 방법은 HIKCharacterState()의 각 노드에 대해 HIKSetNodeStateTQSfv() 함수를 호출하는 것입니다. 이 함수에는 다음 인수가 필요합니다.
HIKSetNodeStateTQSfv (MyCharacter, MyCharState, RightHandNodeId, myModel.GetTranslation(RightHandNodeId), myModel.GetQuatRotation(RightHandNodeId), myModel.GetScaling(RightHandNodeId));
각 프레임에 각 캐릭터 팔다리의 원하는 위치 및 회전을 포함하려면 HIKEffectorSetState를 설정해야 합니다. 모든 이펙터의 위치 및 회전을 설정할 필요 없이, 변환 도달 또는 회전 도달 제약 조건에 대해 0이 아닌 값을 설정하여 목표점으로 지정한 이펙터만 설정하면 됩니다. 다른 이펙터는 역운동학 솔버에서 효과적으로 무시됩니다. 해당 위치 및 방향은 최종 솔루션에 영향을 미치지 않습니다.
다음 방법 중 하나를 사용하여 이펙터의 위치 및 회전을 설정할 수 있습니다.
HumanIK는 해당 이펙터의 3D 위치 및 방향 설정을 위해 여러 가지 옵션을 제공합니다. 사용 가능한 모든 옵션에 대한 자세한 내용은 애니메이션 데이터 설정 및 검색을(를) 참조하십시오.
한 가지 일반적인 방법은 HIKEffectorSetState에서 각 이펙터에 대해 HIKSetEffectorStateTQSfv() 함수를 호출하는 것입니다. 이 함수에는 다음 인수가 필요합니다.
이 이펙터 ID는 HIKCharacterDefinition을 만들 때 지정한 해당 관절의 노드 ID와 동일하지 않습니다.
HIKEffectorSetState에서 설정한 변환, 방향 및 배율 조정 값은 내부 계산을 위해 HumanIK에서 사용된 정규화된 공간에 표시됩니다. 캐릭터의 기본 T-자세에 회전 또는 배율 조정 오프셋이 없는 노드의 경우, 정규화된 이 공간이 전역 공간과 정확하게 같습니다. 캐릭터의 기본 T-자세에 회전 또는 배율 조정 오프셋이 없는 노드의 경우, 캐릭터에 대해 원하는 방향 또는 배율 조정을 설정하기 위해 이펙터를 사용하는 중이면 대신 HIKSetCharacterSpaceEffectorStateTQSfv() 함수를 호출해야 할 수도 있습니다. 정규화된 공간에 대한 자세한 내용은 HIKEffectorSetStates에서 데이터 설정 및 검색을(를) 참조하십시오.
HIKSetEffectorStateTQSfv (MyEffectorSet, RightHandEffectorId, targetTranslation,
targetQuatRotation,
targetScaling);HIKCharacterState의 노드에 맞게 HIKEffectorSetState에서 이펙터의 위치 및 회전을 설정할 수 있습니다. 이 초기화 이후 선택한 이펙터의 변환 및 회전에 오프셋을 적용할 수 있습니다.
HIKCharacterState에서 이펙터 설정을 초기화하려면 HIKEffectorSetFromCharacter 함수를 호출합니다. 이 함수에는 다음 인수가 필요합니다.
HIKEffectorSetFromCharacter (MyChar, MyEffectorSet, MyCharState, MyPropertySet);
HIKEffectorSetState를 초기화하면 HIKGetEffectorStateTQSfv() 함수를 사용하여 해당 매트릭스를 검색하고 오프셋을 반환된 값에 적용한 다음 HIKSetEffectorStateTQSfv() 함수를 사용하여 수정된 값을 다시 적용하여 각 이펙터의 위치 및 회전을 수정할 수 있습니다. 예를 들면 다음과 같습니다.
const float trans[4]; const float quatRot[4]; const float scale[4]; HIKGetEffectorStateTQSfv (MyEffectorSet, RightHandEffectorId, trans, quatRot, scale); ... // offset trans, quatRot and/or scale values here HIKSetEffectorStateTQSfv (MyEffectorSet, RightHandEffectorId, trans, quatRot, scale);
HIKEffectorSetState에서 각 이펙터에 대해 개별적으로 변환 도달, 회전 도달, 당기기 및 저항 값을 제어할 수 있습니다.
기본적으로 이러한 각 제약 조건이 0 값으로 설정됩니다. 이를 통해 역운동학 솔버가 캐릭터의 모든 관절을 일반적으로 캐릭터의 현재 FK 자세가 포함된 솔버에 제공한 HIKCharacterState에 표시된 자세에 고정할 수 있습니다. 역운동학 솔버가 해당 이펙터를 고려하도록 하려면 다음 함수를 사용하여 이러한 제약 조건에 대해 새 값을 설정해야 합니다.
예를 들어 다음 줄은 해당 이펙터 위치 중간까지 오른쪽으로 이동하고 필요한 경우 몸체의 나머지를 당기는 반면, 오른쪽 팔꿈치는 원래 각도를 유지하는 경향이 있습니다.
HIKSetTranslationActive(MyEffectorState, RightHandEffectorId, 0.5f); HIKSetPull(MyEffectorState, RightHandEffectorId, 1.0f); HIKSetResist(MyEffectorState, RightElbowEffectorId, 0.75f);
역운동학 해석 프로세스는 여러 단계로 나누어지며, 각 단계에서 선택한 관절 체인, 당기기와 같은 제약 조건의 효과, 바닥 접점(손과 발 접점 참조) 또는 스쿼시 및 늘이기(스쿼시 및 늘이기 참조)와 같은 특수 변환의 결과에 대해 새 위치를 계산합니다.
역운동학 솔버에서 수행되는 계산 단계를 결정하려면 HIKSetIKSolvingStep() 함수를 호출합니다. 이 함수는 다음 두 개의 인수를 사용합니다.
HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepAll);
| 연산자(bitwise OR)와 이들을 연결하여 HIKSolvingStep 열거에 나열된 여러 해석 단계를 지정할 수 있습니다. 예를 들면 다음과 같습니다.
HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepBodyPull |
HIKPropertySetState에서 구성 설정을 변경하여 HumanIK 역운동학 솔버의 여러 가지 다른 면을 제어할 수 있습니다.
HIKPropertySetStates가 일관된 기본값 세트를 사용하여 초기화되므로 HumanIK 작업을 가져오기 위해 값을 변경할 필요가 없습니다. 이 단계는 선택 사항입니다. 그러나 각 캐릭터에 적절한 속성 값을 설정하여 종종 더 나은 실제적인 결과를 더 많이 얻을 수 있습니다. 이는 스칼라 거리 값을 유지하는 캐릭터 속성에 특히 적용되는데 이러한 속성의 기본값 크기는 대략 키가 180 단위인 캐릭터에 맞게 지정되기 때문입니다.
캐릭터에 대해 사용할 수 있는 구성 옵션 및 이러한 옵션에 대해 값을 설정하는 방법에 대한 자세한 내용은 캐릭터 속성을(를) 참조하십시오.
HumanIK 역운동학 솔버를 시작하려면 HIKSolveForEffectorSet 함수를 호출합니다. 이 함수에는 다음 인수가 필요합니다.
HIKSolveForEffectorSet (MyChar, MyCharState, MyEffectorSet, MyPropertySet);
역운동학 솔버가 인수로 전달한 동일한 HIKCharacterState에 캐릭터에 대해 생성한 자세를 저장합니다. 이 HIKCharacterState에서 각 노드의 변환, 방향, 배율 조정을 검색하고 게임 엔진 캐릭터에 다시 적용해야 합니다.
HumanIK는 HIKCharacterState에서 노드의 3D 위치 및 회전을 검색하기 위한 여러 가지 옵션을 제공합니다. 사용 가능한 모든 옵션에 대한 자세한 내용은 애니메이션 데이터 설정 및 검색을(를) 참조하십시오.
캐릭터에 대해 계산된 자세를 검색하기 위한 한 가지 일반적인 방법이 HIKCharacterState의 각 노드에 대해 HIKGetNodeStateTQSfv() 함수를 호출하는 것입니다. 이 함수에는 다음 인수가 필요합니다.
const float trans[4]; const float quatRot[4]; const float scale[4]; HIKGetNodeStateTQSfv (MyCharState, RightHandNodeId, trans, quatRot, scale); ... // apply retrieved values back to game engine here
각 노드에 대해 검색된 값을 게임 엔진에서 캐릭터의 해당 관절에 다시 적용하는 것은 사용자에게 달려 있습니다.