かなりふつう

ヾ( ゚д゚)ノ゙

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

新しい理論を実装する場合、何から手を付けていいのか分からないと思います。
そんなとき、まず自分がやりたいことを思い出してみましょう。
今回やりたいことは、

● 最初と最後がゆっくりなカメラワーク

ですが、それは具体的にどのように動くでしょうか?
カメラワークを実行するには何が必要で、実行した結果どうなるんでしたでしょうか。
まず、必要なのは

・始点位置
・終点位置
・総フレーム数
・nフレーム目での進行度合いを計算してくれる式(nは任意のフレーム位置)

でした。始点(0フレーム目)から始まり、nフレーム目での進行度が定まり、
(終点-始点)× 進行度 でnフレーム目の現在位置が求まります。これを繰り返す
ことで連続的なカメラワークが実現できるわけです。

よって、実行した結果は

・nフレーム目に、或る位置にカメラが移動する

となります。言葉にしてしまうとシンプルな話ですね。
要するに、「動作」には「入力」と「出力」が存在するわけです。
何かを入力したら、入力したものを加工して何かが出力される。つまり、あらゆる処理の
シーケンス(順序)は

1,初期値を与える
2,初期値による出力の計算
3,結果の出力
4,次の値へカウントアップ、もしくは次の値を計算
5,次の値による出力の計算
6,結果の出力
7,4に戻る。ただし、もし提示しておいた条件を満たしたら終了

となるのです。どんなものでも、これに当てはめれば動作します。動作し得ないのなら、
この1~7の何かが抜けているのです。

では、実際に当てはめてみましょうか。

1,初期値を与える ← 初期カメラ位置(ユーザーが指定する)。これがn=0
2,初期値による出力の計算 ← Yを求める計算式に0を入れる
3,結果の出力 ← カメラ位置を移動させるコードの実行
4,次の値へカウントアップ ← フレームカウントをn+1にする
5,次の値による出力の計算 ← Yを求める計算式にnを入れる
6,結果の出力 ← カメラ位置を移動させるコードの実行
7,条件を満たしたら終了 ← nが総フレーム数と等しくなったら

はい。今までに提示した内容で全部埋まりましたね。
次に、一番重要な中核部分、「Yを求める」です。これを確認してみましょう。



式はコレだと言いましたが、数学やプログラムの関数に触れていない人にはそれでも
ピンと来ないかもしれませんので、実際のカメラ位置も含めて手順をなぞってみましょう。
この「手順を手動でなぞる」というのは極めて大切です。まずはこれを何ループか
繰り返して、全体を把握してから「一般化」を行うのが正しい道筋です。

 例えば、Y=X+2がどういう軌跡を成すか分かりますか?
 ある程度数学を身に付けた人ならすぐに分かりますが、そうでないと直感的には難しい
でしょう。そういうときは、1つずつ値を入力していくはずです。

X=0 のとき Y=0+2=2
X=1 のとき Y=1+2=3
X=2 のとき Y=2+2=4

こんな感じです。これで、XがY軸と同じ位置にあるとき、Y=2に点があることが分かり、
Xが1増えるごとにYも1増えていくことが分かります。つまり、Y=2を通る、傾きが
1(Xの増分1/Yの増分1)の直線だと言えます。これが一般化です。

まあ、実のところ、上で書いた複雑な式がどういう軌跡を描くかはもう分かってますよね。



はい、こちらですね。X軸が-6~+6になっていますが、将来的には0~1になるように
調整したいです。どうするかって?X=1を入れたら、実際にはX=6を入れたのと
同じになればいいんですよね。さらに、X=0ならX=ー6を入れたのと同じになればいい。
また、X=0.5を入れたらX=0入れたみたいになればいい。
これはつまり、X=0の時はY=ー6,X=1の時はY=6っていう直線を示してるのと
同じですよね。つまり、Y=12Xー6じゃあありませんか。

さて、この(便宜上の)YっていうのはグラフのX軸の値を示してますので、式のaxが
Yだと思えばOKです。ここで、aはただのゲイン(任意の係数)なので1としてしまうと、
実際は-xですから、まとめるとeの指数

 6-12Z(Zは0~1)

となります。つまり、Zを0にすると-xが6になったことになります。-xが6という
ことは、X=-6を入れたのと同義です。Zを1にすると-xがー6になったことに
なります。X=6を入れたのと同義です。つまり、Zに0~1を入れるだけで、上の
グラフのX=-6~+6を行っているのと同じ効果が得られるということです。
なので、これからeの指数は「6-12Z」と置き換えます。

一旦計算してみましょう。上の式のZに、まずは0.5を入れてみます。

σa(x)=1/(1+e^0)

ここで、eの0乗は、累乗はどんな数字でも0乗は1ですから、

σa(x)=1/(1+1)=0.5

となりました。なるほど、グラフ上でもY=0.5ですね。合ってます。
じゃあ、グラフ上の「X=2」の値になるようなZを入れてみます。Zは端から端までが
0~1ですから、X=2に対応するならZ=4/6=0.667ですね。つまりeの指数は
6-12×0.667≒-2です。

σa(x)=1/(1+e^-2)=1/(1+0.135)=1/1.135=0.881

うん、グラフを見ても、0.9にほど近い値ですから、この値も合ってる感じです。
じゃあ、Z=2/6=0.333を入れてみましょう。

σa(x)=1/(1+e^+2)=1/(1+7.389)=1/8.389=0.1192

はい、対象形ですから、これも正しいですね。
それじゃもう一つ、Z=1を入れてみます。eの指数はー6ですね。
これは元々X=6を入れているのと同じ。つまり-axがー6になってるのと同じでした。

σa(x)=1/(1+e^-6)=1/(1+0.002)=1/1.002≒

成りました。正確な1ではありませんから、正確に1になるのを待っていたらいつまでも
1にならないので、プログラム的にはどこかで値を丸めるなりしてあげる必要があります。
つまり、1/1.002=0.998なので、Yが0.997を超えたらもう終了しちゃおう!という
終了条件にするのです。この辺は、プログラムを知らない人なら「こまっけえなあ」って
思うでしょうが、プログラムは「一切の融通が利かない」ので、やらないとダメです。


 ということで、とうとう0~1という入力を与えると、0~1の範囲でYが滑らかに
変化する式が得られました。それがこちら。

Y=1/(1+e^(6-12Z))

です。

これで、次の節で具体的なカメラ座標の計算ができそうですね。
いよいよ実際のGTAの値との調整になります。こうご期待ヾ( ゚д゚)ノ゙




.

Comment

Form

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

カウんター

カウンター

プロフィール

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

最新コメント

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

ブログ内検索

管理用

TemplateDesign by KARMA7