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
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.
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ątkowyV0
- pochodna zP0
P1
- punkt końcowyV1
- 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.
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ą.