🥋 チート900を数式で動かす
STAGE 8 ― ならすと何が変わる ―
クリア 0 / 9
STAGE 8

ならすと何が変わる

時間方向のフィルタ
🎯 ミッション
前後のコマとの重みつき平均で動きのぶれをならす計算を身につけよう。ならしすぎると蹴りのいちばん高い所が下がること、過去のコマだけを使うと動きが遅れること、点ごとにならすと骨の長さが変わってしまうことを説明でき、向きだけをならす直し方がわかれば合格。
未達成
ねこ博士
チート900の動きは、もとは動画から1コマずつ体の点の位置を読み取って作った。ところが、読み取った位置は毎コマ少しずつぶれる。服のしわや影、手足の重なりで、読み取りが数 cm ずれるんだ。そのまま並べると、つま先の通り道がガタガタに波打ってしまう。前に「上から見ると蹴りの軌道が波打つのはなぜ?」と聞かれたのも、このぶれが原因の一つだった。
うさ美
1コマずつ少しずつずれているなら、前後のコマと平均すれば、ずれが打ち消し合いそうです。
ねこ博士
その通り。いちばん簡単なのは、そのコマと前後2コマずつ、合わせて5コマの値を足して5で割る方法だ。これを移動平均という。ずれが右へ出たり左へ出たりでたらめなら、平均するとずれが打ち消し合って小さくなる。ただ、5コマを同じ重さで扱うより、近いコマを重く、遠いコマを軽く扱うほうが自然だ。そこで、重さを釣り鐘の形に並べる。コマの差を d として、重さを次の式で決め、重さの合計で割る。σ(シグマ)は釣り鐘の幅で、σ コマ離れると重さは約 0.61 倍、2σ 離れると約 0.14 倍になる。この重さの並びをガウスフィルタという。ステージ6の重心と同じ、重みつき平均だね。
重さ:w(d) = e−d² ÷ (2σ²) ならした値:Σ w(d) x(k+d) ÷ Σ w(d)
うさ美
重さを使った平均なら、ステージ6で何度もやりました。σ を大きくすると、遠くのコマまで平均に入るので、よりなめらかになるんですね。
ねこ博士
下の図で、頭を上から見た通り道に、読み取りのぶれをわざと足してみた。σ を変えて、ならし方を確かめよう。
構えから着地まで、頭(両耳の真ん中)の通り道を上から見た図(下が進行方向、右が的の方向)。黒い点線がもとの動き、灰色が読み取りのぶれを足したもの、青がならしたもの。右下の釣り鐘がガウスフィルタの重さ
うさ美
σ が 3 コマくらいで、ガタガタがほとんど消えました。でも σ を 8 まで大きくすると、青い線がもとの点線から離れて、差が 5 cm 以上になってしまいます。
ねこ博士
そこが大事な点だ。ならすというのは、近くのコマと混ぜることだから、とがった所は丸くなる。いちばん高く上がった瞬間も、前後のまだ低いコマと混ざって、引き下げられる。蹴り技でいちばん見せたいインパクトが、ならしすぎると弱く見えてしまうんだ。もう一つ、ゲームのように、いまのコマを見せる時点で過去のコマしか使えない場合はどうなるだろう。
横軸は時間、縦軸はつま先の高さ。黒い点線がもとの動き、青がならしたもの。縦の線はインパクト(1.32 秒)。下の釣り鐘は、いまのコマ(縦線)の値を作るのに使う重さ
うさ美
過去のコマだけ使うと、青い線全体が右へずれました。いちばん高い所が遅れて、しかも低くなっています。
ねこ博士
過去のコマの平均は、いつも少し前の値に引っぱられるからだ。アニメーションを作るときは、全部のコマがもう手元にあるので、前後のコマを使って遅れをなくせる。ゲームやロボットのように、その場で計算しなければならない場合は、この遅れとどうつき合うかが大きな問題になる。
うさ美
体の点をそれぞれ、いまのやり方でならせばいいんですよね? 膝も足首も、同じようにならせば……。
ねこ博士
そこに落とし穴がある。膝と足首を別々にならすと、ある瞬間の膝は少し前のコマ寄り、足首は少し後ろのコマ寄りに引っぱられることがある。そうすると、膝から足首までの長さ、つまりすねの長さが毎コマ変わってしまう。ゴムのように伸び縮みする脚になるんだ。そこで、位置ではなく骨の向き(長さ1のベクトル)をならし、ならした向きの先に、決まった長さの骨をつなぎ直す。股関節から順に「向き × 長さ」を足していけば、骨の長さは毎コマぴったり同じになる。下の図で、3つのならし方を比べてみよう。3つ目はこのあと説明する。
上が蹴り脚のすねの長さ(cm)、下が膝の角度(180° でまっすぐ)。黒い点線がもとの動き。赤=膝と足首の位置をそれぞれならす、オレンジ=太もも・すねの向きを骨ごとにならす、緑=股関節から足首への向きだけならし、膝の角度はそのままにしてIKで膝を置き直す。縦の線はインパクト
うさ美
位置をならした赤い線は、蹴りの瞬間のあたりで何 cm も短くなっています。オレンジは長さが一定ですが、下のグラフを見ると、インパクトで伸びきっていた膝が曲がってしまっています。緑は、長さも膝の角度も、もとのままです。
ねこ博士
蹴りの瞬間は脚が速く大きく振られるので、前後のコマとの差が大きく、位置を混ぜると「近道」をして脚が縮むんだ。円の上の2点の真ん中が、円の内側に入ってしまうのと同じだよ。骨ごとに向きをならすと、長さは守れるが、太ももとすねの向きがそれぞれ別のコマと混ざって、膝の曲がり具合が変わる。そこで実際には、緑のやり方をとった。股関節から足首へ向かうベクトルを「向き × 距離」に分け、向きだけをならす。距離はそのままだから、ステージ5の余弦定理で膝の角度も変わらない。膝の位置は2関節IKで置き直せばいい。
体全体の向き(腰の向き)は、ステージ4の四元数でならした。そのときの注意点は、四元数 q と −q が同じ向きを表すことだ。向きのほかに、体全体の向き(腰の向き)は、ステージ4の四元数でならした。そのときの注意点は、四元数 q と −q が同じ向きを表すことだ。
うさ美
符号が逆の四元数をそのまま平均すると、足して打ち消し合って、0 に近くなってしまいます。
ねこ博士
そう。だから平均する前に、となりのコマの四元数との内積を調べて、マイナスなら符号を反対にしてそろえる。そのうえで重みつき平均をとり、長さを1に戻す。向きの小さな違いなら、これでなめらかな向きが得られる。上から見た蹴りの軌道の波も、最後は腰の向きのぶれをこうしてならし、脚は股関節から足首への向きだけをならすことで、骨の長さも膝の曲げ方も変えずに消すことができた。
【このステージの成果】 ガウスフィルタ:ならした値 = Σ w(d)・x(k+d) ÷ Σ w(d)、w(d) = e−d²÷(2σ²)。σ が大きいほどなめらか ならすと、とがった所(インパクトの届く距離・高さ)は丸く小さくなる。過去のコマだけ使うと遅れる 点ごとに位置をならすと骨の長さが変わる → 股関節から足首への向きだけをならし、距離(=膝の角度)はそのまま、IKで膝を置き直す 四元数は q と −q が同じ向き。符号をそろえてから平均し、長さを1に戻す

確認クイズ

Q1. 5コマの値が 0, 0, 10, 0, 0 と並んでいる。真ん中のコマを、5コマの移動平均(同じ重さ)でならすといくつ?

Q2. 膝と足首の位置を、それぞれ別々にならした。変わってしまうおそれがあるのは?

Q3. 腰の向きを表す四元数を、前後のコマと平均するときに必要なことは?

← トップへ