4

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

现在我想为球体模型使用纹理。因此,我将球坐标转换为纹理坐标并将它们分配给每个点。这适用于球体的大部分表面三角形,结果看起来可以接受。

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

这是它的外观图片:

球体纹理

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

为了说明这个问题,它不是特定于球体而是所有封闭对象,我创建了下图:

纹理接缝

在上面的矩形中,我们看到一个三角形跨越纹理边界,计算纹理坐标 A、B 和 C。由于纹理可以平铺,这就是我想要渲染三角形的方式。

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

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

4

3 回答 3

5

答案很简单,您需要将纹理坐标映射到边缘。实施取决于您的数据集,但这是一个问题。

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

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

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

于 2009-10-05T08:56:40.303 回答
2

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

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

也就是说,要处理您的情况下的接缝,您需要知道(球形)网格的哪些三角形边缘与边界(子午线或其他)相交。然后,您必须将入射在这些边缘上的三角形分解成不跨越边界的部分,并正确应用纹理坐标。

于 2009-10-05T08:32:15.377 回答
2

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

你想“打破”球体,这样你就不会在球体周围获得 0.9 到 0.0 之间的纹理插值。在 python 中, callsphere.SetEndTheta(360 - 1.e-4)实际上会从球体中取出一小块。这为您提供了纹理的最终顶点集,以一直映射到 1.0。

于 2017-09-21T14:33:20.737 回答