다음 절차에서는 HumanIK API에 제공된 함수를 사용하여 프로그래밍 방식으로 새 HIKCharacter를 만들고 캐릭터화를 설정합니다.
이 캐릭터화 프로세스를 자체 코드에서 수행하기 전에 이 문서의 다음 섹션에서 제공하는 자료를 읽고 이해해야 합니다.
캐릭터에 대한 HIKCharacterDefinition을 만들어야 합니다. 이는 해당 정의에서 만든 모든 HIKCharacters에 표시될 노드나 관절을 식별하는 청사진입니다.
이 클래스에는 하나의 주 멤버 mUsedNodes가 있습니다. 이 멤버는 HIKNodeId 열거에 나열된 각각의 사전 결정된 관절에 대한 요소를 포함하는 정수 배열입니다. HIKCharacterDefinition 클래스의 인스턴스를 만들고 해당 노드 ID를 HIKCharacterDefinition에서 사용할지 여부를 나타내도록 mUsedNodes 배열의 각 요소 값을 설정해야 합니다.
HIKCharacterDefinition에서 사용됨으로 노드 ID에 플래그를 지정하려면 mUsedNode 배열에서 해당 요소의 값을 HIKNodeUsed로 설정합니다. HIKCharacterDefinition에서 사용되지 않음으로 노드 ID에 플래그를 지정하려면 mUsedNode 인덱스에서 해당 요소의 값을 HIKNodeNotUsed로 설정합니다.
예를 들어 다음 코드 예제에서는 HIKCharacterDefinition을 만들고 해당 정의에서 만든 모든 HIKCharacters에 사용할 노드를 초기화하는 일반적인 방법을 보여 줍니다.
// first, create an array containing the Node IDs
// that represent joints you want to use. This example uses only
// the mandatory Node Ids required by HumanIK, listed below.
int gCharacterJointTotal = 15;
const int fJointIds[] = {HipsNodeId,
LeftHipNodeId,
LeftKneeNodeId,
LeftAnkleNodeId,
RightHipNodeId,
RightKneeNodeId,
RightAnkleNodeId,
WaistNodeId,
LeftShoulderNodeId,
LeftElbowNodeId,
LeftWristNodeId,
RightShoulderNodeId,
RightElbowNodeId,
RightWristNodeId,
HeadNodeId};
// Next, create an HIKCharacterDefinition object, and initialize
// its memory space to 0 (or HIKNodeNotUsed).
HIKCharacterDefinition MyDef;
memset(&MyDef, 0, sizeof(HIKCharacterDefinition));
// Finally, iterate through the array of Node IDs to be used, and
// set the corresponding element in the mUsedNodes array to
// HIKNodeUsed.
int ii;
for (ii = 0; ii < gCharacterJointTotal; ++ii)
{
MyDef.mUsedNodes[fJointIds[ii]] = HIKNodeUsed;
} HIKNodeUsed 및 HIKNodeNotUsed의 두 가지 대체 방법도 특정 상황에서 사용됩니다.
HIKCharacterDefinition은 HumanIK에 필요한 최소 15개의 노드를 모두 활성화해야 합니다. HumanIK 노드 및 이펙터에 관절 매핑을(를) 참조하십시오.
초기화 단계에서 만든 HIKCharacterDefinition을 기반으로 HIKCharacter를 만들려면 HIKCharacterCreate() 함수를 호출합니다. 이 함수에는 다음 인수가 필요합니다.
HIKCharacter * MyChar = HIKCharacterCreate(&MyDef, &malloc, AutodeskCustomerString, AutodeskCustomerKey); if (MyChar == 0) { // the character could not be created. Handle the error here. }
새로 만든 HIKCharacter에는 HIKCharacterDefinition에서 HIKNodeUsed, HIKNodeLimits 또는 HIKNodeParentOffset 플래그가 설정된 관절만 포함됩니다.
HIKCharacterCreate() 함수에서 null 포인터를 반환하는 경우 라이센스 키나 캐릭터 정의에 문제가 있을 수 있습니다. 도움말은 문제 해결을(를) 참조하십시오.
이제 발목, 무릎, 팔꿈치 등의 관절 세트로 캐릭터를 초기화했습니다. 그러나 캐릭터가 기본 T 자세로 서 있는 동안 각 관절의 변환, 회전 및 배율 조정을 제공하여 캐릭터의 골격을 보다 세부적으로 정의해야 합니다. 이 T 자세에 대한 자세한 내용은 기본 T 자세을(를) 참조하십시오.
캐릭터에 사용된 각 노드에 대해 HIKSetCharacterizeNodeStateTQSfv() 함수를 호출하여 이러한 기본 위치 및 회전을 제공할 수 있습니다. 이 함수에는 다음 인수가 필요합니다.
float trans[4];
float quat[4];
float scale[4];
for (ii = 0; ii < LastNodeId; ++ii)
{
if (sSuccess == fJointIds.find(ii))
{
HIKSetCharacterizeNodeStateTQSfv(MyChar, ii, trans, quat, scale);
}
} HIKSetCharacterizeNodeStateTQSfv() 대신 4x4 변형 매트릭스에 표현된 변환, 방향 및 배율 조정 값을 허용하는 HIKSetCharacterizeNodeStatefv() 함수를 호출할 수 있습니다. 이 매트릭스에 대한 자세한 내용은 변환 매트릭스을(를) 참조하십시오.
캐릭터의 노드에 자유 각도를 설정하고 의도하지 않은 구성이나 사실적이지 않은 구성으로 회전되지 않도록 제한하려면 지금 제한을 설정해야 합니다.
HIKCharacterDefinition에서 HIKNodeLimits 플래그를 할당하여 지정한 노드에 대해서만 자유 각도를 설정할 수 있습니다. 위의 프로그래밍 방식으로 HIKCharacter 캐릭터화 단계를 참조하십시오.
캐릭터의 자유 각도를 설정하려면 원하는 각 노드에 대해 HIKSetLimitsfv() 함수를 호출합니다. 허용되는 매개변수에 대한 자세한 내용은 API 참조의 함수 설명을 참조하십시오. 자유 각도는 항상 로컬 공간에 지정되며 각도가 아닌 라디안으로 제공되어야 합니다.
const float minValues[] = {0.0f, 0.7854f, 0.0f};
const float maxValues[] = {1.571f, 1.571f, 0.0f};
const float preRot[] = {0.0f, 0.0f, 0.0f, 1.0f};
const float postRot[] = {0.0f, 0.0f, 0.0f, 1.0f};
HIKSetLimitsfv (MyCharacter1, RightKneeNodeId, minValues, maxValues, preRot, postPost, HIKActiveMinX | HIKActiveMaxX | HIKActiveMinY | HIKActiveMaxY, HIKOrderEulerXYZ);
자세한 내용은 자유 각도을(를) 참조하십시오.
HIKCharacter에 사용된 각 노드에 대해 적절한 변환, 회전 및 배율 조정 값을 제공했으면 HIKCharacterizeGeometry() 함수를 호출하고 HIKCharacter에 대한 포인터를 전달하여 캐릭터의 형상을 마무리해야 합니다.
bool result = HIKCharacterizeGeometry(MyChar); if (result == false) { // The characterization was unsuccessful; handle the error. }
캐릭터화를 마무리하면 HIKCharacter에서 사용할 수 있습니다. 초기화에 나열된 단계를 계속 진행하여 캐릭터에 필요한 다른 HumanIK 오브젝트를 설정합니다.
HIKCharacterizeGeometry() 함수에서 false를 반환하면 캐릭터의 T 자세에 문제가 있을 수 있습니다. 도움말은 문제 해결을(를) 참조하십시오.