目前,我没有解决纹理映射Icosahedron的解决方案,而没有从极点到杆的接缝。这个原始的纹理映射似乎是一个常见的问题,尚未完全解决。我做了很多研究,并且尝试了许多不同的方法来生成紫外线坐标,最附近(最小)的方法是:

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

二十面体或地球座是各种开源框架的一部分,例如Jmonkeyengine或geist3d,但这些实现似乎都没有正常工作。绘制不可能的矩形纹理或我错了?欢迎每个代码段。

我已经上传了Xcode项目 这里 该iPhone用OpenFrameWorks 0.61构建。里面还有两个PNG文件,每个文件都显示了另一个接缝变化。

有帮助吗?

解决方案

您需要更改纹理图像,所拥有的纹理图像是将杆伸入一条线的球体的变形,您将永远无法正确地映射到Icosahedron,以便您需要一个除法更像是这种失真来自的经度和纬度系统。取而代之的是,您需要一个纹理图像,其中杆被分解为几个不同的点。您可以在某些世界地图上看到这一点,在这些地图中,他们试图将映射球映射到平坦的表面上的失真最小化。例如 http://www.planetaryvisisions.com/project.php?pid=2236

您可以找到有关不同方法的一些好信息 http://www.vterrain.org/textures/spherical.html

其他提示

二十面体的表面具有球体的拓扑结构。 2D纹理的表面具有平面的拓扑结构。球体和平面之间没有差异性。也就是说,没有拉伸和2D纹理和二十面体表面之间的撕裂的映射。

但是,Cubemap和Icosahedron之间存在映射。

我意识到这个问题是旧的,但是由于没有人提到以下解决方案,所以我想我会回答。

两种可能的解决方案:

  1. 构造网格时,检测三角形是否位于接缝上。如果是这样,请使用使用 x + 1 对于接缝远端的每个顶点。将纹理设置为水平包裹,至少在大多数多边形中,您将摆脱接缝。
  2. 更好的是:根据表面正常,计算片段着色器中的纹理坐标。这将完全摆脱接缝。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top