1

ドームの UV マッピングを変更する方法を理解しようとしています。以下にコード化されたものとは異なるテクスチャ マップ プロジェクションが必要です。

    protected final void createDome(final float radius) {
    int lats=16; 
    int longs=16;

    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, textures2x4[0].getTextureID());

    int i, j;
    int halfLats = lats / 2; 
    for(i = 0; i <= halfLats; i++)
    {
        double lat0     = MathUtils.PI * (-0.5 + (double) (i - 1) / lats);
        double z0       = Math.sin(lat0)* radius;
        double zr0      = Math.cos(lat0)* radius;

        double lat1     = MathUtils.PI * (-0.5 + (double) i / lats);
        double z1       = Math.sin(lat1)* radius;
        double zr1      = Math.cos(lat1)* radius;

        GL11.glBegin(GL11.GL_QUAD_STRIP);
        for(j = 0; j <= longs; j++)
       {
            double lng = 2 * MathUtils.PI * (double) (j - 1) / longs;
            double x    = Math.cos(lng);
            double y    = Math.sin(lng);

            double s1, s2, t;
            s1      = ((double) i) / halfLats;
            s2      = ((double) i + 1) / halfLats;
            t       = ((double) j) / longs;

            // HERE: I don't know how to calculate the UV mapping
            GL11.glTexCoord2d(s1, t);
            GL11.glNormal3d(x * zr0, y * zr0, z0);
            GL11.glVertex3d(x * zr0, y * zr0, z0);

            GL11.glTexCoord2d(s2, t);
            GL11.glNormal3d(x * zr1, y * zr1, z1);
            GL11.glVertex3d(x * zr1, y * zr1, z1);
       }
        GL11.glEnd();
    }

}

出力画像と元の地図をリンクしました。実際には、北極をドームの天頂/上部に配置し、南極をドームの下部に配置する UV マッピングが必要です...北極/南極マップは、私が何を意味するのか、私の必要性を理解するためにのみ使用されます。地球の半球に収まらない

出力画像 http://img831.imageshack.us/img831/3481/lwjgl.png

ソースマップ http://img203.imageshack.us/img203/4930/earthc.png

4

1 に答える 1

1

この関数呼び出しを見てください (免責事項: 未テスト - 私は LWJGL を使用していませんが、概念は同じである必要があります):

GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glRotate(90, 0, 0, 1);    // (1) Here you transform texture space
GL11.glMatrixMode(GL11.GL_MODELVIEW);
// and so on

基本的に、オブジェクトのテクスチャを回転させる必要があります。そして、それがあなたのやり方です - テクスチャ射影行列を変換します。ライン (1) は、テクスチャを Z 軸 (テクスチャ平面に垂直) に沿って 90 度回転させます。最後の引数が 1 であるため、これは Z 軸です。最後の 3 つの引数は、それぞれ X、Y、および Z を表します (興味があれば、全体の説明は後で説明します)。

あなたができる最善の方法は、すべての基本的なもの (投影、テクスチャ空間、法線ベクトル、三角形分割、連続性、パーティクル システムなど) を把握することです。それは、3D パッケージの試用版をダウンロードして、それを試してみることです。私は 3D Studio Max を使って遊んだだけで多くのことを学びました (試用版が利用可能で、さらに多くのことが無料で提供されています)。自由な時間があり、何か新しいことを学ぶ意志がある場合は、それを調べることを強くお勧めします. 最終的に、3D グラフィックスに本当に興味がある場合は、3D パッケージであれ、ゲーム エンジン レベルのエディターであれ、いずれかを使用することになります。

編集:さらに読んだ後、私は自分のコードを認識しました...基本的に、対角線に沿って対称的に反映するために、座標の一部を交換することしかできませんでした。逆さまになってしまうかもしれませんが、それは追加の微調整 (またはビュー軸の変換) で修正することもできます。これが私のテストされていない推測です:

// tweaked to get pole right
s1 = ((double) j) / longs;
s2 = ((double) j + 1) / longs;
t  = ((double) i) / halfLats;

正しくない場合は、s1 を s2 と交換してみてください。

于 2010-07-26T21:17:07.783 に答える