c++ - 从 2D 纹理上的位置 (x,y) 计算 .obj 文件中的 vt (u,v) 坐标

标签 c++ 3d mapping textures

我正在编写一个 C++ 算法,它返回二维纹理上的 X、Y 位置。我希望使用 X、Y 值找到 3D 对象的 u、v 纹理坐标(已在软件中映射)。

我有这些计算:

u = X/texture_width
v = texture_height - Y/texture_height

但是在我的obj文件中的vt下找不到计算出的值。

不胜感激,非常感谢。

最佳答案

假设您的 (u,v) 坐标应该在 [0,1] x [0,1] 范围内,您的计算不太正确。应该是

u = X/texture_width
v = 1 - Y/texture_height

给定图像像素坐标 (X,Y),这将计算相应的纹理 (u,v) 坐标。但是,如果您选择一个随机图像像素并将其 (X,Y) 坐标转换为 (u,v) 坐标,则该坐标很可能不会出现在 vt 条目列表中OBJ 文件。

原因是 OBJ 文件中的 (u,v) 坐标仅指定在 3D 对象面的。您根据图像像素计算的坐标可能位于面部的内部

假设您的 OBJ 文件代表一个带有位置和纹理坐标的三角形网格,面部条目将如下所示:

f p1/t1 p2/t2 p3/t3

其中 p1p2p3 是位置索引,t1t2, t3 是纹理坐标索引。

要确定您计算的 (u,v) 坐标是否映射到给定的三角形,您需要

如果您对 OBJ 文件的所有 f 条目重复此检查,您将找到给定图像像素映射到的三角形。如果您没有找到任何匹配项,则该像素不会出现在对象的表面上。

关于c++ - 从 2D 纹理上的位置 (x,y) 计算 .obj 文件中的 vt (u,v) 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298852/

相关文章:

python - 将一个值映射到列表中的另一个值

c++ - 一个函数中的局部变量更改导致不相关的函数,C++

c++ - 如何避免段错误: 11; c++

python - 如何在 python 中创建 3D 高度图

Java:如何使用 Map<String,String> 填充文本中的占位符?

c# - NHibernate:更改父级 - "deleted object would be re-saved by cascade"

c++ - 助手的静态自由函数或成员函数?

c++ - OpenCV 无法获得 Mat 的正确最大值和最小值

3d - 将 ASCII 中的 3D 数组转换为 Paraview 可以读取的文件

python - 在 3D 绘图中显示真彩色 2D RGB 纹理?