Ownway.Info
 
HOMESDL + OpenGLでグラフィックス → SDL + OpenGL 応用への導入
SDL + OpenGL 応用への導入

SDL + OpenGL 基礎では、SDL + OpenGLでプログラミングを行うための基本的なことを説明するのが目的であった。 そのため、できるだけわかりやすく、また最小限の記述を心掛けた。 しかし、より実践的なプログラムを目指すのならば、SDL + OpenGL 基礎で用いたコードでは力不足である。 ここでは、実践への一歩を踏み出すための導入として、基礎と応用でのコードの違いについて説明する。


1: スマートポインタの導入

SDL + OpenGL 基礎では、 SDL + OpenGLでプログラミングを行うための基本的な機能をクラスとして定義するという形を取った。 例えば、テクスチャはTextureクラス、フォントはFontクラスなどとして定義した。 今後もその方針を取るが、基礎と応用における一番の違いはそのポインタの扱いである。 より実践的な記述を可能にするために、SDL + OpenGL 応用ではスマートポインタを導入する。 スマートポインタがわからない場合は、 スマートポインタについてを参照するとよい。 スマートポインタの実装としては、Boost C++ Librariesのboost::shared_ptrを用いる。

スマートポインタを導入することによって変更される記述を以下に示す。

スマートポインタは非常に便利だが、 サイクリックな参照関係を持ってしまうとオブジェクトが正常に破棄されなくなってしまうという点に注意しよう。 しかし、そこにさえちゃんと気を使えばスマートポインタはプログラム記述をとても簡単にしてくれる とても便利な道具である。

2: 名前空間の導入

ここで製作したクラスは、TextureクラスやFontクラスなどありがちな名前であるため、 一つの名前空間に入れて管理することにする。 といっても実際に名前が衝突することはそんなに無いので、 名前の衝突を回避することが目的というよりは、 一つの独立したモジュールとしてクラス群を管理していこうという意思の表明だと思った方がいいかもしれない。 ここで製作したクラスは、toolsという名前空間で一括管理することにする。 また、それと同様にクラスを記述するファイルをすべてtoolsディレクトリに格納することにする。

名前空間を導入することによって変更される記述を以下に示す。

3: ベクトル、材質、光源などヘルパークラスの導入

より3Dグラフィックスの世界を簡単に記述するために、ベクトル・材質・光源などのヘルパークラスを導入する。 特にベクトル演算は重要な要素であるため、 3次元ベクトルクラスを用意することは複雑なプログラムを書く上で非常に効果的である。 これらのクラスもtools名前空間に属する。

以下にヘルパークラスの名前とその概要を示す。 リンクは、そのクラスのドキュメントである。実際のソースコードはSDL + OpenGL 応用のサンプルに付属している。

Vector3, Vector2クラス

それぞれ3次元ベクトルと2次元ベクトルを表す。 これらのクラスは両方ともに以下の機能が定義されている。

さらに、Vector3に関してはベクトル同士の外積を求める^演算子が定義されている。

Plane3クラス

a*x+b*y+c*z+d=0の式による3次元平面を表す。 このクラスは以下の機能が定義されている。

Color4クラス

Red, Green, Blue, Alphaの4成分による色を表す。 また、このクラスはHue(色相), Saturation(彩度), Brightness(明度)指定 により色を生成するgetHSBtoRGBクラスメソッドを持つ。

Material4クラス

Ambient, Diffuse, Specular, Shininessの4成分による材質を表す。 また、glMaterial呼び出しを行うsetメソッドを持つ。

Light, PointLightクラス

Lightクラスは全ての光源のルートクラス、PointLightクラスはLightクラスの子クラスで点光源を表す。 Lightクラスには、光源の有効・無効を設定するsetEnableメソッドと、glLight呼び出しを行うsetメソッドを持つ。

戻る: SDL + OpenGLでグラフィックス