我正在编写一个 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
其中 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++ - 从 2D 纹理上的位置 (x,y) 计算 .obj 文件中的 vt (u,v) 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298852/