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

Aktuelle Zeit: Fr Jul 18, 2025 11:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem beim Darstellen von Kurven
BeitragVerfasst: Sa Jan 30, 2010 11:53 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hallo zusammen,

ich beschäftige mich zur Zeit mit dem Darstellen von Kurven des VDA-FS 3D-Formates.

In dem Anhang befindet sich ein Auszug der DIN-Norm für das Interprtieren dieses Formates. In diesem wird erklärt, wie man die "Kurvensyntax" zu lesen hat. Es befindet sich auch ein Beispiel in dem PDF.

Nun mein Problem:
Ich denke, dass ich es richtig verstanden habe und die ganze Kurve in 4 Segmente eingeteilt habe.
Jedes Segment stellt eine Kurve mit dem jeweiligen Polynom Grad dar.

Wenn man sich die Beispielwerte anschaut und diese mit der Zeichnung vergleicht, dann kommt man zu dem Entschluß das hier was nicht zusammenpasst. Evtl. ist die Zeichnung auch nur eine Veranschaulichung?

Die Beispielwerte habe ich so ausgelesen (Block 1 mit der 5,):
x1, x2, x3, x4, x5, y1, y2, y3, y4, y5, z1, z2, z3, z4, z5

Dies habe ich mit allen Kurven so getan.

Das Ergebnis welches ich bekomme sieht total falsch aus.
Das liegt wahrscheinlich doch daran, dass ich das total falsch mache.

Kann mir jemand Hilfestellung geben?

