我正在尝试了解如何更改圆顶的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地图,它将北极放在圆顶的顶端,而南极圈则散布在圆顶的底部……北极圈/南极圈地图只是用来弄清楚我的意思,我的需要不是为了适应地球的emisphere
Output image http://img831.imageshack.us/img831/3481/lwjgl.png
Source map http://img203.imageshack.us/img203/4930/earthc.png
发布于 2010-07-27 05:17:08
看看这个函数调用(免责声明:未测试-我没有使用过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。
https://stackoverflow.com/questions/3329593
复制相似问题