Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 20, 2025 01:19

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Sep 08, 2006 07:56 
Offline
DGL Member

Registriert: Di Feb 01, 2005 15:59
Beiträge: 14
Wohnort: nähe Stuttgart
Guten Morgen DGLer,

Ich möchte einen *kleinen* CAD-Editor machen, dessen Core-Funktionalität unter anderem das Anwenden von boolschen Operationen auf Körper ist. Dazu hab ich mir überlegt das ich die Flächen meiner Körper in BSP-Bäume speichere, da dies laut meinen Informationen (das web ist voll davon) eine geeignete Möglichkeit ist.
Das Problem ist folgendes: als Input sind auch 2D-Polygone zugelassen die nicht Konvex sind, und damit nicht einfach in einen BSP-Tree eingebaut werden können (die 2D-Polygone werden dann mit einer stärke versehen um Objekte im 3D raum darzustellen).
Die müssen jetzt erstmal in konvexe Polygone (also quads oder gleich triangles) umgeformt werden bevor ich mit ihnen weiterarbeiten kann. Meine Frage dazu: wie kann man auf die daten eines openGL Tess-Objektes zugreifen nachdem es tesseliert hat um damit dann weiterzuarbeiten, oder ist dieser Weg der falsche und ich sollte gleich von Hand einen Triangulations algorithmus implementieren (was ich wegen des aufwandes momentan nur ungern machen würde).

Danke schonmal für eure geistreichen Antworten :)
Grüßle,
Pit


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 12, 2006 21:24 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hi,

allgemein ist es wohl zumindest der einfachste weg (auch wenn alles andere wohl sauberer ist).
Hier ein Beispiel (nur ein stück aus meinem code - ich hoffe du kannst dir fehlende typedefinitionen zusammenreimen):

Viele Grüße
User69

PS: da ich ein ähnliches Projekt habe kannst du dich ja mal per pm melden, dann können wie evtl mehr austauschen.

Code:
  1.  
  2. procedure DrawSection_AsTesslator;
  3. var i, x, y, fNumber: Integer;
  4.   t: TGLUTess;
  5.   v: TTessCoords;
  6.  
  7.   procedure gtCombine(coords: TTessCoords; vertex_data: TTessVertex_data; weight: TTessWeight; var DataOut: TTessDataOut); stdcall;
  8.   var fVertex: pVertex;
  9.   begin
  10.     new(fVertex);
  11.     fVertex^.Vertex[1]:= coords[0];
  12.     fVertex^.Vertex[2]:= coords[1];
  13.     fVertex^.Vertex[3]:= coords[2];
  14.     DataOut:= @fVertex^.Vertex;
  15.   end;
  16.  
  17.   procedure gtBegin(AMode: Integer); stdcall;
  18.   begin
  19.     TessMode:= AMode;
  20.     TessIndex:= 0;
  21.   end;
  22.  
  23.   procedure gtVertex(Vertex: Pointer); stdcall;
  24.   { This callback is invoked when the tesselator creates a new group of
  25.     triangles. The atype parameter can be either GL_TRIANGLES, GL_TRIANGLE_FAN
  26.     or GL_TRIANGLE_STRIP. }
  27.   begin
  28.     TessPoints[TessIndex]:= Vertex;
  29.     Inc(TessIndex);
  30.     case TessMode of
  31.       GL_TRIANGLES: begin
  32.           if TessIndex = 3 then begin
  33.             glBegin(GL_TRIANGLES);
  34.             glVertex3fv(TessPoints[0]);
  35.             glVertex3fv(TessPoints[1]);
  36.             glVertex3fv(TessPoints[2]);
  37.             glEnd;
  38.             TessIndex:= 0;
  39.           end;
  40.         end;
  41.       GL_TRIANGLE_STRIP: begin
  42.           if (TessIndex = 3) then begin
  43.             if odd(TessIndex) then begin // needed only in 3D for hidden face removal
  44.               glBegin(GL_TRIANGLES);
  45.               glVertex3fv(TessPoints[0]);
  46.               glVertex3fv(TessPoints[1]);
  47.               glVertex3fv(TessPoints[2]);
  48.               glEnd;
  49.             end else begin
  50.               glBegin(GL_TRIANGLES);
  51.               glVertex3fv(TessPoints[1]);
  52.               glVertex3fv(TessPoints[2]);
  53.               glVertex3fv(TessPoints[0]);
  54.               glEnd;
  55.             end;
  56.             TessPoints[0]:= TessPoints[1];
  57.             TessPoints[1]:= TessPoints[2];
  58.             TessIndex:= 2;
  59.           end;
  60.         end;
  61.       GL_TRIANGLE_FAN: begin
  62.           if TessIndex = 3 then begin
  63.             glBegin(GL_TRIANGLES);
  64.             glVertex3fv(TessPoints[0]);
  65.             glVertex3fv(TessPoints[1]);
  66.             glVertex3fv(TessPoints[2]);
  67.             glEnd;
  68.             TessPoints[1]:= TessPoints[2];
  69.             TessIndex:= 2;
  70.           end;
  71.         end;
  72.     end;
  73.   end;
  74.  
  75.   procedure gtError(Error: Integer); stdcall;
  76.   begin
  77. //    ShowMessage('GLU Tessellate error #' + IntToStr(Error) + ' : ' + gluErrorString(Error));
  78.   end;
  79.  
  80. begin
  81.   t:= gluNewTess;
  82.   gluTessProperty(t, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
  83. //  gluTessCallBack(t, GLU_TESS_ERROR, @gtError);
  84.   gluTessCallBack(t, GLU_TESS_BEGIN, @gtBegin);
  85. // gluTessCallBack(t,GLU_TESS_END_DATA   ,@gtEndData);
  86.   gluTessCallBack(t, GLU_TESS_VERTEX, @gtVertex);
  87.   gluTessCallBack(t, GLU_TESS_COMBINE, @gtCombine);
  88.  
  89.           gluTessBeginPolygon(t, nil);
  90.  
  91.  
  92.               gluTessBeginContour(t);
  93.  
  94.                   gluTessVertex(t, v, @Current_Vertex^.Vertex);
  95.  
  96. ...........  mehrere Punkte
  97.  
  98.  
  99.               gluTessEndContour(t);
  100.  
  101. ..... evtl mehrere konturen
  102.  
  103.           gluTessEndPolygon(t);
  104.  
  105.   gluDeleteTess(t);
  106. end;
  107.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 13, 2006 08:17 
Offline
DGL Member

Registriert: Di Feb 01, 2005 15:59
Beiträge: 14
Wohnort: nähe Stuttgart
Super, danke :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 16 Queries | GZIP : On ]