かなりふつう

ヾ( ゚д゚)ノ゙

【SlideCameraWork】理論を実装に変える話2

 一番難しいのは、理論を実際の動作へ落とし込むことです。EXCELだって、1行おきに
1、2、3と入力するのは簡単ですが、その理論をプログラムに落とし込んで、自動で1000まで、
2000行の入力を一瞬でやってくれるようにするには、意外にできないものです。

 いわゆる「動くアルゴリズム」ができてこそ、モノづくりと言えます。高尚な理論や理想ばかりを
語る人よりも、稚拙なオモチャでもいいから実際に動くモノにしてみて下さい。そういう人の方が
「できる」人だと思いますよ。


● 2,どんな風に動くのか

 前回こんなイメージを載せました。これを元に話を進めます。


 まず、カメラはそもそもどう動くのかを確認しましょう。どういうものかを把握していないと
何も始まりません。
 カメラ位置を指定する方法はこんな感じです。

 1,コード015Fでカメラ位置(と回転)を指定
 2,コード0160でターゲット位置を指定
 3,コード0160でカメラの動作モードを指定

実際のコードはこれ
-------------------------------------
 015F: set_camera_position 664.9277 -479.6112 16.1668 rotation 0.0 0.0 0.0
 0160: set_camera_point_at 665.8948 -479.5685 16.4175 mode 2
-------------------------------------

 まず、カメラはカメラ本体とターゲット、2つを動かすということになります。人間なら、
目の場所、そして見る対象の場所です。この2点が決まって初めてどこかを見るという動作が
成り立ちます。
 この時、カメラとターゲットが全く同じ地点だった時どうなるでしょう?見る方向が定まり
ませんよね?なので、カメラ位置 = ターゲット位置にならないように留意する必要があります。
また、カメラとターゲットが近いほど、どちらかが少し動いただけで視点が大きく動くのは
想像できるでしょうか?逆に2者の距離が離れているほど、少しくらい動いただけでは画面は
ほとんど動かないですよね。目の前の蚊を追うのは大変ですが、東京ドームでランナーを追う
のに目はほとんど動かす必要がありません。

 要するに、動かす「利き量」が違うわけです。目の前のコップを5cm動かせと言われたら、
4.5cm~5.5cmくらいのところに収まっていれば、早々文句は言われないでしょう。でも
1cm動かせと言われたら、せめて9mm~11mmくらいには収めないと1cmとは言い難いかも
しれません。1mm単位の要求があるのだから、その精度で動かす必要があります。つまり、
操作が難しくなるわけです。
 とはいえ、動かすのはパソコンの中のカメラですから、小さい数字を与えればいいじゃない、
と思うわけですが、これがまた微々たる数字なのです。0.001とか、そういう数字なわけです。
これを2乗3乗するような計算が入ると0.000001とかになります。ここまでくると、いかに
パソコンといえど計算誤差が出てきて、ひょっとすると小さすぎるからゼロだと見なして
しまうかもしれません。それでは困ります。
 ですが、もしカメラとターゲットの距離をそれなりにとっておけば、同じ視線の動き量に
対して2とか3くらいの数字を与えてもOKになったりします。これなら2乗3乗しても4とか
27とか。人間でさえ困らない数字で処理できます。もちろん、逆に大きすぎる数字でも困るので、
とにかくゼロに近い数字、利き量がほどよい数字で操作をしたいですね。なるべくそうなるよう、
留意してプログラムする必要があります。

 なぜ長々とそんな基本を語ったかと言うと、今までの動作がまさにその問題を受けていたから
です。移動距離が短いのに、その距離を1000フレームかけて動けと言われたりしたら、
パソコンの計算精度でも無理があります。具体的には、0.2くらいの距離を1000フレームで動けと、
つまり1フレームを0.0002で動けという命令になりかねなかった。ていうかなってた。でも、
実はGTAにおいて、カメラの最小動作は確か0.0006くらい。これ以上小さいと、カメラの位置が
変わらないんです。変わらないということは、動かして、その位置を取得しても同じ座標の
ままです。また0.0002動けと指示しても、動いたつもりで位置は変わらないから、またそのまま。
これがずっと続いてしまい、カメラはまったく動かないことになる。これが動作不良の正体の
一つです。
 というわけで、数字の最小精度というものを常に意識して下さいね、ってことなのです。



 話を戻しましょう。

 カメラのモードは、確か2だと瞬時に、1だと現在地点から指定地点までフェード移動です。
