Ciudades y ciudadanos
Los problemas de un modelo articulado en Uvpov

Quienes hayan visto las escenas de las batallitas que celebramos de cuando en cuando sabrán que hace tiempo desarrollamos un método para articular en "POV" modelos importados. Gracias a esto podemos emplear un modelo almacenado en una postura determinada y, dando valores a las variables de rotación del fichero de jerarquía escrito para él, conseguir que el personaje adopte cualquier postura que queramos. Así pues es fácil suponer que nuestro deseo para las escenas de ciudades de hoy era emplear un único modelo importado para generar a todos los ciudadanos.

(Vamos a recordaros brevemente cómo se crea un modelo articulable para "POV", por si alguien desea probar este camino. Lo primero es obtener un fichero pov con la "traducción" del modelo que queremos importar. Esto podemos hacerlo utilizando 3ds2pov u otra buena herramienta de conversión. Deberemos conseguir un fichero donde cada pieza del personaje sea un objeto independiente. Después escribiremos el fichero-jerarquía creando una unión de uniones en la que cada objeto-hijo se vea afectado por las rotaciones de la pieza de mayor jerarquía. Así, al rotar un hombro la rotación afectará a todo el brazo, al rotar un codo rotarán tan sólo el antebrazo y la mano, etc. En la Figura 1 podéis ver cómo está escrita la jerarquía de un brazo derecho sencillo de sólo tres piezas).

La idea era crear variaciones de posturas desde Uvpov para cada ciudadano-copia (con mesh y mesh2, cada pieza sólo se almacena una vez. Después, cada vez que queramos emplearla de nuevo, "POV" hará referencia a ella añadiendo las variaciones de posición, escala y orientación que especifiquemos utilizando para ello una matriz de transformación interna, con lo que el gasto de memoria será mínimo). Al menos esta era la idea inicial pero pronto surgieron problemas que nos forzaron a cambiarla. El más importante estriba en que, al preparar las posturas moviendo las piezas del modelo "Poser" desde "POV", las uniones suavizadas entre las distintas piezas se pierden. Como sabéis, cuando cambiamos una postura desde "Poser", éste altera la malla del personaje para que siga habiendo una transición suave entre las piezas. De esta forma, y a menos que forcemos mucho la pose, el modelo seguirá viéndose como una figura sin fisuras. Pero, claro está, "POV" no está preparado para hacer lo mismo y por ello, si por ejemplo rotamos un brazo utilizando una sentencia rotate, entonces pronto apreciaremos un feo roto a la altura del hombro del modelo. ¿Por qué no se apreciaba este problema (o al menos no tanto) en las escenas de batallitas? Pues, en parte, porque creamos a los modelos pensando en este problema. El fallo visual puede reducirse en parte exportando varias posturas básicas desde "Poser" y limitando los movimientos del modelo articulado desde "POV", pero por esta vez decidimos prescindir de articular el modelo desde "POV". En lugar de esto optamos por limitarnos a usar tantas poses fijas de modelos de "Poser" como nos lo permitiese la memoria disponible en el sistema.

 
  Figura 1: Un brazo derecho articulado. La unión mano-arma se ve afectada por la rotación rotate <rbrazodX, rbrazodY, rbrazodZ> que se efectúa a la altura del hombro. Las sentencias translate se ponen porque la rotación debe efectuarse en el centro <0,0,0> de coordenadas. Así pues, antes de cada sentencia de rotación deberemos poner una sentencia translate para llevar el brazo a <0,0,0>. Después emplearemos otra sentencia translate inversa para devolver el brazo a la posición del hombro, donde debe estar. Naturalmente esto implica que antes de escribir el fichero que describe la jerarquía tendremos que haber tomado nota de los puntos de giro de cada pieza empleando algún modelador. Estos puntos de giro son las coordenadas donde gira cada pieza (el hombro, el antebrazo, etc.) y deberemos utilizarlos en las sentencias translate.

...
...
//brazo derecho union{ union{object{antebrazo_derecho}
//la mano y su arma cogen tambien el giro del antebrazo
union{object{mano_derecha} object{arma}
translate<39.5,-75,-2.5>
rotate <rmanodX, rmanodY, rmanodZ>
translate<-39.5,75,2.5>
}
translate<38,-104,-12>
rotate <rantebdX, rantebdY, rantebdZ>
translate<-38,104,12>
}
object{brazod_derecho}
translate<25,-136,-9>
rotate <rbrazodX, rbrazodY, rbrazodZ>
translate<-25,136,9>
}
...
...

 
 
Anterior Siguiente