autoRig - automatizar la creación de rigs

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

Moderadores: David, Tutores

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

autoRig - automatizar la creación de rigs

Mensajepor ikerJ » Mié Jul 21, 2010 10:06 pm

*** 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

Mensajepor melpermo » Jue Jul 22, 2010 11:08 am

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

Mensajepor melpermo » Jue Ago 12, 2010 4:06 pm

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

Mensajepor ikerJ » Dom Ago 15, 2010 10:58 pm

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

Mensajepor victorn » Mar Ago 24, 2010 8:33 pm



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

Mensajepor ikerJ » Sab Ago 28, 2010 3:55 pm

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"


Volver a “Convocatorias 2010”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado