Expressionを構築します。
以下は腕のジョイントにIKを張る場合
肩と手首にロケータを貼って、DistanceToolでつなげます。
この際、肩ロケーターは肩の位置と一致しなければならないので、肩ジョイント階層にいれてしまう or コンストレインで肩に追従させます。
また、手首ロケーターはIKに追従させなければならないので、IK階層 or コンストレインでIKコントローラーに追従させます。
基本となる構文↓
if (DistanceToolの距離 <= 肩と手首の距離 ) { shoulder.scaleY=1;} else { shoulder.scaleY=(DistanceToolの距離 / 肩と手首の距離)
となるので、これを伸ばしたいジョイントを選択してExpressionとして作成することになります。
ようは距離がジョイントの最長以下ではスケールは1、それを超える場合は伸びた倍率でスケールが増える、ということですね。
※DistanceToolの距離 :distanceDimensionShape1.distance (ディスタンスツールの名前です。複数あるとShape数などが変わりますので注意)
※肩と手首の距離 :Distance Toolで表示される、腕が伸びきった時の値
※Shoulder.scaleY : 適用するジョイントの名前と、そのジョイントが伸びる方向のスケールです。
これらの事を考慮した上で、腕であれば一般的に肩から手首にIKを入れるので、shoulderとelbowの2つのジョイントにExpressionを入れる事になります。よって肩と手首の距離が25.250674、スケールがXに伸びる場合↓
shoulderジョイントへのExpression構文
if (distanceDimensionShape1.distance <= 25.250674) { shoulder.scaleX = 1; } else { shoulder.scaleX = (distanceDimensionShape1.distance / 25.250674) ; }
elbowジョイントへのExpression構文
if (distanceDimensionShape1.distance <= 25.250674) { elbow.scaleX = 1; } else { elbow.scaleX = (distanceDimensionShape1.distance / 25.250674) ; }
を適用すると腕が限界値を超えた時のみ伸びるようになります。
0 件のコメント:
コメントを投稿