2011-06-27 19 views
7

En mi investigación OpenGL (OpenGL Red Book, creo) encontré un ejemplo de un modelo de un brazo robot articulado que consiste en un "brazo superior", un "brazo inferior", una "mano" y cinco o más "dedos". Cada una de las secciones debería poder moverse de forma independiente, pero restringida por las "articulaciones" (los "brazos" superior e inferior siempre están conectados en el "codo").OpenGL pregunta moderna

En modo inmediato (glBegin/glEnd), usan una malla de un cubo, llamada "miembro", y utilizan copias escaladas de esta malla única para cada una de las partes del brazo, mano, etc. "Movimientos" se lograron empujando las rotaciones en la pila de la matriz de transformación para cada una de las siguientes articulaciones: hombro, codo, muñeca, nudillo: se entiende la imagen.

Ahora, esto resuelve el problema, pero como usa el modo inmediato obsoleto, todavía no entiendo la solución a este problema en un contexto OpenGL moderno. Mi pregunta es: ¿cómo abordar este problema usando OpenGL moderno? En particular, ¿debería cada "miembro" individual realizar un seguimiento de su propia matriz de transformación actual ya que las pilas de la matriz ya no son kosher?

Respuesta

3

Bastante. Si realmente lo necesita, implementar su propia interfaz tipo pila es bastante simple. Literalmente solo almacenarías una pila, luego implementarías cualquier operación de matriz que necesites usando tu biblioteca matemática preferida, y tendrías alguna forma de inicializar tu uniforme de matriz deseado usando el elemento superior de la pila.

En su ejemplo de brazo robótico, suponga que el enlace se representa como un árbol (o incluso un gráfico, si lo prefiere), con las transformaciones relativas especificadas entre cada cuerpo. Para dibujar el brazo del robot, simplemente hace un recorrido de esta estructura de datos y establece la transformación de cualquier cuerpo de niño que sea la transformación del cuerpo principal compuesta por la suya. Por ejemplo:

def draw_linkage(body, view): 

    //Draw the body using view matrix 

    for child, relative_xform in body.edges: 

     if visited[child]: 
      continue 

     draw_linkage(child, view * relative_xform) 
1

En el caso de piezas rígidas, conectadas por juntas, uno generalmente trata cada parte como una submatriz individual, cargando la matriz apropiada antes del dibujo.

En el caso de mallas "conectadas"/"continuas", como una cara, la animación generalmente ocurre a través de los huesos y los objetivos de deformación. Cada uno de ellos define una deformación y a cada vértice de la malla se le asigna un peso, qué tan fuerte se ve afectado por cada deformador. Técnicamente, esto también se puede aplicar a un modelo de extremidades rígidas, dando a cada miembro un deformador único que no sea cero.

Cualquier sistema de animación decente realiza un seguimiento de las transformaciones (matrices) de todos modos, las funciones de matriz de OpenGL raramente se utilizan en aplicaciones serias (ya que se había inventado OpenGL). Pero generalmente las transformaciones se almacenan en una jerarquía.

1

Generalmente lo hace a un nivel superior a OpenGL con un scenegraph.

La misma matriz se transforma en cada nodo en el árbol de gráfico de escenas, simplemente haga un mapa simplemente en las matrices OpenGL, por lo que es bastante eficiente.

Cuestiones relacionadas