【CG】3DCG上でシフトレンズの画角を表現する
どもども。Oculus Riftのデモを見てきて衝撃を受けたYanaiです。眼鏡をかけるとCGで作った空間が映されてるんですが、例えば右を向くと、映像も右を向いたかのように変わるのです。あれまじですごいっすよ! 見たのは住宅のそれでしたが、自分が実際にモデルルームにいるんです。だから、意識しなくともその辺のモノを掴もうと手が勝手に動いちゃう。それくらい現実の世界と混同する。
あれでOculus Rift版のSecondLifeとかが出始めたら本気の仮想空間住人が続出するんじゃないですか。。。バイオハザードなんか出たら怖くてプレーできそうにありませんw
さて、検索しても本などで調べても全然見つからず、自分でいじくってたらできたことがありますので、メモ程度に。
3DCGでシフトレンズの世界を再現したいと思ってやってみた ─ ってだけですw
シフトレンズというのは、特殊なカメラレンズのことで、キヤノンでいうTS-E、ニコンでいうPC-Eシリーズのことです。あまりなじみがないかもしれませんが。楽しいんですよこれ。(ただPhotoshopでアオリ補正してるだけの漢じゃありませんよ! ちゃんと実機を使ったことはありますよ!)
※シフトレンズによるアオリ撮影や原理云々はその辺のサイトで読んでくださいッッッ
画像:PC-E NIKKOR 24mm f/3.5D ED – ニコン株式会社より
3DCGでビューポートの設定をいじくることで、あの独特のシフトレンズの世界感と同じことってできないのかなと思って。調べても出てこない・・・そりゃそうですよね。CGでわざわざシフトレンズの見え方をやる状況がほとんどありませんし。あっても建築向けのCADやプレゼンソフトくらいでしょう。
結果的にはフラスタムにシフトレンズみたいな画角を設定をすることで実現できました。topとbottomそれぞれに同値を加算(または減算)するだけです。加算(または減算)する単位は実際のレンズシフトと同じで、mmで考えればよいです。
最初、画が変わったことは絵面的にすぐわかりましたが、現象をどう解説すべきかよくわからなかったんですが、確認してみたら最終的に下図のような画角になってるっぽいです。
(この辺の正解をご存知の方、教えていただければ幸いです。)
図は横から見たところです。。。
左図の青色の台形が通常のビューボリュームです。
右図の青色の台形は、dy[mm]上にシフトしただけのビューボリューム。ただし視点は動いていないので視点はそのままだと考えます。視点とfar側のビューポートの四隅を結んだ範囲(赤色の台形)が画角になっているようです。
OpenGLだったらglFrustumで以下のようにセットすればよい。
double dy; // シフトする値
glFrustum( left, right, bottom + dy, top + dy, near, far);
OpenSceneGraphだとこういう感じ。
osgViewer::Viewer viewer;
・・・ カメラのセットとかは省略 ・・・
viewer.getCamera()->setProjectionMatrixAsFrustum(left, right, bottom + dy, top + dy, near, far);
・・・ね、なってるでしょう?
続き
2020年10月12追記:UE4でシフトレンズを実装しました。
【UE4】カメラアクターを拡張機能した「シフレレンズカメラShiftLensCameraActor」を作ってリアルタイムあおり補正
1 thought on “【CG】3DCG上でシフトレンズの画角を表現する”