Einzelnen Beitrag anzeigen

Bambini
(Gast)

n/a Beiträge
 
#1

CSG mit GLScene

  Alt 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?
  Mit Zitat antworten Zitat