見出し画像

3DCGの初歩と立体視

はじめに

 初級者が3DCGのプログラムに挑戦する記事の第一回です。
 今日、3DCGのプログラム作成には、UnityUEなどのゲームエンジンを使うのが常識です。
 しかし、これらのゲームエンジンは、要求性能が高すぎて私の環境では動作しません
 そこで、OpenGLなどのライブラリを使用することにしました。
 と言うような記事を書いてから約二ヶ月、ようやくプログラムを作成するための準備が整いました。

開発環境

 プログラミング言語は、C言語です。3Dグラフィックライブラリは、OpenGLです。
 その他に、OpenGLの初期化のためにSDL2を、乱数生成のためにGSLを使用しました。

ライブラリ作成

 OpenGLは、設計思想が古く大域変数を濫用するので、非常に扱い辛いです。そこで、自前のライブラリ群を用意しました。
 これらライブラリは、大きく分けると、3DCG(および立体視)関連、タイル地図関連、シミュレーション関連の3つです。
 今回は、3DCGおよび立体視について簡単に説明します。

3DCG

 初歩的な機能を実装しました。ゲーム機で言うとPS2とPS3の間ぐらいの世代です。
 記事をここまで読んでいるならば、3DCGに関する基礎知識はあると思われます。そこで、タイトル画像の作成手順を示すことで、説明に代えることにします。

まず、高さマップから頂点の高さを設定すると共に、法線を求めます。

1.高さと法線

1の法線と光源(太陽)を元に以下の2から5を作成します(陰影の方向を分かりやすくするために空や太陽も描画しています)。

2.Lambertモデルによる拡散反射
3.Blinn-Phongモデルによる鏡面反射
4.シャドーマッピング
5.SSAO

2から5を合成して色をつけます。

6.合成

遠くのジャギーを誤魔化すために白っぽくすると共にボカシをかけます。

7.フォグと被写界深度

さらに品質の悪いカメラをマネることで、それっぽくします。

8.色収差、歪曲収差、周辺減光、ガンマ補正およびトーンマッピング

 以上の処理を実装しました。なお、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についての愚痴を垂れるかもしれません。

地理院タイルを加工して作成

古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。