Раствор 1 - Тривиальный
Если четырехугольник выпуклый и вы знаете порядок вершин, используйте indices = new double[6]{0,1,2,0,2,3};
Раствор 2 - Триангуляция вручную
Если четверка выпуклая, но вы не уверены в порядке, проверьте ориентацию и откорректируйте индексы.
edge1 = vertices3D[1] - vertices3D[0];
edge2 = vertices3D[2] - vertices3D[0];
edge3 = vertices3D[3] - vertices3D[0];
normal12 = Vector3.Cross(edge1, edge2);
normal23 = Vector3.Cross(edge2, edge3);
if (Vector3.Dot(normal12, normal23) > 0)
indices = new double[6]{0,1,2,0,2,3};
else
indices = new double[6]{0,1,3,0,3,2};
Решение 3 - Использование триангулятора
Если квад не выпуклый или вам действительно нужно использовать библиотечный триангулятор, преобразуйте все вершины таким образом, чтобы они находились на плоскости XY с первой вершиной в (0,0,0)
.
edge1 = vertices3D[1] - vertices3D[0];
edge2 = vertices3D[2] - vertices3D[0];
normal = Vector3.Cross(edge1, edge2).normalized;
rotation = Quaternion.FromToRotation(normal, new Vector3(0,0,1));
Vector2[] vertices2D = new Vector2[vertices3D.Length];
for (int i=0; i<vertices3D.Length; i++) {
rotatedVertex = rotation * (vertices3D[i]-vertices3D[0]);
vertices2D[i] = new Vector2(rotatedVertex.x, rotatedVertex.y);
}
Я не рекомендую использовать Триангулятор только для 4 точек, образующих стену. Однако это должно пригодиться для сложных многоугольников и для невыпуклых форм.