Hier mein Demo Quellcode:
Code:
  1.  
  2. unit Main;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglOpenGl;
  9.  
  10. type
  11.   TVertex3f = packed record
  12.     X: TGlFloat;
  13.     Y: TGlFloat;
  14.     Z: TGlFloat;
  15.   end;
  16.  
  17. type
  18.   TVertex3fArray = array of TVertex3f;
  19.  
  20. type
  21.   TForm1 = class(TForm)
  22.     procedure FormCreate(Sender: TObject);
  23.     procedure FormDestroy(Sender: TObject);
  24.     procedure FormResize(Sender: TObject);
  25.   private
  26.     RC: HGLRC;
  27.     DC: HDC;
  28.     Palette: HPALETTE;
  29.     OrthoLeft: GLdouble;
  30.     OrthoRight: GLdouble;
  31.     OrthoBottom: GLdouble;
  32.     OrthoTop: GLdouble;
  33.     KontrollPunkteA: TVertex3fArray;
  34.     KontrollPunkteB: TVertex3fArray;
  35.     KontrollPunkteC: TVertex3fArray;
  36.     KontrollPunkteD: TVertex3fArray;
  37.   public
  38.     procedure OnIdle(aSender: TObject; var aDone: Boolean);
  39.     procedure Render;
  40.     procedure CreateKontrollPunkte;
  41.   end;
  42.  
  43. var
  44.   Form1: TForm1;
  45.  
  46. implementation
  47.  
  48. {$R *.dfm}
  49.  
  50. procedure TForm1.CreateKontrollPunkte;
  51. begin
  52.   SetLength(KontrollPunkteA, 5);
  53.   SetLength(KontrollPunkteB, 3);
  54.   SetLength(KontrollPunkteC, 2);
  55.   SetLength(KontrollPunkteD, 4);
  56.  
  57.   KontrollPunkteA[0].X := 0.0;
  58.   KontrollPunkteA[0].Y := 0.0;
  59.   KontrollPunkteA[0].Z := 30.0;
  60.  
  61.   KontrollPunkteA[1].X := 63.889;
  62.   KontrollPunkteA[1].Y := 6.447;
  63.   KontrollPunkteA[1].Z := 0.0;
  64.  
  65.   KontrollPunkteA[2].X := -51.465;
  66.   KontrollPunkteA[2].Y := 56.939;
  67.   KontrollPunkteA[2].Z := -60.0;
  68.  
  69.   KontrollPunkteA[3].X := 77.093;
  70.   KontrollPunkteA[3].Y := -23.571;
  71.   KontrollPunkteA[3].Z := 40.0;
  72.  
  73.   KontrollPunkteA[4].X := -48.517;
  74.   KontrollPunkteA[4].Y := 3.185;
  75.   KontrollPunkteA[4].Z := -10.0;
  76.  
  77.   //
  78.  
  79.   KontrollPunkteB[0].X := 14.0;
  80.   KontrollPunkteB[0].Y := 43.0;
  81.   KontrollPunkteB[0].Z := 0.0;
  82.  
  83.   KontrollPunkteB[1].X := -0.915;
  84.   KontrollPunkteB[1].Y := 31.175;
  85.   KontrollPunkteB[1].Z := -20.0;
  86.  
  87.   KontrollPunkteB[2].X := 41.915;
  88.   KontrollPunkteB[2].Y := 1.824;
  89.   KontrollPunkteB[2].Z := 15.0;
  90.  
  91.   //
  92.  
  93.   KontrollPunkteC[0].X := 82.0;
  94.   KontrollPunkteC[0].Y := 76.0;
  95.   KontrollPunkteC[0].Z := -5.0;
  96.  
  97.   KontrollPunkteC[1].X := 92.0;
  98.   KontrollPunkteC[1].Y := -21.0;
  99.   KontrollPunkteC[1].Z := -5.0;
  100.  
  101.   //
  102.  
  103.   KontrollPunkteD[0].X := 111.0;
  104.   KontrollPunkteD[0].Y := 55.0;
  105.   KontrollPunkteD[0].Z := -10.0;
  106.  
  107.   KontrollPunkteD[1].X := 26.562;
  108.   KontrollPunkteD[1].Y := -19.235;
  109.   KontrollPunkteD[1].Z := 30.0;
  110.  
  111.   KontrollPunkteD[2].X := -10.870;
  112.   KontrollPunkteD[2].Y := -77.312;
  113.   KontrollPunkteD[2].Z := -30.0;
  114.  
  115.   KontrollPunkteD[3].X := -10.692;
  116.   KontrollPunkteD[3].Y := 49.547;
  117.   KontrollPunkteD[3].Z := 10.0;
  118. end;
  119.  
  120. procedure TForm1.FormCreate(Sender: TObject);
  121. begin
  122.   CreateKontrollPunkte;
  123.  
  124.   if GL_LibHandle = nil then
  125.     InitOpenGL;
  126.  
  127.   DC := GetDC(Handle);
  128.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, Palette);
  129.   ActivateRenderingContext(DC, RC, True);
  130.  
  131.   wglMakeCurrent(DC, RC);
  132.  
  133.   Application.OnIdle := OnIdle;
  134. end;
  135.  
  136. procedure TForm1.FormDestroy(Sender: TObject);
  137. begin
  138.   Application.OnIdle := nil;
  139.   DeactivateRenderingContext;
  140.   DestroyRenderingContext(RC);
  141.   Finalize(KontrollPunkteA);
  142.   Finalize(KontrollPunkteB);
  143.   Finalize(KontrollPunkteC);
  144.   Finalize(KontrollPunkteD);
  145. end;
  146.  
  147. procedure TForm1.FormResize(Sender: TObject);
  148. begin
  149.   glViewport(0, 0, ClientWidth, ClientHeight);
  150. end;
  151.  
  152. procedure TForm1.OnIdle(aSender: TObject; var aDone: Boolean);
  153. begin
  154.   aDone := True;
  155.  
  156.   glClearColor(1, 1, 1, 1);
  157.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  158.  
  159.   glViewport(0, 0, ClientWidth, ClientHeight);
  160.  
  161.   glMatrixMode(GL_PROJECTION);
  162.   glLoadIdentity;
  163.  
  164.   OrthoLeft := Round(ClientWidth / 2 * -1);
  165.   OrthoRight := -OrthoLeft;
  166.   OrthoBottom := Round(OrthoLeft * ClientHeight / ClientWidth);
  167.   OrthoTop := -OrthoBottom;
  168.   glOrtho(OrthoLeft, OrthoRight, OrthoBottom, OrthoTop, 1, 100);
  169.  
  170.   gluLookAt(0, 0, 100, 0, 0, 0, 0, 1, 0);
  171.  
  172.   Render;
  173.  
  174.   SwapBuffers(DC);
  175. end;
  176.  
  177. procedure TForm1.Render;
  178. begin
  179.   glDisable(GL_LIGHT0);
  180.   glDisable(GL_LIGHTING);
  181.   glEnable(GL_MAP1_VERTEX_3);
  182.  
  183.   glColor3f(1, 0, 0);
  184.  
  185.   glPushMatrix;
  186.     glMap1f(GL_MAP1_VERTEX_3, 0, 4, 3, 5, @KontrollPunkteA[0]);
  187.     glMapGrid1f(50, 0, 4);
  188.     glEvalMesh1(GL_LINE, 0, 50);
  189.  
  190.     glMap1f(GL_MAP1_VERTEX_3, 0, 2, 3, 3, @KontrollPunkteB[0]);
  191.     glMapGrid1f(50, 0, 2);
  192.     glEvalMesh1(GL_LINE, 0, 50);
  193.  
  194.     glMap1f(GL_MAP1_VERTEX_3, 0, 1, 3, 2, @KontrollPunkteC[0]);
  195.     glMapGrid1f(50, 0, 1);
  196.     glEvalMesh1(GL_LINE, 0, 50);
  197.  
  198.     glMap1f(GL_MAP1_VERTEX_3, 0, 3, 3, 4, @KontrollPunkteD[0]);
  199.     glMapGrid1f(50, 0, 3);
  200.     glEvalMesh1(GL_LINE, 0, 50);
  201.   glPopMatrix;
  202. end;
  203.  
  204. end.
  205.  
  206.  


