Bezier-Kurven per OpenGL
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
BtbNBetreff: Bezier-Kurven per OpenGL |
So, Jan 28, 2007 21:05 Antworten mit Zitat |
|
---|---|---|
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 |
||
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group