TOTAL:1950, TODAY:63

OpenGLの座標系

ホームページで幾つかサンプルを作成してきましたが、テクスチャやウィンドウの座標系にはあまり触れてきませんでした。OpenGLでは、2次元画像(テクスチャやウィンドウ)の座標系は左下が原点になります。しかし、私がよく使用しているペイントソフトのPictBearGIMP、そして、あの有名なPhotoshopも左上が原点です。私自身が慣れているのは左上原点であり、これまでアップしたきたサンプルも左上原点なのですが、やはり、OpenGLのプログラムをする時は、左下を原点にした方が分かりやすいため、左下で統一することにしました。ということで、多くのサンプルを一部変更しました。

OpenGLとDirect3Dの座標系の違い

3Dライブラリでは、OpenGLとDirect3Dが有名ですが、座標系は完全に逆です。それを表にまとめました。あまり詳しい訳ではありませんが、3次元の座標系が右手系、左手系で異なっているため、それ以外のものもおのずと違ってくると思います。
OpenGL Direct3D
3次元座標系 右手系座標 左手系座標
画像・ウィンドウの座標系 左下原点 左上原点
回転方向 左回り 右回り
面の表と裏 頂点が左回りが表、右回りが裏 頂点が右回りが表、左回りが裏
座標変換
4x4行列Mと列ベクトルpの積

4x4行列と行ベクトルpの積

左下原点のテクスチャ座標を用いたサンプル

テクスチャ座標やウィンドウ座標をOpenGL系に統一したため、確認も含め、次のようなテクスチャを正方形に貼り付ける簡単なプログラムを作成しました。

まず、bmpファイルの読み込みです。実はbmpファイルも左下から順に格納されています。そのため、loadbmp.cloadBMP関数内で、次のように格納されている順に読み込みます。もちろん、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

ホームページ

日記

Copyright (C) 2007 Arakin , All rights reserved.