// Frase: Ich war mal so frei und hab die code-tags auf pascal geändert ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 11:59 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Das mit dem Hochladen hat nicht funktioniert.
Ich hoffe nun gehts!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 12:06 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
So,

alles komisch. Hier ein PDF


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 12:27 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hier noch einmal ein wenig was mathematisches.

Kann ich leider nicht so viel mit anfangen. Leider.

Wahrscheinlich befindet sich hier meine Antwort.

Hier der Link


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 13:22 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Mir nun auch klar, dass ich die Koeffizienten mit den Formel berechnun muss um auf die eigentlichen "Kurven Vcktoren" zu kommen.

Nehmen wir mal gleich als erstes die Formel wo u berechnet werden soll.

u = (s - par i-1) / (par i - par i-1)

Was muss man hier für s eintragen?

Für das 1. Kurvensegment:
par i = 0.0
par i-1 = 1.0
u = (s - 0.0) / (1.0 - 0.0)

aber was ist s?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 13:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Das Ergebnis welches ich bekomme sieht total falsch aus.

Wenn ich das richtig sehe sind die Koeffizienten dreidimensional, also ax ay az. Damit wäre das auch eine 3D-Kurve. Da die Abbildung nur 2D ist, ist das entweder eine Projektion der 3D-Kurve oder etwas ganz anderes. Vielleicht hast du ja doch das richtige.

Über die par wird gesteuert wann welches Segment benutzt wird:
Im Beispiel sind die par-Werte: 0, 1, 2, 2.7, 4
D.h um die komplette Kurze zu zeichnen lässt du s von 0 bis 4 laufen. Im Bereich 0 <= s < 1 wertest du das erste Segment aus, im Bereich 1 <= s <= 2 das zweite Segment usw...

u wird dann so berechnet, dass es für jedes Segment von 0 bis 1 läuft.


Ich muss übrigens anmerken, dass diese Art Kurven zu definieren sehr merkwürdig ist. Die Kurven werden durch willkürliche Koeffizienten definiert, da es sich um die Monom-Basis (*) handelt. (oder?) Bei der Verwendung von Bezierkurven oder B-Splines sind die Koeffizienten aber Kontrollpunkte die auch wirklich eine geometrische Bedeutung haben. Trägt man diese Kontrollpunkt in ein Koordinatensystem ein sieht man schon auf den ersten Blick wie die Kurve verlaufen wird. Mit B-Splines kann man zudem je nach Wunsch C^0, C^1 oder C^2 stetige Übergänge zwischen den Segmenten erzeugen.
=> Vielleicht einen Blick wert, je nach dem was du genau machst.


(*) also das Polynom hat die Form:
Code:
  1. f(x) = cn * x^n + ... + c1 * x^1 + c0 * x^0

Dann sind die x^i die Basis.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 13:58 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Vielen Dank für die schnelle Antwort.
Doch leider habe ich nur wenig verstanden.

Könntest du das noch einmal anhand der Beispieldaten (für das 1. Segment) beschreiben?

Wie soll ich s von 0 bis 4 durchlaufen lassen, wenn (0 <= s < 1) sein soll?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 14:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Die gesamte Kurve ist eine Funktion f(s), wobei der Parameter s zwischen 0 und 4 liegen darf und die Ausgabe ein 3D-Punkt (x,y,z) ist. Diese Funktion f hat intern eine Fallunterscheidung um das Segment i zu bestimmen:
Code:
  1. if (s < 0.0) then
  2.     // error
  3. else if (s < 1.0) then
  4.     i := 1;
  5. else if (s < 2.0) then
  6.     i := 2;
  7. else if (s < 2.7) then
  8.     i := 3;
  9. else if (s <= 4.0) then
  10.     i := 4;
  11. else
  12.     // error
  13. end;

Anhand von i berechnest du aus s den Parameter u, der dann zwischen 0 und 1 liegt:
Code:
  1. u := (s - par[i-1]) / (par[i] - par[i-1]);

Nun wertest du das Kurvensegment i an der Stelle u aus wie in Zusatz.pdf beschrieben, also die drei Funktionen x(u), y(u) und z(u).

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 14:21 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Danke!

Ich werde das heute Abend mal versuchen umzusetzen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.009s | 15 Queries | GZIP : On ]