🥋 チート900を数式で動かす
STAGE 9 ― 動画に重ねる ―
クリア 0 / 9
STAGE 9

動画に重ねる

投影と最小二乗
🎯 ミッション
3Dの点を画面に写す投影の式を説明し、写すと奥行きが消えることを確かめよう。誤差の2乗の合計をいちばん小さくする最小二乗法で、いくつかの条件に重みをつけてつり合いをとり、動画に重ねながら他の向きから見た形を守る方法がわかれば合格。
未達成
ねこ博士
いよいよ最後のステージだ。チート900のアニメーションは、もとの動画とぴったり重なるように調整した。そのためには、3Dの体を、動画を撮ったカメラから見た画面の上に写す計算が要る。これを投影という。実は、ステージ1からずっと使ってきた3Dの図も、毎回この計算で画面に写しているんだ。
うさ美
どうやって写すんですか? 3つの数 (x, y, z) を、画面の2つの数にするんですよね。
ねこ博士
カメラには3本の向きがある。画面の右へ向かう向き r、上へ向かう向き u、カメラが見ている奥への向き f。どれも長さ1で、互いに直角だ。カメラの位置を E、写したい点を P として、d = P − E とする。ステージ2の内積を使えば、d がそれぞれの向きにどれだけ進んでいるかがわかる。そして、遠い物ほど小さく見えるので、奥行き c で割る。焦点距離は、カメラのレンズで決まる拡大の倍率だと思えばいい。
カメラから点へ:d = P − E 3本の向きとの内積:右へ a = d・r、 上へ b = d・u、 奥へ c = d・f 画面の位置:(焦点距離 × a ÷ c, 焦点距離 × b ÷ c)
うさ美
奥行き c で割るということは、カメラから2倍遠い所にある、2倍大きい物は、同じ大きさに写るんですね。
ねこ博士
その通り。それが今日の大問題につながる。点 P をカメラから見たまっすぐな線、つまり光の通り道に沿って動かすと、a、b、c が同じ割合で変わるから、a ÷ c と b ÷ c は変わらない。画面の上ではまったく動かないんだ。下の図で、蹴り脚の膝から下を、それぞれの光の通り道に沿って奥へ動かしてみよう。
左=動画のカメラから見た画面、右=目標側(正面)から見た図。赤い線が蹴り脚の、もとの位置(薄い色)と動かした位置(濃い色)。点線はカメラからの光の通り道(右の図)。蹴り脚の膝・足首・かかと・つま先を、それぞれの光の通り道に沿って同じ距離だけ動かしている
うさ美
左の画面では脚がまったく動かないのに、右の正面から見た図では、脚が大きく前後にずれます。しかも、太ももの長さまで変わってしまいました。
ねこ博士
そう。動画1本からは、奥行きが決まらないんだ。動画の上で重なるだけなら、脚は光の通り道のどこにあってもいい。最初に動画に合わせたとき、正面から見た形が大きく変わってしまったのは、この奥行きをでたらめに決めてしまったからだった。そこで、動画に重ねること以外にも条件を加えて、「いちばんよい」位置を1つに決める。そのときに使うのが最小二乗法だ。まず簡単な例から。ある長さを3回測って、2 cm、3 cm、7 cm だったとする。本当の長さとしていちばんよいのは、いくつだろう?
うさ美
平均の 4 cm でしょうか。でも、「いちばんよい」はどう決めるんですか?
ねこ博士
答えの候補を x として、測った値とのずれ x − 2、x − 3、x − 7 を考える。ずれはプラスにもマイナスにもなるから、2乗して足したものを「ずれの大きさ」とし、これがいちばん小さくなる x を選ぶ。これが最小二乗法だ。下の図で x を動かして、S がいちばん小さくなる所を探してごらん。
ずれの2乗の合計:S(x) = (x − 2)² + (x − 3)² + (x − 7)²
上の数直線の茶色の点が測った値、ピンクの線が候補の値 x。測った値の上の正方形は、ずれの大きさを1辺とする正方形で、面積が「ずれの2乗」。下のグラフは合計 S(x)。いちばん低い所は x = 4(3つの平均)
うさ美
x = 4 で S が 14 になって、いちばん小さくなりました。S(x) を展開すると 3x² − 24x + 62 で、3(x − 4)² + 14 と書き直せるので、x = 4 のとき最小です。ちゃんと平均になっています。
ねこ博士
見事だ。2乗の合計を最小にすると、自然に平均が出てくる。ステージ6の重心も、ステージ8のフィルタも、重みつき平均だったね。実は、重みつき平均は、重みつきの2乗の合計 Σ w(x − xᵢ)² を最小にする答えでもある。いままで出てきた平均は、全部この考え方でつながっているんだ。
アニメーションを動画に重ねたときは、毎コマ、体の点の位置を少しずつ動かしながら、4つの条件に重みをつけて足した量をいちばん小さくした。正面から見た図、つまり目標側から見た図には、的の方向の位置は写らない。正面の図にとっては、的の方向が「奥行き」なんだ。
重みつきの2乗の合計:S = 100 ×(動画の画面上のずれ)² + 60 ×(正面から見た形の変化)² + 3 ×(的の方向の位置の変化)² + 300 ×(骨の長さの変化)²
うさ美
数が大きい条件ほど、強く守られるということですか? 的の方向の変化は 3 と小さいので、正面から見えない向きには動かしてもよい、という意味でしょうか。
ねこ博士
その通り。動画のカメラは斜めから撮っているので、光の通り道は的の方向にも傾いている。だから、正面から見えない的の方向に点をずらせば、正面から見た形を変えずに光の通り道に乗せられる。骨の長さは変わってはいけないから、いちばん重い 300 にした。重みの大きさで、どの条件をどれだけ優先するかを決めるんだ。下の図は、1つの点だけで考えた小さな模型だ。上から見ていて、左下のカメラからの光の通り道(点線)の上に点を乗せれば、動画と重なる。もとの位置(黒)は通り道から外れている。
上から見た図。横向きが的の方向(正面から見た図には写らない)、縦向きが正面から見た図に写る向き。黒=もとの点、点線=左下のカメラから動画の点に向かう光の通り道、ピンク=合計 S がいちばん小さくなる点、灰色の楕円は S が同じ大きさになる線(等高線)。正面から見た形を変えない重みは 60 に固定
うさ美
的の方向の重みが 3 のときは、ピンクの点がほとんど横(的の方向)にだけ動いて、光の通り道に乗りました。その重みを 60 に上げると、ピンクの点は縦にも動いて、正面から見た形が変わってしまいます。
ねこ博士
そうだ。正面から見えない向きを自由にしておけば、正面から見た形をほとんど変えずに動画に重ねられる。実際のチート900では、この計算を24個の点と骨の長さの条件で、毎コマ行った。式が複雑なので、一度に答えは出せない。そこで「いまの位置から、S が小さくなる向きへ少しだけ動かす」をくり返して、S がそれ以上小さくならない所まで進める。この方法をくり返し計算(ここで使ったのはレーベンバーグ・マーカート法)という。こうして、正面から見た形の変化を平均 2 cm ほどに抑えたまま、動画にぴったり重ねることができたんだ。
うさ美
ベクトル、内積と外積、回転行列、四元数、IK、重心と放物線、角運動量、フィルタ、そして最小二乗法。ひとつのキックのアニメーションに、こんなにたくさんの数学が使われていたんですね。
ねこ博士
どれも、ばらばらの道具ではない。「矢印を足す・測る・回す」と「重みつきで平均する」の2つが、形を変えて何度も出てきた。ゲームやロボット、映画のCGでも、中で動いているのは同じ道具だ。次に3Dの動きを見たら、どんな計算が隠れているか、想像してみてほしい。
【このステージの成果】 投影:d = P − E、a = d·r、b = d·u、c = d·f、画面の位置 = (焦点距離 × a ÷ c, 焦点距離 × b ÷ c) 光の通り道に沿って動かしても画面上は動かない → 動画1本からは奥行きが決まらない 最小二乗法:ずれの2乗の合計 S = Σ (x − xᵢ)² を最小にする。答えは平均(重みつきなら重みつき平均) 条件ごとに重みをつけて足し、S を最小にする。正面から見えない向き(的の方向)の重みを小さくすれば、正面から見た形を守ったまま動画に重ねられる

確認クイズ

Q1. 3Dの点を、カメラからの光の通り道に沿って奥へ動かした。カメラの画面の上で、点の位置はどうなる?

Q2. 3回測って 2、3、7 だった。ずれの2乗の合計 S(x) = (x−2)² + (x−3)² + (x−7)² がいちばん小さくなる x は?

Q3. 動画に重ねるとき、「正面から見た形を変えない」という条件も加えたのはなぜ?

← トップへ