스쿼시 및 늘이기 설정

스쿼시 및 늘이기를 설정하려면 캐릭터 탄성을 정의하는 캐릭터 속성 세트를 구성하고 필요한 해석 단계를 통해 HIKEffectorSetState를 설정해야 합니다.

단계 1: 해석 단계 설정

HIKSetIKSolvingStep() 함수를 호출하여 HIKEffectorSetState에서 해석 단계를 설정할 경우 스쿼시 및 늘이기 엔진에서 처리되도록 하려는 팔 다리에 따라 HumanIK 솔버에 제공하는 HIKEffectorSetState에 다음 단계 중 일부나 모두를 포함해야 합니다.

IK 해석 단계에 대한 자세한 내용은 선택한 몸체 부분 해석을(를) 참조하십시오.

팔 및 다리

팔과 다리에 대한 스쿼시 및 늘이기는 다음 해석 단계에서 수행됩니다.

  • HIKSolvingStepRightArmSnS
  • HIKSolvingStepLeftArmSnS
  • HIKSolvingStepRightLegSnS
  • HIKSolvingStepLeftLegSnS

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

HIKSetIKSolvingStep(MyEffectorState, HIKSolvingStepAllParts |
                                     HIKSolvingStepLeftArmSnS | 
                                     HIKSolvingStepRightArmSnS);

HIKSolvingStepAllPartsHIKSolvingStepAll 단계에는 이러한 해석 단계가 없습니다.

척추와 목

척추 및 목에 대한 스쿼시 및 늘이기는 HIKSolvingStepSpineHIKSolvingStepHead 해석 단계에서 각각 수행됩니다.

HIKSolvingStepAllPartsHIKSolvingStepAll 단계에 이러한 해석 단계가 포함되어 있습니다. 이러한 해석 단계 중 하나를 사용할 경우 HIKSolvingStepSpine 또는 HIKSolvingStepHead 단계를 명시적으로 지정하지 않아도 됩니다. 따라서 캐릭터의 척추와 목에 대해 항상 스쿼시 및 늘이기가 평가되지만 아래 3단계에 설명된 것처럼 척추 또는 목에 대해 늘이기 도달도 설정해야만 효과가 적용됩니다.

단계 2: 관절 체인의 변환 도달 구성

스쿼시 및 늘이기 엔진에서 관절 체인을 적용하려면 해당 관절 체인 끝에 있는 이펙터에 양의 값의 변환 도달이 적용되어야 있어야 합니다. 관련된 이펙터는 다음과 같습니다.

역운동학 해석을 수행하는 경우 역운동학 솔버에 전달하는 HIKEffectorSetState에 이 변환 도달을 설정해야 합니다. 역운동학 해석을(를) 참조하십시오.

대상 변경을 수행하는 경우 대상 캐릭터의 대상 변경 솔버에 전달하는 HIKPropertySetState에 이 변환 도달을 설정해야 합니다. 대상 변경 해석대상 변경 관련 속성을(를) 참조하십시오.

단계 3: 관절 체인의 늘이기 도달 구성

캐릭터의 팔 다리 중 한 끝에 있는 이펙터에 변환 도달을 적용할 경우 HumanIK에서는 여러 가지 다양한 전략을 사용하여 요구 사항을 충족하면서 원하는 위치에 해당 노드를 배치할 수 있습니다. 따라서 팔꿈치 및 무릎에 대해 구성된 저항 값에 따라 팔 다리를 구부리거나 펼 수 있고, 이펙터에 당기기도 적용된 경우 당기기 엔진을 사용하여 몸체의 나머지 부분이 최종 위치에 영향을 줄 수 있도록 설정할 수 있으며, 또는 팔 다리를 스쿼시하고 늘릴 수 있습니다.

역운동학 솔버는 캐릭터 속성 세트를 사용하여 각 관절 체인에 대한 "늘이기 도달"을 정의합니다. 이 늘이기 도달을 통해 몸체의 나머지 부분을 당기는 등의 다른 전략과 관련하여 스쿼시 및 늘이기 엔진이 최종 솔루션에 영향을 미치는 정도가 결정됩니다.

다음 캐릭터 속성을 사용하여 스쿼시 및 늘이기에 의해 영향을 받을 수 있는 각 관절 체인에 대해 늘이기 도달이 독립적으로 구성됩니다.

관절 체인에 대한 늘이기 도달을 설정하려면 해당 속성을 원하는 백분율로 설정합니다. 예를 들면 다음과 같습니다.

단계 4: 관절 체인의 자유도 구성(선택적)

HumanIK에서 각 관절 체인에 적용할 수 있는 스쿼시 및 늘이기 양을 최대로 구성할 수 있습니다. "자유도"는 척추와 목에 대해서가 아닌 팔과 다리에 대해 다르게 해석되는 캐릭터 속성 세트에 의해 결정됩니다.

