Squash ’n’ Stretch の設定には、キャラクタの弾性を定義するキャラクタのプロパティのセットの構成と、必要なソルバ ステップを使用した HIKEffectorSetState の設定が必要です。
HIKSetIKSolvingStep() 関数を呼び出して HIKEffectorSetState のソルバ ステップを設定する場合、Squash ’n’ Stretch エンジンによって扱う四肢に応じて、HumanIK ソルバに設定する HIKEffectorSetState に、次のステップのいずれかまたはすべてを含める必要があります。
IK ソルバ ステップに関する詳細は、「選択されたボディ パーツをソルビングする」を参照してください。
腕および脚の Squash ’n’ Stretch は、次のソルバ ステップによって実行されます。
HIKSetIKSolvingStep(MyEffectorState, HIKSolvingStepAllParts | HIKSolvingStepLeftArmSnS | HIKSolvingStepRightArmSnS);
これらのソルバ ステップは、HIKSolvingStepAllParts および HIKSolvingStepAll ステップには含まれないことに注意してください。
脊椎および首の Squash ’n’ Stretch は、それぞれ HIKSolvingStepSpine および HIKSolvingStepHead ソルバ ステップによって実行されます。
これらのソルバ ステップは、HIKSolvingStepAllParts および HIKSolvingStepAll ステップに含まれることに注意してください。これらのソルバ ステップのいずれかを使用する場合、HIKSolvingStepSpine または HIKSolvingStepHead ステップを明確に指定する必要はありません。したがって、Squash ’n’ Stretch は、常にキャラクタの脊椎および首に対して値を求められますが、脊椎または首のストレッチ リーチも下のステップ 3 で指示されているように設定しない場合は、効果がありません。
Squash ’n’ Stretch エンジンがジョイント チェーンに適用されるようにするには、そのジョイント チェーンの最後のエフェクタで、それに適用される Reach Translation が有効な値である必要があります。関係のあるエフェクタは次のとおりです。
インバース キネマティクス ソルバを実行している場合、インバース キネマティクス ソルバに渡す HIKEffectorSetState に、この Reach Translation を設定する必要があります。詳細は、「インバース キネマティックス ソルバ」を参照してください。
リターゲット ソルバを実行している場合、ターゲット キャラクタのリターゲット ソルバに渡す HIKPropertySetState に、この Reach Translation を設定する必要があります。詳細については、「リターゲットのソルビング」と「リターゲットに固有のプロパティ」を参照してください。
Reach Translation をキャラクタの四肢の最後のエフェクタに適用する場合、要件を満たし、対応するノードを希望する位置に移動するために、HumanIK では複数の異なる方法を使用することができます。これにより、四肢を(肘および膝に対して構成することができる Resist に従って)曲げたり伸ばしたりすることができ、Pull エンジンを使用して、残りのボディが最終的な位置に影響を及ぼすようにすることができます(Pull もエフェクタに適用される場合)。また、四肢をスカッシュおよびストレッチすることができます。
インバース キネマティクス ソルバでは、キャラクタのプロパティのセットを使用して、各ジョイント チェーンの "ストレッチ リーチ" を定義します。このストレッチ リーチにより、残りのボディの引き寄せなどのその他の方法に関連して、Squash ’n’ Stretch エンジンが、最終的なソリューションにどれくらい強く影響を及ぼす必要があるかが決定されます。
ストレッチ リーチは、次のキャラクタのプロパティを使用して、Squash ’n’ Stretch によって影響を受ける可能性がある各ジョイント チェーンに対して別々に構成されます。
ジョイント チェーンのストレッチ リーチを設定するには、対応するプロパティを希望するパーセンテージに設定します。例:
HIKSetPropertyValue(MyPropertyState, HIKSnSReachLeftWrist, 1.0);
HumanIK により各ジョイント チェーンに適用することができる、スカッシュおよびストレッチの最大値を構成することができます。この "自由度" は、キャラクタのプロパティのセットによって決定され、腕および脚に対して、脊椎および首に対する解釈とは異なる解釈が行われます。
関連するキャラクタのプロパティは、異なる値がプリセットされるため、このステップは、オプションとしてマークが付けられます。これらのデフォルトについては、全般プロパティで対応するプロパティの説明を参照してください。
腕および脚が元の長さより短くスカッシュすることはなく、ストレッチするだけです。ストレッチする自由度は、2 つのパーセンテージ値により決定されます。
これは "ポッピング" を避けるには甘い制限であり、遠いゴール ポイントに達するために、四肢はこの制限を超えてストレッチを続けます。ただし、このしきい値を過ぎたら、四肢に適用されるストレッチの量は急激に減少します。
腕または脚の自由度を設定するには、これらのプロパティのそれぞれを希望するパーセンテージに設定します。例:
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);
インバース キネマティクス ソルバを構成して、脊椎の子ノードで脊椎に適用される圧縮および拡張のパーセンテージを反映することができます。キャラクタのスケルトンが構築される方法と、メッシュがスキニングされる方法に応じて、上半身のプロポーションを保持することができます。
脊椎からこれらの子ノードへの Squash ’n’ Stretch の伝達は、HIKSnSScaleSpineChildren プロパティにより決定されます。次のように、このプロパティを希望するパーセンテージに設定します。
HIKSetPropertyValue(MyPropertyState, HIKSnSScaleSpineChildren, 0.6);
デフォルトにより、Squash ’n’ Stretch ソルバは、ノードのトランスレーションおよび回転を操作することにより、キャラクタの四肢の長さを変更します。代わりに、インバース キネマティクス ソルバを構成して、四肢のノードのスケールを変更することにより、四肢の長さの変更の一部またはすべてを適用することができます。これは、キャラクタのスキニングに応じて、スカッシュまたはストレッチによって起きるキャラクタのプロポーションの変更をオフセットするのに役立ちます。
インバース キネマティクス ソルバでは、キャラクタのプロパティのセットを使用して、各ジョイント チェーンのスケールのパーセンテージを定義します。
スケールは、次のキャラクタ プロパティを使用して構成されます。
ジョイント チェーンのスケール値を設定するには、対応するプロパティを希望するパーセンテージに設定します。例:
HIKSetPropertyValue(MyPropertyState, HIKSnSScaleArmsAndLegs, 0.4);