clipper не работает
Есть имеется 2 квадрата, один квадрат 10 на 10, второй 5x5 и находится он по середине в первом. Необходимо вырезать из квадрата 10x10 второй квадрат 5x5, чтобы в первом квадрате было отверстие размером с 2 квадрат После этого создать 3D модель в формате gltf.
Обязательно использовать библиотеку Clipper или Clipper2 (или аналог), а так же библиотеку SharpGLTF. Можно использовать библиотеку для триангуляции Poly2Tri.
List<IntPoint> square1 = new List<IntPoint>
{
new IntPoint(0, 0),
new IntPoint(10000, 0),
new IntPoint(10000, 10000),
new IntPoint(0, 10000)
};
List<IntPoint> square2 = new List<IntPoint>
{
new IntPoint(2500, 2500),
new IntPoint(7500, 2500),
new IntPoint(7500, 7500),
new IntPoint(2500, 7500)
};
var material = new MaterialBuilder("PCB_Material")
.WithDoubleSide(true)
.WithMetallicRoughnessShader()
.WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1.0f, 1f, 1.0f, 0));
var meshBuilder = new MeshBuilder<VertexPosition>("PCB_Mesh");
ClipperLib.Clipper clipper = new ClipperLib.Clipper();
clipper.AddPolygon(square1, PolyType.ptSubject);
clipper.AddPolygon(square2, PolyType.ptClip);
List<List<IntPoint>> solution = new List<List<IntPoint>>();
clipper.Execute(ClipperLib.ClipType.ctDifference, solution, PolyFillType.pftEvenOdd, PolyFillType.pftNonZero);
foreach (var path in solution)
{
Console.WriteLine("Path:");
foreach (var point in path)
{
Console.WriteLine($"({point.X}, {point.Y})");
}
}
var polygons = new List<Polygon>();
foreach (var path in solution)
{
var points = new List<PolygonPoint>();
foreach (var point in path)
{
points.Add(new PolygonPoint(point.X, point.Y));
}
polygons.Add(new Polygon(points));
}
var triangles = new List<DelaunayTriangle>();
foreach (var polygon in polygons)
{
P2T.Triangulate(polygon);
triangles.AddRange(polygon.Triangles);
}
var material1 = new MaterialBuilder("PCB_Material1")
.WithDoubleSide(true)
.WithMetallicRoughnessShader()
.WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1.0f, 0.0f, 1.0f, 1.0f));
var index = 0;
foreach (var triangle in triangles)
{
var v0 = new VertexPosition((float)triangle.Points[0].X / 1000.0f, (float)triangle.Points[0].Y / 1000.0f, 0);
var v1 = new VertexPosition((float)triangle.Points[1].X / 1000.0f, (float)triangle.Points[1].Y / 1000.0f, 0);
var v2 = new VertexPosition((float)triangle.Points[2].X / 1000.0f, (float)triangle.Points[2].Y / 1000.0f, 0);
if(index >= 2)
meshBuilder.UsePrimitive(material1).AddTriangle(v0, v1, v2);
else
meshBuilder.UsePrimitive(material).AddTriangle(v0, v1, v2);
index++;
}
var scene = new SceneBuilder();
scene.AddRigidMesh(meshBuilder, Matrix4x4.Identity);
scene.ToGltf2().SaveGLTF("output.gltf");
По итогу, создаются обе модели и одна модель просто "сидит" в первой, как я понимаю, либо clipper не правильно вырезает, либо на каком-то этапе еще допущена ошибка.