我正在编写一个C ++算法,它返回2D纹理上的X,Y位置。使用X,Y值我希望找到3D对象的u,v纹理坐标(已经在软件中映射)。
我有这些计算:
u = X/texture_width
v = texture_height - Y/texture_height
但是我的obj文件中的vt下找不到计算出的值。
非常感谢,非常感谢帮助。
答案 0 :(得分:2)
假设您的(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文件的{{1}}条目列表中。
原因是OBJ文件中的(u,v)坐标仅在3D对象的面的角落处指定。您从图像像素计算的坐标可能位于面的内部中。
假设您的OBJ文件表示具有位置和纹理坐标的三角形网格,则面部的条目将如下所示:
vt
其中f p1/t1 p2/t2 p3/t3
,p1
,p2
是位置索引,p3
,t1
,t2
是纹理坐标索引。
要查找计算的(u,v)坐标是否映射到给定的三角形,您需要
t3
,{{1}的索引的vt
条目,找到角落的纹理坐标(u1,v1),(u2,v2),(u3,v3) },t1
,如果对OBJ文件的所有t2
条目重复此检查,您将找到给定图像像素映射到的三角形。如果找不到任何匹配项,则像素不会出现在对象的表面上。