通用三角形网格的简单纹理映射

Posted

技术标签:

【中文标题】通用三角形网格的简单纹理映射【英文标题】:Simple Texture Mapping for a generic triangle mesh 【发布时间】:2021-10-10 21:40:07 【问题描述】:

假设我们有一个没有法线和纹理坐标信息的三角形网格。 (基本上是一个只有顶点和面元素的 OBJ 文件)。

目标是使用 Opengl 和用 C 编写的程序展示一些不错的东西。 计算每个三角形的法线很容易...

但是纹理映射呢? 谁能推荐我一个简单的算法/文档/资源来将图像的归一化 UV 坐标映射到三角形的通用网格?

(For a mesh with a single triangle it is easy, ex:  [0][0], [1][0], [0][1]) 

结果不一定是完美的,如果没有 UV 展开和 UV 接缝,即使是专业软件也无法做到这一点。

【问题讨论】:

【参考方案1】:

我知道的唯一算法是2D屏幕坐标(屏幕空间):

我已经回答了类似这个here的问题,关注textureCoords2D vertices之间的转换算法(即texturePos = (vPos - 0.5) * 2

编辑

注意;以下是一个理论:

可能有一个带有 3D 空间的方法。最终,这些变换会导致顶点以 2D 屏幕坐标呈现。

local space --> world space --> view space --> NDC space --> screen coordinates

使用上面的一般约定和 3 个矩阵(ModelViewProjection),

并且由于顶点最终会在 2D 空间中,您可以创建某种形式的算法来使用逆矩阵将纹理坐标回溯到 3D 空间并移动从那里开始。

顺便说一句,这仍然不是一个已定义和完美的算法(也许有,将来有人会在这里编辑和添加算法......

【讨论】:

你本可以在评论中写出来...如果我问了这个问题并且没有添加任何资源,那只是因为我找不到任何东西。 求一个通用的算法是很难找到的,因为算法适用于特定的上下文或情况,它们可能不是普遍适用的,有时甚至是与其他密切相关但不是100%的问题。无论如何,我会尽我所能编辑问题给你一个更详细的答案 textureCoordinates 没有算法的关键原因之一是因为它们与verticesnormals 没有关系密切(信息不足派生)而normals 是每个顶点或每个三角形的基础(如果由三个顶点组成的三角形被认为是一个平面,则可以使用基本向量数学来计算法线)。

以上是关于通用三角形网格的简单纹理映射的主要内容,如果未能解决你的问题,请参考以下文章

具有重心坐标的三角形纹理映射

在类似 Doom 的引擎中使用 glTexCoord4f() 在三角形中实现正确的纹理映射

纹理映射一个NGon?

纹理在openGL中使用2D纹理映射3D对象

Android OpenGL ES 纹理映射/绘图问题 - 倾斜图像

导出到 DAE 时如何继承相同的纹理映射?