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

Aktuelle Zeit: Sa Jul 19, 2025 21:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Jun 07, 2005 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Ich möchte so eine Nurbskurve dritten Gerades erzeugen.

So wie auf diesem Bild aus dem Tutorial Abseits Eckiger Welten
Bild


Im Tutorial ist allerdings nur die Formel für eine Kurve 2 Gerades angegeben. Für Kurven höheren Grades ist im Tutorial diese allgemeine Gleichung angegeben, wobei n der Gerad der Kurve ist und i die Nummer der Basisfunktion:
Tutorial Abseits eckiger Welten hat geschrieben:
Bild

Ich habe mir daraus eine Kurve für den dritten Gerad erstellt, erhalte aber komische Ergebnisse:
Code:
  1.  
  2. p0*(1-t)³ + p1*3*t(1-t)² + p2*3*t²(1-t) + p3*t³
  3.  


Nun stelle ich mir die Frage ob meine Formel falsch ist, oder ob ich anders wo nach dem Fehler suchen muss.

MfG
Flo[/img]

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Zuletzt geändert von Flo am Di Jun 07, 2005 21:43, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 19:03 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Ich entschuldige mich, aber ich poste dir mal etwas für Beizer :
Code:
  1.  
  2. type
  3.   TPoint_3D_S = record
  4.   X,Y,Z : Single;
  5.   end;
  6.  
  7.  
  8. function PointOnCurve(p1, p2, p3, p4: TPoint_3D_S; t : Single) : TPoint_3D_S;
  9. var var1, var2, var3 : Single;
  10. begin
  11.     var1 := 1 - t;
  12.  
  13.     var2 := var1 * var1 * var1;
  14.  
  15.     var3 := t * t * t;
  16.  
  17.     Result.x := var2*p1.x + 3*t*var1*var1*p2.x + 3*t*t*var1*p3.x + var3*p4.x;
  18.     Result.y := var2*p1.y + 3*t*var1*var1*p2.y + 3*t*t*var1*p3.y + var3*p4.y;
  19.     Result.z := var2*p1.z + 3*t*var1*var1*p2.z + 3*t*t*var1*p3.z + var3*p4.z;
  20. end;
  21.  

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 19:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Das ist das gleiche. Und deine Berechung hier ist nur eine Umsetztung der Formel des dritten Grades. Ich hab das ganze nochmal geprüft. Die Formel scheint richtig zu sein.

Ich hab das ganze nicht mit Delphi gemacht sondern mit der Skriptsprache von Warcraft 3. Da ich absolut keinen Fehler bei mir entdecken kann, fällt mir als einzigst mögliche Erklärung ein das sich die Rundungsfehler so stark auswirken.

Mein Code:

Code:
  1.  
  2.         set udg_Weg_t = ( I2R(GetForLoopIndexA()) / 100.00 )
  3.         set udg_Weg_t2 = ( 1.00 - udg_Weg_t )
  4.  
  5.         set udg_Weg_Faktor[0] = ( udg_Weg_t2 * ( udg_Weg_t2 * udg_Weg_t2 ) )
  6.         set udg_Weg_Faktor[1] = ( 3.00 * ( udg_Weg_t * ( udg_Weg_t2 * udg_Weg_t2 ) ) )
  7.         set udg_Weg_Faktor[2] = ( 3.00 * ( ( udg_Weg_t * udg_Weg_t ) * udg_Weg_t2 ) )
  8.         set udg_Weg_Faktor[3] = ( udg_Weg_t * ( udg_Weg_t * udg_Weg_t ) )
  9.  
  10.         set udg_Ziel_X = ( ( ( udg_Weg_Faktor[0] * udg_Weg_Punkt_X[0] ) + ( udg_Weg_Faktor[1] * udg_Weg_Punkt_X[1] ) )
  11.                          + ( ( udg_Weg_Faktor[2] + udg_Weg_Punkt_X[2] ) + ( udg_Weg_Faktor[3] * udg_Weg_Punkt_X[3] ) ) )
  12.         set udg_Ziel_Y = ( ( ( udg_Weg_Faktor[0] * udg_Weg_Punkt_Y[0] ) + ( udg_Weg_Faktor[1] * udg_Weg_Punkt_Y[1] ) )
  13.                          + ( ( udg_Weg_Faktor[2] + udg_Weg_Punkt_Y[2] ) + ( udg_Weg_Faktor[3] * udg_Weg_Punkt_Y[3] ) ) )
  14.  
  15.  



