TOTAL:2003, TODAY:116

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 HeadingSun 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

ホームページ

日記

Copyright (C) 2007 Arakin , All rights reserved.