2011年8月8日月曜日

IK使用時、限界値を超えてジョイントを伸ばす方法

■IKを入れた腕を、伸ばす方法
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 件のコメント:

コメントを投稿