VRMNXでも「撮る夫くん」が使えるように,スクリプトを新しく書き起こしています。
撮る夫くんは,VRMビュワーの新たな表現の試みとして,ハンディカメラで撮影した映像が手ブレしているようなカメラの動きをスクリプトを使って模擬したものです。このほか,ズーム&パンの同時操作ができます。
デモがこちらです。(手ブレしているので映像酔いに注意。)
#VRMNX での撮る夫くんのデモ。(映像酔い注意)
— AKAGI (@AKAGIvrm) April 22, 2019
パンとズームを同時にできるのと,目玉の手ブレ機能。(ただしmp4圧縮との相性が悪すぎて画質がお察し) pic.twitter.com/7LYtsrFgzq
これを作るにあたって,人間の手ブレの動きがどういうものなのか知りたかったので調べたのですが,世の中手ブレを「補正」したい人ばかりで,リアルな手ブレの動きを作り出したい人はそうそういなかったようです。したがって撮る夫くんは超適当な手ブレシミュレーションにすぎませんが,乱数を三角分布から生成するなどNX時代のスクリプトにふさわしい,ちょっと高級な内部機構になってます。
このあと,地上カメラとは一味違う追尾モードを実装したら公開したいなと思っています。
- 先頭・後尾だけでなく中間車両も追尾可能
- 追尾中,水平面上のカメラ回転だけでなく上下にもカメラが動きます
旧バージョンではできなかった,「追尾中も手ブレ」も実現する予定です。
手ブレにしろ,通常の見回し操作にしろ,基本的にはベクトルの回転計算です。ここで欠かせないのは行列の計算だと,今の私には分かるもんですが,旧撮る夫くんを書いたときはまだ年端も行かぬ青少年でありましたので,行列も線形代数も知りませんでした。そこで,どうやって撮る夫くんが出来たのかと言うと,取得したフライスルーカメラの座標から,逆三角関数(arcsin, arccos)の計算をしてその瞬間に向いている角度を求め(つまり極座標系に持ち込んで),ここで必要な回転を施してから再び直交座標系に持ち帰ってくるということをしていました。
簡単に図式化すれば, (x,y,z) → arcsin, arccos → (r, θ, φ) ここで画角の回転を計算 → sin, cos → (x', y', z') ということです。これに多少の前後処理が加わります。これだけの計算を毎フレームやっていたということですから,きちんと負荷を測ったわけではありませんが重かったのは間違いありません。体感的にはちゃんと重かったような気がします。
撮る夫くんのコードをちょっとだけ。視線を水平方向に見回す部分は回転行列の計算。垂直方向は三角関数の加法定理を利用してでできてる。 #VRMNX #Python
— AKAGI (@AKAGIvrm) April 22, 2019
数学はゲームにも役に立つ。 pic.twitter.com/CcF3AUqO7T
ぜんぶベタベタと成分計算していますが黄色く囲んだところでベクトルが回っています。線形代数の知識がちょっと付けば,直感的には不思議なことですが,これだけの計算でベクトルが回転してしまう。線形代数って凄いですね~勉強はしておくものです。
もし中高生のVRMユーザーがこのブログをお読みであったら,ぜひ数学の勉強に励むことを奨めます。