【发布时间】:2016-05-19 23:09:49
【问题描述】:
我正在编写一个 C++ 算法,该算法返回 2D 纹理上的 X、Y 位置。使用 X,Y 值我希望找到 3D 对象的 u,v 纹理坐标(已经在软件中映射)。
我有这些计算:
u = X/texture_width
v = texture_height - Y/texture_height
但是在我的 obj 文件的 vt 下找不到计算的值。
我们将不胜感激,非常感谢。
【问题讨论】:
我正在编写一个 C++ 算法,该算法返回 2D 纹理上的 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、 如果您对 OBJ 文件的所有 f 条目重复此检查,您将找到给定图像像素映射到的三角形。如果您没有找到任何匹配项,则该像素不会出现在对象的表面上。
【讨论】: