歩く人型の多関節キャラを作ります。
腕の動きは簡単です。ただ振っているだけなのですから。問題なのは脚です。人が歩く時の動きを正確に考えようとすると頭がごちゃごちゃします。ここでは、「たぶんこんなもんだろう」という仮定で作ります。
脚の動きは上図のように変わっていくものとします(左脚に注目してください)。
- 初期状態(A)
上図のAの状態から始めます。左足を地面につけて右足を持ち上げようとしているところです。地面につけて体を支える方の脚を「軸足」と呼ぶことにします。この状態ではまだ両足とも地面についています。
接合部leg_joint.m.nの座標を(leg_joint_x.m.n , leg_joint_y.m.n)とします。mは0なら左脚、1なら右脚です。水平に対する角度をleg_joint_angle.m.nとします。各接合部間の距離は64ドットで、左脚の下部は地面に対して垂直であるとします(leg_joint_angle.0.1=90度)。leg_joint_angle.0.0は適当な値を決めます(例えば45度とします。小さくするほど大股に歩くことになります)。すると、leg_joint_.0.2を基準として他のすべての接合部の座標、角度を求めることができます。
まず左脚ですが、
leg_joint_x.0.1=leg_joint_x.0.2
leg_joint_y.0.1=leg_joint_y.0.2-64
leg_joint_x.0.0=leg_joint_x.0.1+(64*cos(180度+leg_joint_angle.0.0))
leg_joint_y.0.0=leg_joint_y.0.1+(64*sin(180度+leg_joint_angle.0.0))
となります。
右脚は地面に向かってまっすぐのびているものとします。右脚についてはまずleg_joint_angle.1.0を求め、それをもとに各座標を計算すればいいです。leg_joint_angle.1.0は図のdxとdyが分かればアークタンジェントで求められます。dy=leg_joint_y.0.2-leg_joint_y.0.0で、三平方の定理よりdx=√(128^2-dy^2)ですから、
leg_joint_angle.1.0=atan(dy/dx)
leg_joint_angle.1.1=leg_joint_angle.1.0
leg_joint_x.1.0=leg_joint_x.0.0
leg_joint_y.1.0=leg_joint_y.0.0
leg_joint_x.1.1=leg_joint_x.1.0+(64*cos(leg_joint_angle.1.0))
leg_joint_y.1.1=leg_joint_y.1.0+(64*sin(leg_joint_angle.1.0))
leg_joint_x.1.2=leg_joint_x.1.1+(64*cos(leg_joint_angle.1.1))
leg_joint_y.1.2=leg_joint_y.1.1+(64*sin(leg_joint_angle.1.1))
となります。
ロボットは右から左に向かって歩くものとし、出現時は画面右端より外のどこか適当な場所にいることにします。画面のサイズは640*480で、画面下端を地面とし、足の高さを32ドットとします。そこで、leg_joint.0.2の初期座標を、
leg_joint_x.0.2=640+64
leg_joint_y.0.2=480-32
とします。
- 脚をまっすぐにする(A→B)
ここから左脚に注目して書きます。leg_joint.0.2 , leg_joint.0.1の座標は固定したまま、leg_joint_angle.0.0を、90度になるまで徐々に増やしていきます。
- 前に倒す(B→C→D)
leg_joint.0.2の座標は固定したまま、leg_joint_angle.0.0 , leg_joint_angle.0.1を増やしていきます。反対側の脚が地面についたら(D)、次の状態に移ります。この時軸足が反対側の脚に変わります。
- 脚を持ち上げて前に出す(D→E→F)
ここまではleg_joint.0.2の座標を基準としてleg_joint.0.1 , leg_joint.0.0の座標を求めますが、ここから先はleg_joint.0.0を基準としてあとの2点の座標を計算します。leg_joint.0.0の座標はleg_joint.1.0と同じですから、右脚の動きに応じて左脚が持ち上がっていくことになります。上がりつつ、角度leg_joint_angle.0.0 , leg_joint_angle.0.1を小さくしていくと脚が前に出ます。
2つの角度が最初の値(leg_joint_angle.0.0=45度、leg_joint_angle.0.1=90度)になったらそれ以上変えません(F)。
左足が地面に着いたらAに戻って繰り返しです。
左脚は前に出た状態(A)から始まりますが、右脚は後ろに出た状態(D)から始まって同じ運動を行います。
arm_joint.0.0(=arm_joint.1.0)はleg_joint.0.0より112ドット高い位置にあるものとします。
arm_joint_x.0.0=leg_joint_x.0.0
arm_joint_y.0.0=leg_joint_y.0.0-112
腕が一度に動く角度をarm_dangleとします。
arm_dangle=-2
左腕の運動は
arm_joint_angle.0.0=arm_joint_angle.0.0+arm_dangle
arm_joint_angle.0.1=arm_joint_angle.0.1+arm_dangle
右腕の運動は
arm_joint_angle.1.0=arm_joint_angle.1.0-arm_dangle
arm_joint_angle.1.1=arm_joint_angle.1.1-arm_dangle
となります。軸足でない方の足が地面に着いた時に振る方向を反転します。
arm_dangle=-arm_dangle
arm_joint.0.0を基準として他の接合部の座標を求めます。
接合部の座標から各パーツの中心座標を求め、表示する手順は前回の講座と同様です。
[サンプルプログラムをダウンロード] (HSP Ver2.61+hspext.dll+hmm.dll用)
[サンプルプログラムをダウンロード] (HSP Ver3用)
人型のロボットが歩きます。
[目次へ]|[前へ]|[次へ]