【问题标题】:Calculating vt (u,v) coordinates in .obj file from position (x,y) on 2D texture从二维纹理上的位置 (x,y) 计算 .obj 文件中的 vt (u,v) 坐标
【发布时间】: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++ 3d mapping textures


    【解决方案1】:

    假设您的 (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) 坐标是否映射到给定的三角形,您需要

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

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多