//Edit: OMG so dargestellt erkennt man den Fehler sofort! ein + statt einem * ...
MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 19:22 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
[edit] *hmpf* zu langsam ... naja beim nächsten mal vielleicht :-) [/edit]

Sofern das hoch x bei zB p0*(1-t)³ nur auf (1-t) bezogen ist sollte es eigentlich passen, denn eingesetzt:
f(0) = p0
f(1) = p3
Wodurch Anfangs- und Endpunkt durch die richtigen Punkte gehen sollten.
Und wenn man das jetz differenziert:
f'(t) = -3 p0 (1 - t)^2 + 3 p1 (1 - t)^2 - 6 p1 (1 - t) t + 6 p2 (1 - t) t - 3 p2 t^2 + 3 p3 t^2
und da jetzt eingesetzt erhält man für
f'(0) = - 3 p0 + 3 p1
f'(1) = - 3 p2 + 3 p3
Wodurch am Anfang und am Ende auch die Richtung passen sollte.

Wenn das nicht der Fall ist, hat einer von uns 2 nen Blödsinn gebaut :-).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 19:26 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Die Formel scheint richtig zu sein.

Ja die ist richtg. Ich wusste nur nicht dass Nurbs und Beizer das Gleiche ist.

EDIT
Es muss 0 <= t <= 1 erfühlt sein.[/code]

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 19:33 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
sniper_w hat geschrieben:
Ja die ist richtg. Ich wusste nur nicht dass Nurbs und Beizer das Gleiche ist.

Es ist auch nicht das Gleiche. Bezier Kurven sind Kurven (Strecken, wenn man so möchte). Nurbs sind Flächen, die sich zusätzlich trimmen lassen (löcher reinschneiden, etc.).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 19:56 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Wie ist das den kann man Die Kurfen auch durch den Punkt legen lassen, ohne alles selber zu berechnen?

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 07, 2005 23:29 
Offline
DGL Member

Registriert: Mi Apr 13, 2005 16:06
Beiträge: 67
Wohnort: Fulda
Zitat:
Es ist auch nicht das Gleiche. Bezier Kurven sind Kurven (Strecken, wenn man so möchte). Nurbs sind Flächen, die sich zusätzlich trimmen lassen (löcher reinschneiden, etc.).


Da muss ich widersprechen. NURBS sind prinzipiell auch erstmal Kurven. Beide lassen sich auch zu Flächen verbinden. Der eigentliche Unterschied liegt in der mathematischen Beschreibung, oder genauer in der Basisfunktion, welche bei NURBS auf B-Splines und bei Bézier auf dem Bernsteinpolynom beruht.

Der praktische Unterschied ist natürlich die Möglichkeit, NURBS zu trimmen.

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 08, 2005 12:13 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Zitat:
Wie ist das den kann man Die Kurfen auch durch den Punkt legen lassen, ohne alles selber zu berechnen?

Falls du ne cubische Interpolation meinst, da musste die Coeffizienten anders berechnen:
Code:
  1.  
  2.      Coeff[0] := (x4 - x3) - (x1 - x2);
  3.      Coeff[1] := (x1 - x2) - Coeff[0];
  4.      Coeff[2] := x3 - x1;
  5.      Coeff[3] := x2;
  6.  

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 18:46 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
AL hat geschrieben:
Zitat:
Wie ist das den kann man Die Kurfen auch durch den Punkt legen lassen, ohne alles selber zu berechnen?

Falls du ne cubische Interpolation meinst, da musste die Coeffizienten anders berechnen:
Code:
  1.  
  2.      Coeff[0] := (x4 - x3) - (x1 - x2);
  3.      Coeff[1] := (x1 - x2) - Coeff[0];
  4.      Coeff[2] := x3 - x1;
  5.      Coeff[3] := x2;
  6.  


Berechnen wäre kein Problem, sowas lernt man ja schließlich in der Schule, aber ich möchte es halt OpenGL machen lassen( Automatisch )!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 09, 2005 18:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es gab von NVidia auf der GF3 mal eine Extension die dreieckige und viereckige Bezier Patches mit HW Unterstützung zeichnen konnte. Das besondere war, dass man für jede Kante einen Gleitkommawert für die Unterteilung angeben konnte, so dass es kein Problem war die Flächen aneinander zu setzen. Leider war das ganze recht langsam und wurde in späteren Treibern wieder entfernt.
Dann gibt's da noch die glEval Funktionen aus dem normalen OpenGL.


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


Wer ist online?

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