autoRig - automatizar la creación de rigs

Mensajes de los cursos de junio y octubre del año 2010.

Moderadores: David, Tutores

Responder
ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

autoRig - automatizar la creación de rigs

Mensaje por ikerJ »

*** DESARROLLO DE UN AUTORIG ***

Una de las ideas que se propuso en las lecciones primeras fue la importancia de automatizar procesos, para ahorrarnos tiempo y esfuerzo, evitar las tareas repetitivas y deshacernos de posibles 'errores humanos' que se produzcan al trabajar manualmente.

Obviamente, la creación de herramientas para generar 'rigs' automáticamente conlleva tiempo y esfuerzo, pero creo que la recompensa es mayor, y además de poder cumplir los puntos anteriores habremos ganado experiencia resolviendo los problemas que nos hayamos encontrado por el camino.

*** ¿POR DÓNDE EMPEZAMOS? ***

Antes de ponernos a escribir una sola línea de código, tenemos que diseñar qué es lo que hará la herramienta. A estas alturas ya sabemos que el 'rig' de un personaje está compuesto de varios sistemas: brazos, tronco, piernas... Cada una de estas partes, a su vez, de varias 'capas': 'main', FK, IK, 'stretch', 'twists'...

Un buen diseño pasa por tener funciones genéricas que nos permitan crear los sistemas con independencia de la parte. Es decir, nuestras funciones para crear cadenas IK nos servirán para piernas y brazos, por ejemplo.

Hay gente que prefiere tener todo el código en un solo archivo, y hay otros que prefieren tener un archivo por cada solución. Cada uno tiene sus pros y sus contras, y sólo la experiencia es la que puede determinar qué os va a venir mejor. Como muestra, puedo deciros que mi herramienta de 'autorig' consiste en una ventana (un 'script') que dependiento la configuración elegida ejecuta uno o varios 'scripts' que están en la misma carpeta.

Como decía más arriba, necesitamos funciones genéricas que podamos usar en cualquier parte durante la construcción. Así, la columna tipo 2 y tipo 3 comparten, por ejemplo, el hecho de que sus huesos sean 'elásticos'. Pues podemos escribir una función genérica a la que le pasemos dos puntos, y nos cree un hueso con ese comportamiento, independientemente de lo que
queramos hacer con él más adelante:

Código: Seleccionar todo


--select two points and run the code below for creating a 'stretchy' bone

fn makeNubBone lastBone =
(
	
	local pos = lastBone.transform[4] -- get the position of the last bone. 
	local xDir = lastBone.transform[1] -- get the vector of the X point.
  
	local startPoint = pos + xDir * lastBone.length 
	local endPoint = startPoint + xDir * lastBone.width
  
	local nubBone = boneSys.createBone startPoint endPoint lastBone.transform[3] -- create the bone.
  
	nubBone.width = lastBone.width
	nubBone.height = lastBone.height
	nubBone.wireColor = lastBone.wireColor
  
	nubBone.parent = lastBone
	nubBone.name = lastBone.name + "_Nub"
  
	return nubBone
)

if selection.count == 2 then
(
	if classof selection[1] == Point and classof selection[2] == Point then
	(
		thePoints = selection as array;

		theBone = boneSys.createBone thePoints[1].pos thePoints[2].pos thePoints[1].transform[3]

		theNub = makeNubBone theBone

		theBone.position.controller = Position_Constraint()
		theBone.position.controller.appendTarget thePoints[1] 100

		theNub.position.controller = Position_Constraint()
		theNub.position.controller.appendTarget thePoints[2] 100

		theBone.rotation.controller = LookAt_Constraint()
		theBone.rotation.controller.appendTarget thePoints[2] 100
		theBone.rotation.controller.viewline_length_abs = false
		theBone.rotation.controller.upnode_world = false
		theBone.rotation.controller.pickUpnode = thePoints[1]
		theBone.rotation.controller.upnodeAxis = 2
		theBone.rotation.controller.stoUpAxis = 2
	)
	else messageBox "Selected objects must be points"
	
)
else messageBox "Please select two objects"

Fijáos cómo para crear un hueso elástico hemos usado una función 'genérica', para generar un 'nub' (hueso terminador pequeñito al final de una cadena).

Seguiremos informando en próximas horas... ;)

melpermo
Novato
Novato
Mensajes: 7
Registrado: Lun Jun 21, 2010 9:50 am

Re: autoRig - automatizar la creación de rigs

Mensaje por melpermo »

Hola a todos,

En enlaces interesantes publiqué varias direcciones de rigs. En una de ellas se trata de un autorig para crear tentáculos del cual os podéis descargar el script. Y puede serviros de guía y ejemplo.

Os paso el enlace por si os interesa.

http://foros.animum3d.com/viewtopic.php ... 1158#p2902

Un saludo

melpermo
Novato
Novato
Mensajes: 7
Registrado: Lun Jun 21, 2010 9:50 am

Re: autoRig - automatizar la creación de rigs

Mensaje por melpermo »

Hola todos!

