从 2D 纹理上的位置 (x,y) 计算 .obj 文件中的 vt (u,v) 坐标
Calculating vt (u,v) coordinates in .obj file from position (x,y) on 2D texture
我正在编写一个 C++ 算法,returns 二维纹理上的 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) 坐标,则该坐标很可能不会出现在 OBJ 文件的 vt
条目列表中。
原因是 OBJ 文件中的 (u,v) 坐标仅指定在 3D 对象面的 角 处。您根据图像像素计算的坐标可能位于面部的 内部 。
假设您的 OBJ 文件表示具有位置和纹理坐标的三角形网格,面的条目将如下所示:
f p1/t1 p2/t2 p3/t3
其中p1
、p2
、p3
是位置索引,t1
、t2
、t3
是纹理坐标索引。
要确定您计算的 (u,v) 坐标是否映射到给定的三角形,您需要
- 通过查找索引为
t1
、t2
、t3
、
- 判断点(u,v)是否在角三角形(u1,v1),(u2,v2),(u3,v3)内。 There are several ways to compute this.
如果您对 OBJ 文件的所有 f
条目重复此检查,您将找到给定图像像素映射到的三角形。如果您没有找到任何匹配项,则该像素不会出现在对象的表面上。
我正在编写一个 C++ 算法,returns 二维纹理上的 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) 坐标,则该坐标很可能不会出现在 OBJ 文件的 vt
条目列表中。
原因是 OBJ 文件中的 (u,v) 坐标仅指定在 3D 对象面的 角 处。您根据图像像素计算的坐标可能位于面部的 内部 。
假设您的 OBJ 文件表示具有位置和纹理坐标的三角形网格,面的条目将如下所示:
f p1/t1 p2/t2 p3/t3
其中p1
、p2
、p3
是位置索引,t1
、t2
、t3
是纹理坐标索引。
要确定您计算的 (u,v) 坐标是否映射到给定的三角形,您需要
- 通过查找索引为
t1
、t2
、t3
、 - 判断点(u,v)是否在角三角形(u1,v1),(u2,v2),(u3,v3)内。 There are several ways to compute this.
如果您对 OBJ 文件的所有 f
条目重复此检查,您将找到给定图像像素映射到的三角形。如果您没有找到任何匹配项,则该像素不会出现在对象的表面上。