Bezier-Kurven per OpenGL

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

BtbN

Betreff: Bezier-Kurven per OpenGL

BeitragSo, Jan 28, 2007 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin bei der durcharbeitung einiger OpenGL Tutorials darauf gestoßen, dass man mit OpenGL wunderbar Bezier-Kurven in der GraKa rendern kann, was das ganze sau schnell macht(Unter 1ms für eine Kurve).
Daraus geworden sind 2(naja, eigentlich nur eine, dazu später) funktionen:


Code: [AUSKLAPPEN]
Function DrawBezier(arr:Float[],stp:Int=50,range:Float=1.0)
   Global rscimg:TImage
   If Not rscimg Then rscimg = CreateImage(0,0)

   If arr.length Mod 2 <> 0 Then Return

   Local n:Int = arr.length/2
   Local points:Float[3*arr.length/2]

   For Local i:Int = 0 Until 3*arr.length/2 Step 3
      points[i] = arr[i/3*2]
      points[i+1] = arr[i/3*2+1]
      points[i+2] = 0.0
   Next

   glDisable(GL_TEXTURE_2D)

   glMap1f(GL_MAP1_VERTEX_3,0.0,range,3,n,points)
   glEnable(GL_MAP1_VERTEX_3)

   glMapGrid1f(stp,0.0,range)
   glEvalMesh1(GL_LINE,0,stp)

   glDisable(GL_MAP1_VERTEX_3)

   glEnable(GL_TEXTURE_2D)
   DrawImage(rscimg,0,0)
EndFunction


Function DrawBezierEx(arr:Float[],stp:Int=50,range:Float=1.0)
   If arr.length Mod 2 <> 0 Then Return

   Local n:Int = arr.length/2
   Local points:Float[3*arr.length/2]

   For Local i:Int = 0 Until 3*arr.length/2 Step 3
      points[i] = arr[i/3*2]
      points[i+1] = arr[i/3*2+1]
      points[i+2] = 0.0
   Next

   DisableTex()

   glMap1f(GL_MAP1_VERTEX_3,0.0,range,3,n,points)
   glEnable(GL_MAP1_VERTEX_3)

   glMapGrid1f(stp,0.0,range)
   glEvalMesh1(GL_LINE,0,stp)

   glDisable(GL_MAP1_VERTEX_3)
EndFunction


Der einzige unterschied ist, dass die erste funktion einen dreckigen Workaround benutzt, um ohne den aufruf von DisableTex() auszukommen. Dies ist nämlich Private im Modul BRL.GLMax2D. Dort muss man auch, um die Ex-Funktion nutzen zu können, das Private ganz oben auszukommentieren.

Die Funktion erwartet einen Parameter, ein Array mit einer geraden anzahl von elementen. Diese sind x und y koordinaten. Das erste x/y Paar ist der Startpunkt, das letze der endpunkt. Die zwischenpunkte dienen zur verformung der Kurve.
Die stp Parameter bestimmen die schritte der Kurve(Setz man ihn auf 1, ergibt sich eine gerade linie). Dieser muss eigentlich nie höher als 50 sein. Der letze Parameter kann eigentlich ignoriert werden. Er gibt an, bis wo die Kurve geht(normal geht sie von 0.0 bis 1.0). Dieser wert muss eigentlich nicht verändert werden.


Hier noch ein Beispiel:

Code: [AUSKLAPPEN]
SuperStrict


Framework BRL.GLMax2D

Graphics(1024,768,0,85)

Global time:Int

Repeat
Cls

   time = MilliSecs()
   DrawBezier([50.0,400.0,  300.0,0.0,  700.0,768.0,  930.0,400.0])
   DrawText((MilliSecs()-time),5,5)

Flip
Until KeyHit(KEY_ESCAPE)

End

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group