3d 球体上的纹理错误

3d 球体上的纹理错误,3d,geometry,textures,vtk,3d,Geometry,Textures,Vtk,对于球体上需要可视化的点,我有许多球面经纬度坐标。为此,我将这些点转换为笛卡尔坐标,并构建了一个可以用VTK渲染的三角形网格。到目前为止还有效 现在我想为球体模型使用纹理。因此,我将球坐标转换为纹理坐标,并将其指定给每个点。这适用于球体的大多数曲面三角形,结果看起来可以接受 但是,对于纹理包裹的本初子午线另一侧的三角形,三角形的纹理设置不正确:与其重复纹理并“在纹理边界上”映射,不如将整个纹理压缩到单个三角形上 下面是一张它的样子: zick-zack线显然是错误的,蓝线应该是可见的。整个纹理

对于球体上需要可视化的点,我有许多球面经纬度坐标。为此,我将这些点转换为笛卡尔坐标,并构建了一个可以用VTK渲染的三角形网格。到目前为止还有效

现在我想为球体模型使用纹理。因此,我将球坐标转换为纹理坐标,并将其指定给每个点。这适用于球体的大多数曲面三角形,结果看起来可以接受

但是,对于纹理包裹的本初子午线另一侧的三角形,三角形的纹理设置不正确:与其重复纹理并“在纹理边界上”映射,不如将整个纹理压缩到单个三角形上

下面是一张它的样子:

zick-zack线显然是错误的,蓝线应该是可见的。整个纹理映射到三角形上,形成红色和白色条纹。这是有意义的,因为对于所讨论的三角形,纹理坐标跨越整个纹理空间

为了说明这个问题,我创建了下图,该图并不是针对球体,而是针对所有闭合对象:

在上面的矩形中,我们看到一个三角形,它跨越纹理边界,使用计算出的纹理坐标a、B和C。由于纹理可以平铺,因此我希望以这种方式渲染三角形

下面的三角形显示当前如何解释纹理坐标。边A、B和C的坐标相同,但这一次,大部分纹理用于三角形,而不是在边界处平铺纹理


我确信我犯了一个相当常见的错误,但我还没有找到任何可以帮助我的东西。有什么提示吗?

首先,您可能不想只将球坐标映射到覆盖球体的单个矩形纹理,因为纹理分辨率在曲面上变得非常不均匀

更好的方法是使用地图集。“图集”是将曲面参数化为多个“图表”,每个“图表”都是一个连接区域。例如,您可以将球体映射到大约6个对应于立方体边的图表上,每个图表都可以更好地保留球体部分的形状。你可以在谷歌上搜索多图表参数化或类似的东西。如果您想走这条路,DirectX已经内置了UVAtlas生成。在图表之间的接缝处做什么的问题实际上更简单,因为三角形总是位于一个图表中,这是一个完全不同的问题


也就是说,要处理案例中的接缝,您需要知道(球形)网格的哪些三角形边与边界相交(子午线或其他)。然后,您必须将这些边上的三角形分割成不跨越边界的碎片,并正确应用纹理坐标。

答案非常简单,您需要将纹理坐标映射到边上。实现取决于您的数据集,但这里有一个问题

在计算机图形学中,纹理坐标存储在面上,而不是顶点上,您的问题说明了原因。当您围绕球体映射纹理时,让我们假设在10个步骤中,从0.0开始,然后以0.1的增量继续。如果沿着本初子午线使用纹理坐标,则会得到纹理坐标为0.9和0.0的面。图形硬件按指示执行操作,并在0.0和0.9之间插值纹理

要解决问题,需要将纹理从0.9映射到1.0


如果可以的话,可以这样创建多边形,或者用其他纹理坐标复制有问题的顶点。

回答一个非常老的问题,因为我认为使用vtk的
vtkSphereSource
的内置方法会有一个更简单的答案


您希望“打断”球体,以便不会在球体周围获得介于0.9和0.0之间的纹理插值。在python中,调用
sphere.SetEndTheta(360-1.e-4)
,这实际上会从球体中取出一小块。这将为纹理提供一组顶点,使其一直映射到1.0。

感谢您介绍atlas方法。事实上,我想让事情变得简单,因为我只需要可视化数据,而不是开发游戏或类似的东西。我现在意识到我必须调整几何体以消除接缝,我将投票支持你指出这一点的答案。复制一些顶点似乎是迄今为止最实际的解决方案,我将尝试一下。谢谢你的提示。你能详细说明一下“那样创建多边形”吗?我理解为什么会发生这种情况,但必须创建一行退化面来修复接缝似乎很蹩脚。你不是在创建退化面,这些面很好,你只是得到纹理坐标为0.0和1.0的重复顶点。如果你依赖于连接性信息,这是一个问题,但是渲染和网格操作是两件不同的事情。在过去的一天左右,我一直在努力解决这个问题,主要是检测哪些面有错误。结果表明,错误的面具有逆时钟顺序的纹理坐标。