En la respuesta anterior os hacia referencia a una dirección donde podíamos ver el rig del caminar de una araña. Ahora he encontrado un nuevo sitio donde se explica como realizar este tipo de rig. Es muy completo viene la explicación y además el archivo de script para descargar y el archivo max para poder trabajarlo.

Si hubiese sabido todo esto en la lección 2.

Este es el enlace:

http://www.lotsofrobots.com/Web3/Tutori ... /Index.htm

Espero que os guste

Un saludo

ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Re: autoRig - automatizar la creación de rigs

Mensaje por ikerJ »

Muy bueno lo de la araña, no lo conocía :)

victorn
Novato
Novato
Mensajes: 9
Registrado: Mié Jun 16, 2010 8:24 pm
Alumno: NO
Contactar:

Re: autoRig - automatizar la creación de rigs

Mensaje por victorn »



Haciendo pruebas de la captura de pantalla, he sacado este vídeo. Podéis ver como funciona el snap del brazo y aunque solo aparece el brazo, ya tengo un generador del esqueleto completo con twist en brazos y piernas.

Un saludo.

ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Re: autoRig - automatizar la creación de rigs

Mensaje por ikerJ »

Eso lleva muy buena pinta, Víctor :-)

Aquí os dejo la versión 'ampliada' del creador de huesos elásticos. Como dijimos, ahora soporta más de dos puntos, con lo que se pueden crear 'cadenas elásticas'. ¡Allá va!

Código: Seleccionar todo


--select two points or more points and run the code below for creating a 'stretchy' bone or a 'stretchy' chain

fn makeNubBone lastBone =
(   
   local pos = lastBone.transform[4] -- get the position of the last bone. 
   local xDir = lastBone.transform[1] -- get the vector of the X point.
  
   local startPoint = pos + xDir * lastBone.length 
   local endPoint = startPoint + xDir * lastBone.width
  
   local nubBone = boneSys.createBone startPoint endPoint lastBone.transform[3] -- create the bone.
  
   nubBone.width = lastBone.width
   nubBone.height = lastBone.height
   nubBone.wireColor = lastBone.wireColor
  
   nubBone.parent = lastBone
   nubBone.name = lastBone.name + "_Nub"
  
   return nubBone
)

fn pointFilt o = (ClassOf o == Point)

if selection.count == 2 do
(
   if classof selection[1] == Point and classof selection[2] == Point then
   (
      thePoints = selection as array;

      theBone = boneSys.createBone thePoints[1].pos thePoints[2].pos thePoints[1].transform[3]

      theNub = makeNubBone theBone

      theBone.position.controller = Position_Constraint()
      theBone.position.controller.appendTarget thePoints[1] 100

      theNub.position.controller = Position_Constraint()
      theNub.position.controller.appendTarget thePoints[2] 100

      theBone.rotation.controller = LookAt_Constraint()
      theBone.rotation.controller.appendTarget thePoints[2] 100
      theBone.rotation.controller.viewline_length_abs = false
      theBone.rotation.controller.upnode_world = false
      theBone.rotation.controller.pickUpnode = thePoints[1]
      theBone.rotation.controller.upnodeAxis = 2
      theBone.rotation.controller.stoUpAxis = 2
   )
   else messageBox "Selected objects must be points"   
)

if selection.count > 2 do
(
	theCnts = #()
	theBones = #()
	for i = 1 to (selection.count-1) do
	(
-- 			if classof selection[1] == Point and classof selection[2] == Point then
	
		thePoints = selection as array
		theCnt = point transform:thePoints[i].transform box:on cross:off axisTripod:off size:1
		theCnt.parent = thePoints[i]
		theBone = boneSys.createBone thePoints[i].pos thePoints[i+1].pos thePoints[i].transform[3]
		append theCnts theCnt		
		append theBones theBone		
	)
	
	theNub = makeNubBone theBones[theBones.count]
	theNubCnt = point transform:theNub.transform box:on cross:off axisTripod:off size:2
	append theBones	theNub
	append theCnts theNubCnt
	theNub.position.controller = Position_Constraint()
	--theTarget = (pickObject prompt:"enter a point" filter:pointFilt)
	theNub.position.controller.appendTarget theCnts[TheCnts.count] 100

	for i = 1 to theBones.count-1 do
	(	
		theBones[i].position.controller = Position_Constraint()
		theBones[i].position.controller.appendTarget theCnts[i] 100				
		theBones[i].rotation.controller = LookAt_Constraint()
		theBones[i].rotation.controller.appendTarget theCnts[i+1] 100
		theBones[i].rotation.controller.viewline_length_abs = false
		theBones[i].rotation.controller.upnode_world = false
		theBones[i].rotation.controller.pickUpnode = theCnts[i]
		theBones[i].rotation.controller.upnodeAxis = 2
		theBones[i].rotation.controller.stoUpAxis = 2					
	)
	
	for i = 2 to theBones.count do
	(
		theBones[i].parent = theBones[i-1]
	)		
)

else messageBox "Please select two objects"

Responder

Volver a “Convocatorias 2010”