역운동학 해석

다음 섹션에서는 HumanIK 역운동학 솔버를 사용하여 캐릭터의 새 위치를 계산하는 데 필요한 프로세스 개요를 설명합니다.

단계 1: HIKCharacterState 업데이트

순운동학 애니메이션 중에 캐릭터가 수행하는 움직임을 변경하기 위해 HumanIK 역운동학 솔버를 호출하는 경우, 일반적으로 각 프레임에서 캐릭터의 현재 자세를 시작 지점으로 지정합니다. 초기화 단계에서 만든 HIKCharacterState에서 이 현재 자세를 제공합니다.

각 이펙터에 대해 설정한 도달 제약 조건을 평가할 때 역운동학 솔버가 이 현재 자세를 고려합니다. 예를 들어 캐릭터의 왼쪽 무릎 이펙트에 0.5의 변환 도달을 설정하면 왼쪽 무릎 이펙터에 대해 지정한 변환과 이 HIKCharacterState에 포함된 왼쪽 무릎 노드 변환 사이의 중간에 캐릭터의 왼쪽 무릎 노드를 배치합니다. 도달을(를) 참조하십시오.

HumanIK는 게임 엔진에서 현재 FK 위치 및 캐릭터의 관절 회전을 사용하여 HIKCharacterState의 노드를 동기화하기 위한 여러 가지 옵션을 제공합니다. 사용 가능한 모든 옵션에 대한 자세한 내용은 애니메이션 데이터 설정 및 검색을(를) 참조하십시오.

한 가지 일반적인 방법은 HIKCharacterState()의 각 노드에 대해 HIKSetNodeStateTQSfv() 함수를 호출하는 것입니다. 이 함수에는 다음 인수가 필요합니다.

예를 들면 다음과 같습니다.

HIKSetNodeStateTQSfv (MyCharacter, MyCharState, RightHandNodeId,
                                             myModel.GetTranslation(RightHandNodeId), 
                                             myModel.GetQuatRotation(RightHandNodeId), 
                                             myModel.GetScaling(RightHandNodeId));

단계 2: 이펙터에 대한 위치 및 회전 설정

각 프레임에 각 캐릭터 팔다리의 원하는 위치 및 회전을 포함하려면 HIKEffectorSetState를 설정해야 합니다. 모든 이펙터의 위치 및 회전을 설정할 필요 없이, 변환 도달 또는 회전 도달 제약 조건에 대해 0이 아닌 값을 설정하여 목표점으로 지정한 이펙터만 설정하면 됩니다. 다른 이펙터는 역운동학 솔버에서 효과적으로 무시됩니다. 해당 위치 및 방향은 최종 솔루션에 영향을 미치지 않습니다.

다음 방법 중 하나를 사용하여 이펙터의 위치 및 회전을 설정할 수 있습니다.

이펙터에 대한 위치 및 회전을 직접 설정

HumanIK는 해당 이펙터의 3D 위치 및 방향 설정을 위해 여러 가지 옵션을 제공합니다. 사용 가능한 모든 옵션에 대한 자세한 내용은 애니메이션 데이터 설정 및 검색을(를) 참조하십시오.

한 가지 일반적인 방법은 HIKEffectorSetState에서 각 이펙터에 대해 HIKSetEffectorStateTQSfv() 함수를 호출하는 것입니다. 이 함수에는 다음 인수가 필요합니다.

  • HIKEffectorSetState에 대한 포인터
  • 조작하려는 이펙터의 고유 ID. 이 이펙터 ID는 humanik.h 파일의 HIKEffectorId 열거에 나열된 값일 수 있습니다.

    이 이펙터 ID는 HIKCharacterDefinition을 만들 때 지정한 해당 관절의 노드 ID와 동일하지 않습니다.

  • 이펙터의 변환, 쿼터니언 회전 및 배율 조정 값을 나타내는 4개의 부동 소수점 숫자에 대한 별도의 배열 3개

HIKEffectorSetState에서 설정한 변환, 방향 및 배율 조정 값은 내부 계산을 위해 HumanIK에서 사용된 정규화된 공간에 표시됩니다. 캐릭터의 기본 T-자세에 회전 또는 배율 조정 오프셋이 없는 노드의 경우, 정규화된 이 공간이 전역 공간과 정확하게 같습니다. 캐릭터의 기본 T-자세에 회전 또는 배율 조정 오프셋이 없는 노드의 경우, 캐릭터에 대해 원하는 방향 또는 배율 조정을 설정하기 위해 이펙터를 사용하는 중이면 대신 HIKSetCharacterSpaceEffectorStateTQSfv() 함수를 호출해야 할 수도 있습니다. 정규화된 공간에 대한 자세한 내용은 HIKEffectorSetStates에서 데이터 설정 및 검색을(를) 참조하십시오.

예를 들면 다음과 같습니다.

HIKSetEffectorStateTQSfv (MyEffectorSet, RightHandEffectorId, targetTranslation,
                                                              targetQuatRotation,
                                                              targetScaling);

HIKCharacterState에서 이펙터 세트 초기화