先に言っておきますが、このフェードは動作時間が固定のため、どんなに距離が離れていても
凄い速度で移動しますし、逆もしかり。なので代用はとても無理です。

 ということで、カメラ位置は瞬時に移動するわけです。つまり、離散的に動くわけですから、
移動量は小さくないと滑らかに見えません。滑らかに見える量は0.01とかのレベルなので、
滑らかかつスローに動くとなると、1フレーム当たりの移動量はさらに小さくなります。
上で述べた問題が生じやすいわけです。繰り返しますが重々留意して下さい。

 さて、ここで上のグラフを見て下さい。カメラは最初と最後がゆっくりですから、つまり
「時間の経過に対して変化量が小さい」と言えます。このことから、グラフの横軸を時間の経過、
縦軸を変化量として見るべきだということが分かります。
 さらに、カメラには始点と終点があり、総フレーム数を指定するわけですが、始点と終点が
距離に、総フレーム数が時間に関わってくることは言うまでもないでしょう。要するに、始点から
終点までの間の、ある座標を与えることが「移動」、総フレームの中の任意のフレームについて
処理することが「時間の経過」
となります。この解釈に辿り着けるかがカギです。

 ちなみに、「総フレーム数じゃなくて総動作時間で管理して、そこからフレーム数を割り出した
方が、使う人にとっては使いやすいのでは?」と思った人はいませんか?1フレームが何秒に
なるかなんてわかりにくいのだから、「5秒間かけて動く」という方が確かに使いやすいかも
しれませんね。
 ですが、残念ながらGTAはフレームリミットモードというものがあり、これを解除すると
パソコンの性能によって1フレーム当たりの時間がかわってきます。オンにすれば一定になる
のでしょうが、カクカクし過ぎて撮影には使えません。なので、規定時間が何フレームになるのか
事前に知ることができませんから、総フレーム数を指定せざるをえないのです。あとは使用者が
試行錯誤で、フレームをいくつくらいにするとそのパソコンでは何秒くらいになるという感覚を
身に付けてもらうしかありません。


 では、まとめましょう。
 グラフの横軸の端から端が「動作開始~動作終了」を意味し、縦の下から上が「始点・終点」を
意味することになります。というより、自分でそう意味付けします。
 そして、軌跡は既に「開始直後と終了直前は移動量が小さい」ことを意味する曲線を描いて
いるわけですから、「フレームを一定間隔で進めれば、勝手にフェード移動を行う」という
ことが分かります。
 そして、あるフレームにおいての座標は、グラフが描かれる式

 

がありますので、そのあるフレームをχとして、座標がσa(χ)として求まります。
いえ、実際には逆です。この曲線を描いてくれる式を見つけ出したのです。だから、この式の
通りに座標を求めれば理想の動きになるのです。
 いきなりこの式が出てきて「なにこれ」と思ったかもしれませんが、上のグラフはこの式で
表されるのです。χを入力すると、グラフのような曲線を描くYを出力してくれる式はないだろうか
と、探して見つけてきたわけです。決していきなり湧いて出たわけではありません。

 そんな曲線だけからどうやって式が見つかったのかというなら、探し回ったというのが正解です。
皆さんも、円の軌跡がx^2 + y^2 = 1で表されることを知ってますよね?じゃあ楕円なら?
渦巻きなら?そうやって似たような曲線を探して、ようやく見つけたのがコレというわけです。


 ってことで、どんな風に動かすべきかが分かってきたと思います。
 次回は実際に値を入れてみて、机上で動作の確認をしてみましょう。




Comment

Form

お名前
タイトル
E-MAIL
URL
コメント
パスワード

カウんター

カウンター

プロフィール

普通のげーまー
ニコニコ動画で「東方姫一華」連載中です

最新コメント

[03/11 Dof]
[03/09 普通のげーまー]
[03/04 Dof]
[03/04 普通のげーまー]
[03/04 普通のげーまー]

ブログ内検索

管理用

TemplateDesign by KARMA7