我最近从Turbosquid下载了一个3D三角网格(.obj格式),它附带了一个2D jpeg图像作为纹理。我计划在我正在开发的程序中使用这个网格,我从头开始编写自己的代码来解析.obj文件,然后纹理并渲染网格。
我的程序目前可以在大多数情况下处理这个问题,但是这个特殊的.obj文件还有一些我不知道如何处理的事情。
1)UV坐标不在[0,1]范围内。 0仍然是最小值,但似乎没有上限。我假设这是为了表明纹理不止一次地缠绕在网格周围,所以我决定为每个坐标提取十进制值并使用它。因此,对于我目前正在执行以下操作的每个坐标:
double u = ReadInValue();
double v = ReadInValue();
u = u - (int)u;
v = v - (int)v;
因此,[1.35,3.29]的UV坐标变为[0.35,0.29]。应用时纹理看起来仍然有些偏差,所以我不确定这是否是正确的做法。
2)有一个额外的W坐标。我意识到如果我正在处理3D体积纹理文件,W坐标将以与UV坐标相同的方式起作用,并且仅用于查找第三维中的值。但是我给出的纹理文件是二维。那么这个额外的W坐标该怎么办?我可以简单地忽略它吗?我是否必须将UV坐标除以W项(就好像它是一个同质坐标?)我不太清楚该怎么做。
答案 0 :(得分:0)
1)您无法仅提取纹理坐标的一小部分并期望它能够工作。对于超过[1,1]或低于[0,0]的三角形,这将中断。例如,具有顶点UVs [0,0]和[5,5]的线 - 这应该意味着纹理将被包裹5次,但是在计算中两个顶点都得到[0,0]。 GPU使用大于1.0的UV甚至是负数都没有问题,所以只需使用你拥有的。
2)我们不知道你的模型究竟是什么,它可以用于3D纹理,所以它有3D坐标但是因为你说它带有2D纹理,所以我不认为是这种情况。我建议使用第一个答案,只需u,v
个坐标,看看你得到了什么。