HIKCharacterState의 노드에 맞게 HIKEffectorSetState에서 이펙터의 위치 및 회전을 설정할 수 있습니다. 이 초기화 이후 선택한 이펙터의 변환 및 회전에 오프셋을 적용할 수 있습니다.

이 방법은 다음 시나리오에서 일반적입니다.

  • 런타임 시 기존 애니메이션을 약간 변경하기 위해 HumanIK를 사용하는 경우. 이 시나리오에서는 캐릭터의 HIKEffectorSetState가 현재 FK 위치가 포함된 HIKCharacterState에 맞게 초기화됩니다. HIKCharacterState 업데이트에 대한 자세한 내용은 위의 역운동학 해석을(를) 참조하십시오.
  • 여러 호출을 역운동학 솔버에 연결하는 경우. 이 시나리오에서는 일반적으로 HIKEffectorSetState가 이전 IK 솔버의 결과가 포함된 HIKCharacterState에 맞게 초기화됩니다.

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);

단계 3: 이펙터에 대한 제약 조건 설정

HIKEffectorSetState에서 각 이펙터에 대해 개별적으로 변환 도달, 회전 도달, 당기기 및 저항 값을 제어할 수 있습니다.

기본적으로 이러한 각 제약 조건이 0 값으로 설정됩니다. 이를 통해 역운동학 솔버가 캐릭터의 모든 관절을 일반적으로 캐릭터의 현재 FK 자세가 포함된 솔버에 제공한 HIKCharacterState에 표시된 자세에 고정할 수 있습니다. 역운동학 솔버가 해당 이펙터를 고려하도록 하려면 다음 함수를 사용하여 이러한 제약 조건에 대해 새 값을 설정해야 합니다.

이러한 함수 모두 다음 인수가 필요합니다.

예를 들어 다음 줄은 해당 이펙터 위치 중간까지 오른쪽으로 이동하고 필요한 경우 몸체의 나머지를 당기는 반면, 오른쪽 팔꿈치는 원래 각도를 유지하는 경향이 있습니다.

HIKSetTranslationActive(MyEffectorState, RightHandEffectorId, 0.5f);
HIKSetPull(MyEffectorState, RightHandEffectorId, 1.0f);
HIKSetResist(MyEffectorState, RightElbowEffectorId, 0.75f);

단계 4: 해석 단계 설정

역운동학 해석 프로세스는 여러 단계로 나누어지며, 각 단계에서 선택한 관절 체인, 당기기와 같은 제약 조건의 효과, 바닥 접점(손과 발 접점 참조) 또는 스쿼시 및 늘이기(스쿼시 및 늘이기 참조)와 같은 특수 변환의 결과에 대해 새 위치를 계산합니다.

역운동학 솔버에서 수행되는 계산 단계를 결정하려면 HIKSetIKSolvingStep() 함수를 호출합니다. 이 함수는 다음 두 개의 인수를 사용합니다.

예를 들면 다음과 같습니다.

HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepAll);

| 연산자(bitwise OR)와 이들을 연결하여 HIKSolvingStep 열거에 나열된 여러 해석 단계를 지정할 수 있습니다. 예를 들면 다음과 같습니다.

HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepBodyPull |

단계 5: 캐릭터 속성 설정

HIKPropertySetState에서 구성 설정을 변경하여 HumanIK 역운동학 솔버의 여러 가지 다른 면을 제어할 수 있습니다.

HIKPropertySetStates가 일관된 기본값 세트를 사용하여 초기화되므로 HumanIK 작업을 가져오기 위해 값을 변경할 필요가 없습니다. 이 단계는 선택 사항입니다. 그러나 각 캐릭터에 적절한 속성 값을 설정하여 종종 더 나은 실제적인 결과를 더 많이 얻을 수 있습니다. 이는 스칼라 거리 값을 유지하는 캐릭터 속성에 특히 적용되는데 이러한 속성의 기본값 크기는 대략 키가 180 단위인 캐릭터에 맞게 지정되기 때문입니다.

캐릭터에 대해 사용할 수 있는 구성 옵션 및 이러한 옵션에 대해 값을 설정하는 방법에 대한 자세한 내용은 캐릭터 속성을(를) 참조하십시오.

단계 6: 솔버 시작

HumanIK 역운동학 솔버를 시작하려면 HIKSolveForEffectorSet 함수를 호출합니다. 이 함수에는 다음 인수가 필요합니다.

예를 들면 다음과 같습니다.

HIKSolveForEffectorSet (MyChar, MyCharState, MyEffectorSet, MyPropertySet);

단계 7: 생성된 HIKCharacterState 검색

역운동학 솔버가 인수로 전달한 동일한 HIKCharacterState에 캐릭터에 대해 생성한 자세를 저장합니다. 이 HIKCharacterState에서 각 노드의 변환, 방향, 배율 조정을 검색하고 게임 엔진 캐릭터에 다시 적용해야 합니다.

HumanIKHIKCharacterState에서 노드의 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 

각 노드에 대해 검색된 값을 게임 엔진에서 캐릭터의 해당 관절에 다시 적용하는 것은 사용자에게 달려 있습니다.