3DCGの初歩と立体視
はじめに
初級者が3DCGのプログラムに挑戦する記事の第一回です。
今日、3DCGのプログラム作成には、UnityやUEなどのゲームエンジンを使うのが常識です。
しかし、これらのゲームエンジンは、要求性能が高すぎて私の環境では動作しません。
そこで、OpenGLなどのライブラリを使用することにしました。
と言うような記事を書いてから約二ヶ月、ようやくプログラムを作成するための準備が整いました。
開発環境
プログラミング言語は、C言語です。3Dグラフィックライブラリは、OpenGLです。
その他に、OpenGLの初期化のためにSDL2を、乱数生成のためにGSLを使用しました。
ライブラリ作成
OpenGLは、設計思想が古く大域変数を濫用するので、非常に扱い辛いです。そこで、自前のライブラリ群を用意しました。
これらライブラリは、大きく分けると、3DCG(および立体視)関連、タイル地図関連、シミュレーション関連の3つです。
今回は、3DCGおよび立体視について簡単に説明します。
3DCG
初歩的な機能を実装しました。ゲーム機で言うとPS2とPS3の間ぐらいの世代です。
記事をここまで読んでいるならば、3DCGに関する基礎知識はあると思われます。そこで、タイトル画像の作成手順を示すことで、説明に代えることにします。
まず、高さマップから頂点の高さを設定すると共に、法線を求めます。
1の法線と光源(太陽)を元に以下の2から5を作成します(陰影の方向を分かりやすくするために空や太陽も描画しています)。
2から5を合成して色をつけます。
遠くのジャギーを誤魔化すために白っぽくすると共にボカシをかけます。
さらに品質の悪いカメラをマネることで、それっぽくします。
以上の処理を実装しました。なお、SSAOを行うために遅延レンダリングを採用しています。
立体視
両方の目で一つの画面を見る方式(立体テレビなど)と、左右の目ごとに画面を見る方式(VRゴーグルなど)とを実装しました。
座標系の計算がすごく面倒でしたが、頑張った甲斐がありました。ちなみに、立体視は、最近の技術でも何でもなく、古代ギリシアから知られていたらしいです。
一画面方式
アナグリフ
赤青メガネを使用する立体視です。左目が赤、右目が青です。暗記マーカ用の赤・緑シートでも代用できます(私自身、これしか持っていません)。
できれば大きな画面で観てください。
3DS
3DSに付属の「ニンテンドー3DSカメラ」というソフトウェアで再生することができます。3DSの特性に合わせて奥行き重視に設定しています。
動画ファイルは、以下の通りにSDカードに保存してください。
ディレクトリは、/DCIM/100NIN03/です。
動画のファイル名は、HNI_????.AVIです(?には数字が入ります)。
これらが違っていると認識されないので注意してください。また、ソフトウェアの仕様により「3Dボリューム」は、2D/3Dの切替えしかできません。
二画面方式
サイド-バイ-サイド
HMDなどゴーグル型の機器向けの動画です。私は、これを表示できる機器を有していないので、確認していません。スマートフォンでもあれば、百均のVRゴーグルセットを購入したのですが…
なお、サイド-バイ-サイドは表示機器における画像の受信方式です。上述の立体視の方式(一画面、二画面)とは関係ありません。立体視の方式が合っていないと受信・表示はできても立体視が上手くできないのでご注意ください。
まとめ
今回は、3DCGと立体視について簡単に説明しました。
3DCGについては、まだまだ改良の余地(PBR、CSM、HDRなど)や追加したい機能(パーティクルシステムなど)があるので、後々記事にしていきたいと思います。
立体視については、VR180やVR360への拡張を考えてはいるものの、計算量(キューブマップ作成とエクイレクタングラ系への写像)が障害となります。まあ、表示機器も持っていませんし…
次回は、タイル地図関連のライブラリについて説明する予定です。もしくはC言語やOpenGLについての愚痴を垂れるかもしれません。