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 度(垂直于纹理平面)。它是 Z 轴,因为最后一个参数是 1。最后三个参数分别表示 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 回答