2009-06-23 13 views
9

Wie kann ich Hermite-Kurven mit OpenGL zeichnen, gibt es eingebaute Funktionen? Ich habe einige Online-Beispiele gesehen, die zeigen, wie man mit Bezierern Bezier-Kurven zeichnet, aber keine Informationen für Hermite-Kurven finden konnte.Zeichnen von Hermite-Kurven in OpenGL

Antwort

1

Sie können jede Hermite-Kurve in eine Bezier-Kurve umwandeln und dann diese zeichnen. Sie werden einfach mit zwei verschiedenen Basen in C3 definiert. Google war nicht sehr nützlich und es scheint, als ob dies eine allgemeine Frage wäre. Daher sollten wir versuchen, die StackOverflow-Antwort definitiv zu machen, vielleicht mit einem Beispielcode. Ich komme morgen mit mehr zurück.

6

Wie von Steven erwähnt, können Sie eine kubische Hermite-Kurve in eine kubische Bezier-Kurve umwandeln. Es ist eigentlich ganz einfach.

Eine typische kubische Hermite-Kurve ist mit zwei Punkten und zwei Vektoren definiert:

  • P0 - Startpunkt
  • V0 - Derivat an P0
  • P1 - Endpunkt
  • V1 - Ableitung bei P1

Die Umwandlung in einen kubischen Bezier ist einfach:

B0 = P0 
B1 = P0 + V0/3 
B2 = P1 - V1/3 
B3 = P1 

Sie dann ziehen können Bezier-Kurve mit und Auswertungsprogramm oder irgendeine anderen Art und Weisen Sie es wünschen.

11

Lassen Sie den Vektor der Kontrollpunkte für Ihre Bezier [b0 b1 b2 b3] und diejenigen für Ihre Hermite sein [h0 h1 v0 v1] (v0 und v1 ist die Ableitung/Tangente an den Punkten h0 und h1). Dann können wir eine Matrixform verwenden, um die Conversions zu zeigen:

Hermite zu Bezier

 
[b0] = 1 [ 3 0 0 0] [h0] 
[b1] - [ 3 0 1 0] [h1] 
[b2] 3 [ 0 3 0 -1] [v0] 
[b3]  [ 0 3 0 0] [v1] 

(das ist genau wie in Naaff Antwort, oben).

Bezier hermite

 
[h0] = [ 1 0 0 0] [b0] 
[h1] [ 0 0 0 1] [b1] 
[v0] [-3 3 0 0] [b2] 
[v1] [ 0 0 -3 3] [b3] 

So in Matrix diese vielleicht leicht sind bilden komplexer als nötig (schließlich Naaff Code war kurz und auf den Punkt). Es ist nützlich, weil wir jetzt sehr einfach über Hermites hinausgehen können.

Insbesondere können wir die andere klassische kardinale kubische parametrische Kurve einbringen: die Catmull-Rom-Kurve. Es hat Kontrollpunkte [c_1 c0 c1 c2] (im Gegensatz zu Bezierkurven verläuft die Kurve vom zweiten zum dritten Kontrollpunkt, daher die übliche Nummerierung von -1). Die Umwandlungen zu Bezier sind dann:

Catmull-Rom zu Bezier

 
[b0] = 1 [ 0 6 0 0] [c_1] 
[b1] - [-1 6 1 0] [c0] 
[b2] 6 [ 0 1 6 -1] [c1] 
[b3]  [ 0 0 6 0] [c2] 

Bezier zu Catmull-Rom

 
[c_1] = [ 6 -6 0 1] [b0] 
[c0] [ 1 0 0 0] [b1] 
[c1] [ 0 0 0 1] [b2] 
[c2] [ 1 0 -6 6] [b3] 

ich auch die Hermite zu Catmull-Rom Paar tun können, aber sie‘ selten verwendet, da Bézier normalerweise die primäre Repräsentation ist.