OpenGL二十面体纹理映射

时间:2011-01-15 12:27:46

标签: c++ opengl-es mapping textures polyhedra

我目前还没有解决纹理映射二十面体的问题,没有从极到极的接缝。这个原语的纹理映射似乎是一个常见问题,尚未完全解决。我做了很多研究,我已经尝试了很多不同的方法来生成紫外坐标,最近的(也是最小的)方法是这样的:

GLfloat u = 0.5f * ( 1.0f + atan2( z , x ) * ( 1 / M_PI ));  
GLfloat v = acos( y ) * ( 1 / M_PI );

二十面体或地球圈是各种开源框架的一部分,例如jMonkeyEngine或Geist3D,但没有一个实现似乎正常工作。映射展开的矩形纹理应该不是不可能,或者我错了吗?每个代码段都是受欢迎的。

我上传了使用openFrameworks 0.61 for iPhone构建的Xcode项目here。里面还有两个PNG文件,每个文件都显示另一个接缝变化。

3 个答案:

答案 0 :(得分:3)

你需要改变你的纹理图像,你拥有的纹理图像是一个球体的扭曲,其中杆被拉伸成一条线,你永远无法将它正确地映射到二十面体上,为了做到这一点你需要一个更像经度和纬度系统的分裂,这种失真来自于此。相反,你需要一个纹理图像,其中杆被分解成几个不同的点。你可以在一些世界地图上看到这一点,他们试图最小化将球体映射到平面上的失真。例如http://www.planetaryvisions.com/Project.php?pid=2236

您可以在http://www.vterrain.org/Textures/spherical.html

找到有关纹理球体的不同方法的一些有用信息

答案 1 :(得分:3)

二十面体的表面具有球体的拓扑结构。 2D纹理的表面具有平面的拓扑。球面与平面之间不存在微分同胚。也就是说,在2D纹理和二十面体表面之间没有拉伸和撕裂的情况下没有映射。

但是,立方体贴图和二十面体之间存在映射。

答案 2 :(得分:0)

我知道这个问题很旧,但是由于没有人提到以下解决方案,所以我想回答。

两种可能的解决方案:

  1. 构造网格时,检测三角形是否位于接缝上。如果是这样,请对接缝远侧的每个顶点使用x + 1来调整纹理坐标。设置纹理使其水平缠绕,至少对于大多数多边形来说,您将摆脱接缝。
  2. 甚至更好:根据表面法线在片段着色器中计算纹理坐标。这将完全摆脱接缝。