なが月・45日目

45日目

午前

並列プログラミング入門の例題1から再開。NxN密行列の行列積計算 C=ABを並列化せよというものである。素朴な計算としてはijkループでC[i][j] += A[i][k] * B[k][j];になる。あとはgistのコメントに書いた。

またC++のrange-based for文for (変数宣言 : コンテナ){}において今まで型推論autoを使っていたが、これは値をプリントコピーするものであった。auto&として参照にすれば鏡像コピーとなってループの中からコンテナの中身の書き換えができ、const auto&とすれば鏡像コピーかつ代入不可能とすることができることが分かった。結果出力の際には値の変更は必要ないので、const auto&を使っていくようにしたい。明日は疎行列に対する計算の扱いとPoisson方程式の陽解法に取り組む。隣接する部分と相互に影響を与える格子点を設定して各格子点の温度を考えるらしく、科学計算が現実味を帯びてくる。偏微分の知識はともかく大学物理に全くノータッチである点が問題だ。せめて基本原理だけでも理解すべく、ゲーム開発の時間を高校物理の学習に充てることにする。

午後

 微積で楽しく高校物理がわかる本を始めた。質量M[kg]の物体に力FをΔt[s]の時間分加えたときの速度変化Δv[m]はFとΔtに比例しMに反比例するという日常の観察から比例係数をkとしたとき \Delta v=k\frac{F\Delta t}{M}と立式し、変形して M\frac{\Delta v}{\Delta t}=kFとし、k=1となるようにうまく力の単位をとってニュートンと称し(F[N])、ここで加速度をaとして表すと \frac{\Delta v}{\Delta t} = aだからニュートン運動方程式 Ma=Fが成り立つことを理解した。しかし加速度、速度、変位の関係を積分に頼ると、簡単な問題では往々にして不必要に計算が複雑になり、velocity-time図を書いて変位を面積、加速度を傾きと捉える方が素早いことも実感した。積分による変位の数値計算はプログラムに任せるとよさそうだが、微小時間による区分求積ではやがて丸め誤差の問題に直面するので、計算機で正確に計算するアルゴリズムを知る必要も出てくるだろう。

https://helpx.adobe.com/after-effects/how-to/create-data-driven-animations.htmlではJSONデータを利用してアニメーションを定義する方法を学んだ。JSONの中身を書き換えれば、手付けのアニメーションのようにキーフレームごとに変更を反映させずともJSONの構造さえ一致すればあらゆるパターンに対応できる。しかし解説動画では単純な始点・終点だけを指定したアニメーションのプログラムしか説明されておらず、あとはサンプルaepのレイヤーを開いて自分で見なければならないというのはいただけない。その肝心のサンプルのコードもエラーであり、これは日本語版AfterEffectsのエフェクト名が日本語になっているため参照できなくなっていることが原因であった。

なお時間に応じて値を変化させていくにはビルトインメソッドtimeを使って時間を取得して対応した処理をすればよい。とはいえコンソールのない環境での動作確認はひどいものだった。redditデバッグ方法について調べていたところ、TextレイヤーやSliderエフェクトの値に反映させるくらいしかなさそうだった。

このとき偶然別のスレッドでEchoという残像エフェクトがあることを知り、これが速さに応じて長さが変化する軌跡を簡単に描けるようなので明日試してみようと思う。

また一つ「ローカライズなどせずに英語で全部押し通すべき」という主張を裏付けるものに出会ってしまい(しかもこんな超大手で)、嘆息しながら全てのCCアプリケーションをアンインストールしてCreative Cloudの環境設定で言語を変えて再インストールし一日を終えた。