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"
Seguiremos informando en próximas horas...
