2009-06-23 21 views
9

¿Cómo puedo dibujar las curvas de Hermite con OpenGL? ¿Hay alguna función incorporada? Vi algunos ejemplos en línea que muestran cómo usar los evaluadores para dibujar las curvas de Bezier pero no pudieron encontrar ninguna información para las curvas de Hermite.Dibujando curvas de Hermite en OpenGL

Respuesta

1

Puede convertir cualquier curva de Hermite en una curva de Bezier y luego dibujar eso. Simplemente se definen usando dos bases diferentes en C3. Google no fue muy útil, y parece que esta sería una pregunta común, por lo que deberíamos intentar que la respuesta de StackOverflow sea definitiva, tal vez con algún código de muestra. Regresaré mañana con más.

6

Como mencionó Steven, puede convertir una curva de Hermite cúbica en una curva de Bezier cúbica. En realidad es bastante simple.

una curva típica de Hermite cúbico se define con dos puntos y dos vectores:

  • P0 - Punto de inicio
  • V0 - derivada en P0
  • P1 - punto final
  • V1 - derivado en P1

La conversión a un Bezier es simplemente:

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

Luego, puede dibujar su curva de Bezier usando y evaluador o cualquier otra forma que desee.

11

Deje que el vector de puntos de control para su Bezier sea [b0 b1 b2 b3] y los de su Hermite sean [h0 h1 v0 v1] (v0 y v1 sean la derivada/tangente en los puntos h0 y h1). Entonces podemos usar una forma de matriz para mostrar las conversiones:

Hermite en Curva

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

(esto es exactamente como en la respuesta de Naaff, arriba).

Bezier a 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] 

Así que en la matriz forman estos son quizás un poco más complejo que sea necesario (después de todo código de Naaff fue breve y al grano). Es útil, porque podemos ir más allá de los Hermitas muy fácilmente ahora.

En particular, podemos traer la otra curva paramétrica cúbica cardinal clásica: la curva Catmull-Rom. Tiene puntos de control [c_1 c0 c1 c2] (a diferencia de las curvas de Bezier, la curva se extiende desde el segundo hasta el tercer punto de control, de ahí la numeración habitual desde -1). Las conversiones a Bezier son entonces:

Catmull-Rom en Curva

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

que pueda hacer el Hermite a par Catmull-Rom también, pero están rara vez se usa, ya que Bezier es normalmente la representación principal.