我正在尝试实现凸多边形的正确纹理映射。我有一个由n个三角形组成的多边形,对于每个三角形,我都计算了重心坐标,它们是每个三角形中的uv坐标,但仅在每个三角形内部的[0..1]范围内,而不是整个多边形。如何插值每个uv坐标以使其覆盖整个纹理(而不是像现在这样重复)?
现在看起来像这样:
现在看起来像这样:
![enter image description here](https://istack.dev59.com/JTe3M.webp)
//region.triangulatedVectors = List<Vector2> // triangle points in CCW
//foreach triangle
for (int i = 0;i<region.triangulatedVectors.size();i+=3){
float aX = region.triangulatedVectors.get(i).x;
float aY = region.triangulatedVectors.get(i).y;
float bX = region.triangulatedVectors.get(i+1).x;
float bY = region.triangulatedVectors.get(i+1).y;
float cX = region.triangulatedVectors.get(i+2).x;
float cY = region.triangulatedVectors.get(i+2).y;
Vector2 bary0 = new Vector2();
Vector2 bary1 = new Vector2();
Vector2 bary2 = new Vector2();
Vector2 a = new Vector2(aX, aY);
Vector2 b = new Vector2(bX, bY);
Vector2 c = new Vector2(cX, cY);
GeometryUtils.barycentric(a, a, b, c, bary0);
GeometryUtils.barycentric(b, a, b, c, bary1);
GeometryUtils.barycentric(c, a, b, c, bary2);
//first point
texCoords[k++] = bary0.x;
texCoords[k++] = bary0.y;
texCoords[k++] = bary1.x;
texCoords[k++] = bary1.y;
texCoords[k++] = bary2.x;
texCoords[k++] = bary2.y;
//TODO , interpolate
}
看起来处理2D有3种方法:Wachspress、离散谐波和均值。