2010-07-25 62 views
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(); 
    } 

} 

我挂了输出图像和原始地图。实际上,我需要一个紫外线贴图,将Artic放置在圆顶的天顶/顶部,而Antartic则放在圆顶的底部...... Artic/Antartic贴图仅用于弄清楚我的意思,我的需要它不是以适应全球Emisphere公司

Output image http://img831.imageshack.us/img831/3481/lwjgl.png

Source map http://img203.imageshack.us/img203/4930/earthc.png

+1

请修复图像。看起来他们存储在需要注册的某个论坛上,才允许查看。 – schnaader 2010-07-25 14:57:07

+0

谢谢,全部完成! – 2010-07-25 15:08:36

回答

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; 

尝试用s2替换s1,如果它不正确。

+0

是的,它的确是你的代码!得到代码工作后,我错过了我找到它的链接,对不起 – 2010-07-27 00:58:34