(Gast)
n/a Beiträge
|
CSG mit GLScene
4. Apr 2016, 17:44
Ich habe ein Problem mit dem Boolean CSG Operationen von GLScene.
Wenn 2 Körper in der gleichen Ebene liegen, werden bei der CSG Operation Substract die flächen die sich überschneiden nicht abgezogen.
Hier ein kleines Demo Programm, welches 2 Quadrate von einander abzieht:
Delphi-Quellcode:
uses
GLVectorGeometry, GLVectorFileObjects, GLVectorLists, GLGLUTesselation, GLMeshCSG;
procedure AddFace(AGLMesh : TGLBaseMesh; const ACorners : array of TAffineVector);
var
LVertexes : TAffineVectorList;
i : Integer;
LNormal : TAffineVector;
begin
LVertexes := TAffineVectorList.Create;
try
for i := Low(ACorners) to High(ACorners) do
LVertexes.Add(ACorners[i]);
LNormal := CalcPlaneNormal(ACorners[0], ACorners[1], ACorners[2]);
(* Fläche in Dreiecke zerlegen *)
DoTesselate(LVertexes, AGLMesh, @LNormal, False);
finally
LVertexes.Free;
end;
end;
procedure TForm3.Button1Click(Sender: TObject);
var
LCorners : array[1..4] of TAffineVector;
LOffset : TAffineVector;
LGLMesh1 : TGLBaseMesh;
LGLMesh2 : TGLBaseMesh;
LGLMeshResult : TGLBaseMesh;
i: Integer;
begin
LCorners[1] := AffineVectorMake(0, 0, 0);
LCorners[2] := AffineVectorMake(2, 0, 0);
LCorners[3] := AffineVectorMake(2, 2, 0);
LCorners[4] := AffineVectorMake(0, 2, 0);
LOffset := AffineVectorMake(1, 0, 0);
LGLMesh1 := TGLBaseMesh.Create(nil);
LGLMesh2 := TGLBaseMesh.Create(nil);
LGLMeshResult := TGLBaseMesh.Create(nil);
try
(* Eine XY Seite mit der Kantenlänge 2 *)
AddFace(LGLMesh1, [LCorners[1], LCorners[2], LCorners[3], LCorners[4]]);
(* Die Seite um 1 nach X Verschieben *)
for i := Low(LCorners) to High(LCorners) do
AddVector(LCorners[i], LOffset);
(* Die verschobene Seite in das 2. Mesh *)
AddFace(LGLMesh2, [LCorners[1], LCorners[2], LCorners[3], LCorners[4]]);
(* Beide Flächen subtrahieren *)
TMeshObject.CreateOwned(LGLMeshResult.MeshObjects);
CSG_Operation(LGLMesh1.MeshObjects[0], LGLMesh2.MeshObjects[0], CSG_Subtraction, LGLMeshResult.MeshObjects[0], '', '');
(* Was für Werte sind jetzt vorhanden? *)
for i:= 0 to LGLMeshResult.MeshObjects[0].Vertices.Count-1 do
Memo1.Lines.Add(Format('%f, %f', [LGLMeshResult.MeshObjects[0].Vertices[i].X, LGLMeshResult.MeshObjects[0].Vertices[i].Y]));
finally
LGLMesh1.Free;
LGLMesh2.Free;
LGLMeshResult.Free;
end;
end;
Es scheint die CSG Funktion von GLScene hat ein Problem im 2D Bereich.
Hat jemand eine Idee warum?
|
|
Zitat
|