관련된 캐릭터 속성에 기본값이 사전 설정되어 있으므로 이 단계는 선택적으로 표시됩니다. 이러한 기본값을 보려면 일반 속성에서 해당 속성 설명을 참조하십시오.

팔 및 다리

팔과 다리는 원래 길이보다 더 짧게 스쿼시되지 않으며 늘이기만 가능합니다. 늘이기의 자유도는 두 가지 백분율 값에 의해 결정됩니다.

  • 이펙터를 원하는 위치에 배치하기 위해 팔 다리 늘이기를 시작할 수 있는 원래 길이의 백분율. 이는 HIKStretchStartArmsAndLegs 캐릭터 속성을 통해 팔과 다리 모두에 대해 정의됩니다.
  • 팔 다리가 자유롭게 늘이기를 중지하는 원래 길이의 백분율. 이는 HIKStretchStopArmsAndLegs 캐릭터 속성을 통해 팔과 다리 모두에 대해 정의됩니다.

이 제한은 상황에 따라 변할 수 있으며, "순간적으로 이동"하는 것을 막기 위해 팔 다리가 거리 목표점에 도달할 때까지 이 제한 값을 지나 늘이기를 계속 수행합니다. 하지만 이 임계값이 경과된 후에는 팔 다리에 적용되는 늘이기 양이 기하급수적으로 감소합니다.

팔이나 다리에 대한 자유도를 설정하려면 이러한 속성 각각을 원하는 백분율로 설정합니다. 예를 들면 다음과 같습니다.

HIKSetPropertyValue(MyPropertyState, HIKStretchStartArmsAndLegs, 0.96);
HIKSetPropertyValue(MyPropertyState, HIKStretchStopArmsAndLegs, 1.04);

척추와 목

척추와 목의 자유도는 각 노드에 대해 지정한 변환 제한에 의해 결정됩니다. 이러한 제한은 각 노드가 부모 노드에 대해 얼마나 가까이 스쿼시될 수 있는지와 각 노드를 부모 노드에서 얼마나 멀리 늘일 수 있는지를 결정합니다. 이러한 제한은 부모 노드에서 원래 변환의 백분율 값(예: 각 노드로 연결되는 골격의 원래 길이)으로 표현됩니다.

HIKSetTranslationLimitsf() 또는 HIKSetTranslationLimitsd() 함수를 호출하여 척추 또는 목의 각 노드에 대해 이러한 제한을 설정할 수 있습니다.

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

f_minSnSTranslation = 0.92f;
f_maxSnSTranslation = 1.08f;
b_isActive = true;
HIKSetTranslationLimitsf(MyHIKCharacter, Spine1NodeId, f_minSnSTranslation, f_maxSnSTranslation, b_isActive);

척추 자식

척추의 자식 노드에서 척추에 적용되는 압축 또는 확장 백분율을 반영하도록 역운동학 솔버를 구성할 수 있습니다. 캐릭터 골격이 구성되는 방법과 해당 메시의 스킨 처리 방식에 따라 상체의 비율을 유지할 수 있습니다.

영향을 받는 노드는 다음과 같습니다.

척추에서 이러한 자식 노드로 스쿼시 및 늘이기를 전파하는 것은 HIKSnSScaleSpineChildren 속성에 의해 결정됩니다. 다음과 같이 이 속성을 원하는 백분율로 설정합니다.

HIKSetPropertyValue(MyPropertyState, HIKSnSScaleSpineChildren, 0.6);

단계 5: 관절 체인의 배율 구성(선택적)

기본적으로 스쿼시 및 늘이기 솔버는 노드의 변환 및 회전을 조작하여 캐릭터의 팔 다리 길이를 변경합니다. 대신, 팔 다리에 있는 노드의 배율을 변경하여 팔 다리 길이의 변경 사항 중 일부나 전부를 적용하도록 역운동학 솔버를 구성할 수 있습니다. 캐릭터의 스키닝에 따라 이 방법은 스쿼시 또는 늘이기로 인해 캐릭터의 비율이 변경되는 것을 오프셋하는 데 도움이 될 수 있습니다.

역운동학 솔버는 캐릭터 속성 세트를 사용하여 각 관절 체인의 배율 백분율을 정의합니다.

배율은 다음 캐릭터 속성을 사용하여 구성됩니다.

관절 체인에 대한 배율 조정 값을 설정하려면 해당 속성을 원하는 백분율로 설정합니다. 예를 들면 다음과 같습니다.

HIKSetPropertyValue(MyPropertyState, HIKSnSScaleArmsAndLegs, 0.4);