Terragenによるキューブ環境マップの作成
「GLSLでキューブ環境マッピング」のページで使用した6枚のテクスチャは、3D景観作成ソフトTerragenで作成しました。ここでは、Terragenを用いたその作成方法を紹介します。OpenGLではキューブ環境マップが少し特殊になってしまうので、その理由も説明したいと思います。
OpenGLのキューブ環境マップ
「OpenGLの座標系」で書いたように、OpenGLは右手系の座標系です。右手系の座標で考えると、キューブ環境マッピング用のテクスチャは次のような配置となります。この図は、立方体を展開したような図で、立方体の外側ではなく、内部にテクスチャが貼られていると考えます。

しかし、OpenGLでは上のようなテクスチャではなく、X及びZ方向のテクスチャが上下左右反転した下図のようなテクスチャを用意する必要があります。

その理由は、OpenGLの仕様書(v1.3以上)を見ると分かります。キューブ環境マッピングでは、3Dベクトル(Rx, Ry, Rz)により、6枚のテクスチャのうち、どのテクスチャを使用するかと、そのテクスチャのどこの座標(s, t)を参照するかが決まります。どのテクスチャを使用するかは、Rx, Ry, Rz の中で、その絶対値が一番大きい座標値の方向で決まります。例えば、3Dベクトルが(0.5, 0.5, -1)の方向ならば、-Z方向のテクスチャTEXTURE_CUBE_MAP_NEGATIVE_Zになります。
| 最大座標 | TARGET | Sc | Tc | Ma |
|---|---|---|---|---|
| +Rx | TEXTURE_CUBE_MAP_POSITIVE_X | -Rz | -Ry | Rx |
| -Rx | TEXTURE_CUBE_MAP_NEGATIVE_X | Rz | -Ry | Rx |
| +Ry | TEXTURE_CUBE_MAP_POSITIVE_Y | Rx | Rz | Ry |
| -Ry | TEXTURE_CUBE_MAP_NEGATIVE_Y | Rx | -Rz | Ry |
| +Rz | TEXTURE_CUBE_MAP_POSITIVE_Z | Rx | -Ry | Rz |
| -Rz | TEXTURE_CUBE_MAP_NEGATIVE_Z | -Rx | -Ry | Rz |
そして、最終的なテクスチャ座標(s, t)は、上の表のSc, Tc, Maを元に次式で表されます。

例えば、TEXTURE_CUBE_MAP_NEGATIVE_Zを指す4つのベクトル(-1,1,-1), (-1,-1,-1), (1,1,-1), (1,-1,-1)の場合、上表の最下行にある(Sc,Tc,Ma) = (-Rx,-Ry,Rz) が当てはまり、上記数式によりテクスチャ座標(s, t)はそれぞれ(1,0), (1,1), (0,0), (0,1)になります(下図参照)。OpenGLのテクスチャ座標は左下原点であり、完全に上下左右反転となります。ここでは、TEXTURE_CUBE_MAP_NEGATIVE_Zを例にとりましたが、他の面でも同じです。

Direct3Dでは座標系が左手座標系で、テクスチャ座標が左上原点となっており、上記の表と数式を当てはめれば、上下左右反転することがなく分かりやすいです。そのため、Direct3Dで決めた数式がそのままOpenGLに持ち込まれたのだと思われます。
Terragenによるキューブ環境マップの作成
Terragenでキューブ環境マップを作成するには、まず3Dの景観(地形)を作成します。Terragenによる3D地形の作成方法は、下記のサイトが参考になると思います。
地形を作成した後、Rendering Controlダイアログで適当に視点を決めます。まず、視野角を90度に設定します。具体的にはCammera Settings...ボタンを押し、Zoom/Magnificationを1.0にします。次に、Image Size...ボタンで画像の幅と高さを同じ値で2のべき乗にします。キューブマップテクスチャはそれなりの大きさがいるので、256x256や512x512ぐらいが適当です。もちろん最終的にOpenGLでレンダリングする画像に依存します。後は、カメラを6方向に向けて1枚1枚レンダリングするだけです。

カメラの方向(Camera Orientation)とキューブテクスチャの関係は次の通りになります。
| TARGET | head | pitch | bank |
|---|---|---|---|
| TEXTURE_CUBE_MAP_POSITIVE_X | 90 | 0 | 180 |
| TEXTURE_CUBE_MAP_NEGATIVE_X | 270 | 0 | 180 |
| TEXTURE_CUBE_MAP_POSITIVE_Y | 180 | 90 | 180 |
| TEXTURE_CUBE_MAP_NEGATIVE_Y | 180 | -90 | 180 |
| TEXTURE_CUBE_MAP_POSITIVE_Z | 180 | 0 | 180 |
| TEXTURE_CUBE_MAP_NEGATIVE_Z | 0 | 0 | 180 |
上下左右反転させるので、bankが180になります。Y方向に関しては、+Z方向を見ている視点を上、及び下に向けることで作成できます。
Terragenの太陽と同じ方向の光源
Terragenでは、Lighting Conditions ダイアログにより太陽を設定することができます。

このダイアログでは、太陽の向きを Sun Heading と Sun Altitude により設定します。このパラメータを元に、キューブ環境マッピングのサンプルプログラムでは次のようにして平行光源の向きを計算しています。
/* Terragenで設定した太陽光パラメータ */
#define TERRAGEN_HEADING (160.0f)
#define TERRAGEN_ALTITUDE (33.0f)
void main (void)
{
: : 途中略 : :
/* Terrageで設定した太陽光と同じ向きに光源を設定 */
light.position.y = FUTL_Sin(FUTL_DEG_TO_RAD(TERRAGEN_ALTITUDE));
ldXZ = FUTL_Cos(FUTL_DEG_TO_RAD(TERRAGEN_ALTITUDE));
light.position.x = ldXZ *
FUTL_Sin(FUTL_DEG_TO_RAD(180 - TERRAGEN_HEADING));
light.position.z = ldXZ *
FUTL_Cos(FUTL_DEG_TO_RAD(180 - TERRAGEN_HEADING));
: : 途中略 : :
}
今回のサンプルで作成した3D地形はあまりかっこよくないですが、Terragenを使用すれば、初心者でも5分から10分で地形が作成できてしまいます。慣れれば、もっとかっこいい景観が作れると思います。実際、ネットにはクールな3D景観がたくさんアップされています。
最新の7件
OpenGL
電子工作
玄箱HG
- ClamAVのアップデート
- Smartyも入れてみる
- etchでPHP4->PHP5
- etchでのSamba設定
- etchでのメール設定
- 玄箱HGのetch化
- Webdruidでログ解析
- PEARも入れてみる
- 玄箱WEBのUTF-8化
- phpMyAdminでMySQL
- postmasterの変更
- ウィルスメール対策
- SPAMメール対策
- メールサーバ(IMAP)
- メールサーバ(Postfix)
- 猫にXOOPS
- PHPも入れてみる
- MySQLを入れてみる
- Subversion導入
- WebDav導入
- Apacheのrewrite機能
- Apacheディレクトリ設定
- Apache1.3->2.0
- ddclientの設定
- 静かな玄箱
- ユーザ追加