您应该真正了解纹理坐标的工作原理。
让我们考虑以下网格。我们想应用一个不失真的纹理(虚线矩形):
然后为每个顶点指定纹理坐标非常简单:
u = (x - minX) / (maxX - minX)
v = (y - minY) / (maxY - minY)
如果要旋转纹理,则必须将顶点投影到相应的轴上。
如果要扭曲纹理,则必须在纹理边缘指定纹理坐标。一个可以使用的简单算法如下:
Choose an arbitrary point in the polygon -> o
For each vertex v
Shoot a ray from o through v
Find the intersection of this ray with minX / maxX / minY / maxY
Calculate the texture coordinates at the intersection points as above
Next
然而,这个算法并不能保证每个纹素都映射到网格上。例如,上面示例的右上角未使用上述算法映射到任何内容。此外,它只保证凸多边形的一致映射。
这是凹多边形的算法。它应该产生一致的坐标。但是,我不知道结果会是什么样子。该算法也可以跳过角落。可以包括检查以将角的坐标应用于特定顶点(例如,当边改变时):
Calculate the polygon's perimeter -> p
//The texture coodinate space has a perimeter of 4
currentPos := 0
for each vertex
if(4 * currentPos < 1)
uv = (4 * currentPos / p, 0) // top edge
else if(4 * currentPos < 2)
uv = (1, 4 * currentPos / p - 1); //right edge
else if(4 * currentPos < 3)
uv = (1 - 4 * currentPos / p - 2, 1); //bottomedge
else
uv = (0, 1 - 4 * currentPos / p - 3); //leftedge
currentPos += distance to next vertex
next