OpenGLの座標系
ホームページで幾つかサンプルを作成してきましたが、テクスチャやウィンドウの座標系にはあまり触れてきませんでした。OpenGLでは、2次元画像(テクスチャやウィンドウ)の座標系は左下が原点になります。しかし、私がよく使用しているペイントソフトのPictBearやGIMP、そして、あの有名なPhotoshopも左上が原点です。私自身が慣れているのは左上原点であり、これまでアップしたきたサンプルも左上原点なのですが、やはり、OpenGLのプログラムをする時は、左下を原点にした方が分かりやすいため、左下で統一することにしました。ということで、多くのサンプルを一部変更しました。
OpenGLとDirect3Dの座標系の違い
3Dライブラリでは、OpenGLとDirect3Dが有名ですが、座標系は完全に逆です。それを表にまとめました。あまり詳しい訳ではありませんが、3次元の座標系が右手系、左手系で異なっているため、それ以外のものもおのずと違ってくると思います。
| OpenGL | Direct3D | |
|---|---|---|
| 3次元座標系 | 右手系座標 |
左手系座標 |
| 画像・ウィンドウの座標系 | 左下原点 |
左上原点 |
| 回転方向 | 左回り |
右回り |
| 面の表と裏 | 頂点が左回りが表、右回りが裏 |
頂点が右回りが表、左回りが裏 |
| 座標変換 | ![]() 4x4行列Mと列ベクトルpの積 |
![]() 4x4行列と行ベクトルpの積 |
左下原点のテクスチャ座標を用いたサンプル
テクスチャ座標やウィンドウ座標をOpenGL系に統一したため、確認も含め、次のようなテクスチャを正方形に貼り付ける簡単なプログラムを作成しました。

まず、bmpファイルの読み込みです。実はbmpファイルも左下から順に格納されています。そのため、loadbmp.cのloadBMP関数内で、次のように格納されている順に読み込みます。もちろん、futil.hでの#defineマクロでOPENGL_IMAGE_COORDINATEは(1)に定義されています。
: : 途中略 : :
switch(bpp)
{
case 8: /* 8 bits/pixel */
/* カラーマップ読み込み */
fseek(fp,54,SEEK_SET);
fread(&palette[0], sizeof(RGBQuad), 256, fp);
#if OPENGL_IMAGE_COORDINATE != 0
for (i = 0; i < height; i++)
#else
for (i = height - 1; i >= 0; i--)
#endif
{
linePos = bfOffBits + lineSize * i;
fseek(fp, linePos, SEEK_SET);
: : 途中略 : :
そして、テクスチャを貼り付けた正方形の位置座標とテクスチャ座標は次のように設定します。
: : 途中略 : :
/* 頂点位置データ */
float triVertex[] = {
/* x, y, z */
-30.0, -30.0, 0.0, /* 0 */
30.0, -30.0, 0.0, /* 1 */
-30.0, 30.0, 0.0, /* 2 */
30.0, 30.0, 0.0, /* 3 */
};
/* 頂点テクスチャ座標 */
float triUV[] = {
/* u, v */
0.0f, 0.0f, /* 0 */
1.0f, 0.0f, /* 1 */
0.0f, 1.0f, /* 2 */
1.0f, 1.0f, /* 3 */
};
視点は(0, 0, 120)、注視点は(0, 0, 0)に設定しているため、テクスチャを貼った正方形モデルと視点を図示すると、次のようになります。

文字列描画関数FUTL_DrawStringもウィンドウ座標に描画するため、次のように左下原点にしました。
: : 途中略 : :
#if OPENGL_IMAGE_COORDINATE
wy = y;
#else
wy = height - y - FUTL_FONT_HEIGHT;
#endif
glRasterPos2i(x, wy);
: : 途中略 : :
ということで、レンダリング結果は次のようになります。プログラムはDOWNLOADページに置いてあります。

最新の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の設定
- 静かな玄箱
- ユーザ追加
右手系座標
左手系座標
左下原点
左上原点
左回り
右回り
頂点が左回りが表、右回りが裏
頂点が右回りが表、左回りが裏
