OpenGL正二十面体纹理映射

4

目前我还没有解决在极点之间无缝地贴图正二十面体的方案。这一原始形状的贴图似乎是一个常见的问题,尚未完全解决。我已经进行了大量的研究,并尝试了许多不同的方法来生成UV坐标,最接近(且最小)的方法是:

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

一个二十面体或地球仪是各种开源框架的一部分,例如jMonkeyEngine或Geist3D,但似乎没有一种实现能够正常工作。将展开的矩形纹理映射到它上面应该不是不可能,我错了吗?欢迎任何代码片段。
我已经上传了使用openFrameworks 0.61为iPhone构建的Xcode项目,您可以在此处找到:here,其中还有两个PNG文件,每个文件显示另一种接缝变化。
3个回答

3
你需要更换纹理图像,你现有的纹理图像是球体的扭曲,其中极点被拉成了一条线,你永远无法正确地映射到一个二十面体上。为此,您需要更多类似于经度和纬度系统的分割,这种扭曲来自于这样的分割。相反,您需要一个纹理图像,将极点分解成几个不同的点。您可以在一些世界地图上看到这一点,他们试图将球体映射到平面上时最小化扭曲。例如:http://www.planetaryvisions.com/Project.php?pid=2236 您可以在http://www.vterrain.org/Textures/spherical.html找到有关不同方式纹理球体的一些好信息。

谢谢您的快速回复。请看这个链接: http://projects.stephanschulz.com/assets/Geosphere.swf 这是使用名为Alternativa3D的Flash框架创建的地球仪。我已经在地球仪基元上使用了相同的纹理并将其映射。除了北极的一个三角形外,纹理似乎正确地包裹在多面体周围。不知道他们是如何实现的,Alternativa3D不是开源的,但似乎有可能。这是源代码:http://projects.stephanschulz.com/assets/geosphere.zip - Stephan
可能围绕极点的面可以是具有两个相邻顶点的四边形,但我仍然认为一个适当的纹理图像对于一个二十面体来说会更好。 - wich
当然可以,但是二十面体纹理很少见,也没有提供这种格式的地图服务器。该应用程序旨在可视化地图数据,例如来自civicmaps,而不会在极点出现任何问题,这是使用基于堆栈和切片的球体无法实现的。我认为这是使用地球球体的优势。你会如何处理这个问题? - Stephan
嗯,你应该能够从基本图生成一个二十面体纹理。 - wich
你有没有关于这个问题的示例或文献? - Stephan
http://www.vterrain.org/Textures/spherical.html提到,“这已经在VTP软件中实现,一个预处理实用程序将传统的地球纹理映射投影到20个面(10个正方形纹理图)”。 - wich

3

二十面体的表面拓扑结构类似于球体,而2D纹理表面的拓扑结构类似于平面。球体和平面之间不存在流形同构,即不存在没有拉伸和撕裂的映射将2D纹理表面与二十面体表面相对应。

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


谢谢mbaitoff。你说的立方体贴图和二十面体之间有映射,这是什么意思?我知道没有无失真的映射可能,但是探讨一种方法还是很有趣的。 - Stephan
就像将球放入立方体中,然后将球上的每个点朝着法线方向吹到立方体上,这样你就可以在立方体的6个面上得到一个诺蒙投影,然后将其放入纹理图像中。这也在我发布的链接中有解释。 - wich
是的,立方体和球之间存在有限失真的映射关系。它已经作为扩展实现在OpenGL中,然后作为ARB,最终成为标准(GL_TEXTURE_CUBE_MAP)。 - mbaitoff

1
我知道这个问题很久了,但由于没有人提到以下解决方案,所以我想回复一下。
两种可能的解决方案:
1.在构建网格时,检测三角形是否位于接缝处。如果是,则通过对接缝另一侧的每个顶点使用x + 1来调整纹理坐标。将纹理水平包裹,你将摆脱接缝,至少对于大多数多边形而言。
2.更好的方法是:根据表面法线在片段着色器中计算纹理坐标。这将完全消除接缝。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接