Excel VBA で棒人間がラジオ体操をする エクセルアニメーション のその3です。
その2の内容はこちら↓

今回は、頭・両腕・両足をすべて合体させ、「棒人間が自然に全身運動をする」基本動作の最終編です。
ステップ1:両足を地面につけた動きの実装
前回の記事では「片足」の足先を固定して動かしました。今回はこれを進化させて、「両足の足先」を地面にガッチリ固定します。
両足の足先の座標を地面に固定しておくと、「腰(お腹)の位置を下げるだけで、勝手に両膝が自然に折れ曲がって綺麗な姿勢になる」という、IK(逆運動学)ならではの挙動を出せます。
順番に見ていきます。下図は、胴体と両足のモデルが直立したものです。

この状態で、右に胴体を少し回転させるとします。このとき、左足(画面では右側)のみにIK(逆運動学)を対応させると下図のような動きになってしまいます。

当然ながら不自然な動きです。もう一方の右足にもIK対応させると、両膝が折れ曲がる自然な動きになります。なお、正面向きなので、膝の曲がる方向は左右対称(ミラー)にしています。

動画で見た方が一発でわかりますかね。下の動画をごらんください。
ステップ2:頭部・胴体の連動(回転行列の活用)
次に胴体と頭部を連動させます。
体をユラユラと揺らすときに、ただ胴体の四角形を傾けるだけだと、首の付け根の位置がズレてしまい、ホラー映像になってしまいます。胴体と首を連動させるには、「回転行列」を使って首や頭の中心位置を出してやる必要があります。
回転行列の話は、やりだすとまた難しくなってしまうので、とりあえず以下の数式を使っているとだけ記しておきます。
Excelの画面座標系(原点が左上、右が X のプラス、下が見かけ上の Y のプラス)において、中心 (CenterX, CenterY) 周りに角度θ(ラジアン)だけ回転した位置にある相対座標(x, y) を絶対座標 (X’, Y’) に変換する式は以下のようになります。

首の付け根の位置を胴体の中心から真上とすると、初期位置は x = 0 , y = -(胴体の長さの2分の1) というようになります。
ここから胴の回転と同時に首、頭の位置を求めていくのですが、さらに体の傾きに合わせて、首の角度も少しだけオーバーに追従させるようにしました(例:体が左に傾くときは、首も少しだけ余計に左へ倒れる)。特に体操だとそうしますよね。これにより、重心移動に伴う「自然な揺れやしなり」を表したつもりです。
理屈は眠くなりますね。動きを見ていただきましょう。次のようになりました。
ステップ3:腕と手(上腕・前腕)の連結
足と首の動きができましたので、最後に「腕と手」のパーツを組み込みます。ここでも「回転行列」と「IK(逆運動学)」を使います。
「肩」の位置を胴体に連動させる
腕のスタート地点である「肩」の位置決めは、首の付け根と同じです。 ステップ2で使った回転行列を活用して、「胴体の傾きに合わせて、肩の位置が常に胴体(長方形)の角の座標である」計算を行います。回転行列を使わないといけないのは、長方形(shape)を回転した際の角の座標は shape のプロパティの shp.Left や shp.Top では取れないからなのです。わかりにくいですね。下記の図を見ていただいて、点線囲み(バウンディングボックス)の左上の位置になってしまう、ということです。

なので、新しい角の座標は元の位置の座標から、回転行列を使って求める、ということになります。
「肘(ひじ)」の曲がり
肘の曲がり位置(座標)は、「手先」の位置を決めれば、IKにより計算できます。(その2)の足の「膝(ひざ)」の計算と同じ方法です。 肩から手先までの距離に応じて、肘を自然な角度折り曲げることができます。(が、向きに注意しないと腕が折れてしまうことになります)
「慣性(しなり)」を少しだけ加える
人間が体を揺らすとき、手は体より「ほんの少し遅れて」ついていくのが自然です(ブランブランと揺れる振り子の運動と同じ)。
胴体の傾きに対して、腕や手先の角度を少しだけ遅らせて追従させると、カチコチのロボット感ではなく、しなやかでリアルな「生きている腕」を表すことができます。
これらを全て組み込みますと、次の動きになります。記載したことがおわかりいただけますかね?
ステップ4:裏で仕掛けた2つの工夫
ステップ3までで目指した動きが実現できたのですが、実は、その他にコード内に2つの重要な工夫をしています。これがないとどうなってしまうのか、実際の失敗例と合わせて解説します。
- ①画面更新の制御 …
コード中に、Application.ScreenUpdatingやSleepを入れない場合、図形を描き直すたびに画面が激しく点滅(フリッカー)してしまいます。入れないと、下の動画のようになります。
②動きのタイミングで前の図形(shape)の削除と再描画 … Excelの図形(Shape)は、座標を更新するだけでは前のコマの図形が画面に残り続け、黒い残像(ゴースト現象)になってしまいます。そのため、新しいコマを描画する直前に 古いパーツを完全に消去しています。これを怠ると、下の動画のように画面に残像が残り、おどろおどろしいものになります。
おわりに:ただの「図形」を生き物のように動かす
ここまで読んでいただきありがとうございました!まとめるのに思った以上に時間がかかってしまいました。
「余弦定理」や「三角関数」といった数学の内容をVBAに組み込むと、Excelの無機質なShape(図形)を、生命があるかのように滑らかに動かせる原理をおわかりいただけたのではないでしょうか。
次回以降は、いよいよ「ラジオ体操」の動きをVBAで再現していきたいと思います。いろんな動きがありますので、曲の最初から取り組むのか、または、各動きをパネル化し、出来た分をはめ込んでいくのか検討中です。いずれにせよ、できたところから少しずつ公開していく予定です。特殊な作り方をした場合は解説を加えることも検討しますが、その場合は別ページにしますかねぇ。
それでは、またしばらくお待ちください。
コメント