2009-06-23 10 views
9

Jak rysować krzywe hermitów za pomocą OpenGL, czy są jakieś wbudowane funkcje? Widziałem kilka przykładów on-line, które pokazują, jak używać ewaluatorów do rysowania krzywych Beziera, ale nie mogłem znaleźć żadnych informacji dla krzywych Hermite'a.Rysowanie krzywych Hermitów w OpenGL

Odpowiedz

1

Możesz przekształcić dowolną krzywą Hermita w krzywą Beziera, a następnie narysować. Są one po prostu zdefiniowane przy użyciu dwóch różnych baz w C3. Google nie był zbyt użyteczny i wydaje się, że jest to typowe pytanie, więc powinniśmy postarać się, aby odpowiedź StackOverflow była ostateczna, może z pewnym przykładowym kodem. Wrócę jutro z więcej.

6

Jak wspomniał Steven, możesz przekształcić sześcienną krzywą Hermita w sześcienną krzywą Beziera. To całkiem proste.

Typowa krzywa sześcienny Hermite'a jest zdefiniowana dwoma punktami i dwa wektory:

  • P0 - punkt początkowy
  • V0 - pochodna z P0
  • P1 - punkt końcowy
  • V1 - pochodna: P1

Konwersja do Baziera jest prosta:

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

Następnie można narysować krzywą Beziera używania i oceniający lub jakikolwiek inny sposób chcesz.

11

Niech wektor punktów kontrolnych dla twojego Beziera będzie [b0 b1 b2 b3] a wektor dla twojego Hermite'a [h0 h1 v0 v1] (v0 i v1 są pochodną/styczną w punktach h0 i h1). Wtedy możemy użyć postaci macierzowej pokazać konwersje:

Hermite'a do Beziera

 
[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] 

(jest to dokładnie tak, jak w odpowiedzi Naaff jest powyżej).

Bézier do Hermite'a

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

Tak więc w matrycy tworząc to może nieznacznie bardziej skomplikowane niż w razie potrzeby (po kodzie wszystkie Naaff była krótka i punkt). Jest to przydatne, ponieważ możemy teraz bardzo łatwo wyjść poza Hermity.

W szczególności możemy wprowadzić inną klasyczną, sześcienną krzywą parametryczną: krzywą Catmull-Rom. Ma punkty kontrolne [c_1 c0 c1 c2] (w przeciwieństwie do krzywych Beziera krzywa przebiega od drugiego do trzeciego punktu kontrolnego, stąd zwyczajowa numeracja od -1). Konwersje do Beziera są następnie:

Catmull-Rom do Beziera

 
[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] 

Beziera do 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] 

mogę zrobić Hermite'a do pary Catmull-Rom też, ale oni są rzadko używane, ponieważ Bezier jest zwykle główną reprezentacją.