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

时间:2016-05-18 11:54:24

标签: c++ 3d mapping textures

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

我有这些计算:

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

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

非常感谢,非常感谢帮助。

1 个答案:

答案 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 p1p2是位置索引,p3t1t2是纹理坐标索引。

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

  • 通过查找带有t3,{{1}的索引的vt条目,找到角落的纹理坐标(u1,v1),(u2,v2),(u3,v3) },t1
  • 找出点(u,v)是否位于带角(u1,v1),(u2,v2),(u3,v3)的三角形内。 There are several ways to compute this

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