AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたらPythonなども。

撮る夫くんNX 準備中

VRMNXでも「撮る夫くん」が使えるように,スクリプトを新しく書き起こしています。

撮る夫くんは,VRMビュワーの新たな表現の試みとして,ハンディカメラで撮影した映像が手ブレしているようなカメラの動きをスクリプトを使って模擬したものです。このほか,ズーム&パンの同時操作ができます。

デモがこちらです。(手ブレしているので映像酔いに注意。)

これを作るにあたって,人間の手ブレの動きがどういうものなのか知りたかったので調べたのですが,世の中手ブレを「補正」したい人ばかりで,リアルな手ブレの動きを作り出したい人はそうそういなかったようです。したがって撮る夫くんは超適当な手ブレシミュレーションにすぎませんが,乱数を三角分布から生成するなどNX時代のスクリプトにふさわしい,ちょっと高級な内部機構になってます。

このあと,地上カメラとは一味違う追尾モードを実装したら公開したいなと思っています。

  • 先頭・後尾だけでなく中間車両も追尾可能
  • 追尾中,水平面上のカメラ回転だけでなく上下にもカメラが動きます

旧バージョンではできなかった,「追尾中も手ブレ」も実現する予定です。

手ブレにしろ,通常の見回し操作にしろ,基本的にはベクトルの回転計算です。ここで欠かせないのは行列の計算だと,今の私には分かるもんですが,旧撮る夫くんを書いたときはまだ年端も行かぬ青少年でありましたので,行列も線形代数も知りませんでした。そこで,どうやって撮る夫くんが出来たのかと言うと,取得したフライスルーカメラの座標から,逆三角関数(arcsin, arccos)の計算をしてその瞬間に向いている角度を求め(つまり極座標系に持ち込んで),ここで必要な回転を施してから再び直交座標系に持ち帰ってくるということをしていました。

簡単に図式化すれば, (x,y,z) → arcsin, arccos → (r, θ, φ) ここで画角の回転を計算 → sin, cos → (x', y', z') ということです。これに多少の前後処理が加わります。これだけの計算を毎フレームやっていたということですから,きちんと負荷を測ったわけではありませんが重かったのは間違いありません。体感的にはちゃんと重かったような気がします。

ぜんぶベタベタと成分計算していますが黄色く囲んだところでベクトルが回っています。線形代数の知識がちょっと付けば,直感的には不思議なことですが,これだけの計算でベクトルが回転してしまう。線形代数って凄いですね~勉強はしておくものです。

もし中高生のVRMユーザーがこのブログをお読みであったら,ぜひ数学の勉強に励むことを奨めます。