AUTORIG Curso Abril 2011

Moderadores: David, Tutores

PabloPerez
Novato
Novato
Mensajes: 7
Registrado: Mié Abr 06, 2011 7:37 pm

Re: AUTORIG Curso Abril 2011

Mensajepor PabloPerez » Vie May 06, 2011 7:46 pm

Hola a todos, esta es una página con alguna referencia creo que interesante (charRigger 2.10 - ConstrainAB). Os la pongo esperando que sirva para ir sacando ideas. Un saludo.
http://www.comet-cartoons.com/maxscript.ph
Última edición por PabloPerez el Dom Ago 14, 2011 11:30 pm, editado 1 vez en total.

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

Re: AUTORIG Curso Abril 2011

Mensajepor ikerJ » Sab May 07, 2011 3:23 pm

Herramienta para crear el nombre inverso, y poder cambiar nombre de objetos.

He estado esta tarde jugueteando un poco con esto, y, basándome en una herramienta que vi igual de Luis San Juan, he hecho exactamente el mismo funcionamiento que ella. De hecho he estudiado una para programar la otra, así que bien.

Es bastante interesante la verdad. Se aprenden varias cositas interesantes. Sé que hay algunas cositas de código que son algo rarotas. He intentado comentarlo, pero todavía me debe quedar algo de informático programador, porque no comento muy bien, xDD.

Puede que falle en algún momento, podría ser. Cualquier cosita comentadme. Un saludo

http://dl.dropbox.com/u/248450/Macro-nameEditor.ms

Con respecto al macro. He comentado para que se pueda ejecutar sin más. Podríamos ponerlo y usarlo como macroscript. Creo yo que sería lo suyo. Sirve tanto para modificar rápidamente los nombres de los objetos sin tener que cambiar de panel como para copiar el inverso. Un saludo.
De nuevo, estupendo, Gorka. Y buena idea lo de los 'callbacks'. En general, los 'callbacks' son eventos que una vez definidos se quedan corriendo en segundo plano, a la espera de ser 'llamados'. Por ejemplo, Gorka ha definido uno en su 'script' que se ejecuta cada vez que se cambia de selección (#selectionSetChanged). Es un concepto muy muy interesante, algo avanzado para la gente que recién empieza a programar, pero que no está de más conocer aunque sea de oídas. De esta manera podríamos hacer que, por ejemplo, al abrir una escena nos apareciera un 'pop up' con información sobre la misma (usando #filePostOpen).

También podríamos crear un 'callback' que seleccionara uno o varios objetos dependiendo de lo que seleccionemos. Así, a bote pronto, podríamos definir un atributo para cada objeto que pudiésemos seleccionar que contuviera una lista de los objetos que queremos seleccionar al pinchar sobre ése (recorda aquello que comentamos que podíamos tener atributos en los objetos sin que estuvieran expuestos al usuario). ¿Para qué? Pues imaginad un 'rig' muy sencillo en el visor, sin controles flotando por ahí. Al seleccionar el antebrazo, éste se selecciona. Pero podríamos definir que pulsando cierta tecla y pinchar encima del antebrazo, se seleccionara, qué sé yo, el codo. Es un ejemplo que tal vez no sea demasiado práctico, pero ilustra un posible uso de los 'callbacks'.
Hola a todos, esta es una página con alguna referencia creo que interesante (charRigger 2.10 - ConstrainAB). Os la pongo esperando que sirva para ir sacando ideas. Un saludo.
http://www.comet-cartoons.com/maxscript.php
Buen apunte. Los 'scripts' son algo viejunos, porque hace años que Michael Comet trabaja en Maya, pero no por ello son menos interesantes. Una referencia también a tener muy en cuenta :)

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Mié May 11, 2011 6:36 pm

Hola chicos

Yo tambien estaba dandole vueltas a una herramienta como la de Gorka pero como él ya la tiene hecha magníficamente he decidido hacer algo mas genérico.
He creado una Tool que vale para cambiar parte de una cadena de texto por otro texto nuevo, ambos parámetros introducidos por el usuario. Uso cosas más sencillitas que las de Gorka pero creo que sirve para lo que se necesitaba.

Código: Seleccionar todo

rollout PartialRename "Partial Rename" ( edittext InText "Search:" width:200 Align:#Center labelontop:true-- cuadro de texto para escirbir lo que quieres cambiar edittext OutText "Replace with:" width:200 Align:#Center labelontop:true-- cuadro de texto para escribir el nuevo texto button RenameAll "Replace" Align:#Center Offset:[0,10] tooltip:"yeah"-- boton de empezar el proceso label ResultLog " " Align:#Center Offset:[0,10]-- texto no modificable por usuario on RenameAll pressed do ( ObjetosCambiados= 0-- creamos esta variable que luego nso dirá cuantos hemos cambiado for objetos in selection do ( CadenaSearchInput = "*" + (InText.text as String) + "*"--hace que el texto introducido sea valido para cualquier posicion /* los * funcionan de comodin para cualquier cantidad o tipo de texto .text llama al texto escrito en la ventana del edittext as String indica que lo convierte en texto los + se pueden usar para sumar las diferentes cadenas de texto en una sola */ NaS = objetos.name as string /* $ vs <NombreVariable> hay que usar objetos.name en lugar de $.name para aplicarselo a todos y cada uno de los objeto seleccionados */ Print ("Buscando " + InText.text as String+ " en "+ NaS)-- muestra en el listener la operacion llevada a cabo /*print todo lo que quieras que se IMPRIMA debe ir entre () sino, no aparecerá */ MP = matchpattern NaS pattern: CadenaSearchInput-- buscamos dentro del nombre del objeto el texto que hemos introducido /*matchpattern Booleana; devuelve resultado de TRUE o FALSE Matchpattern <string> pattern: <OtroString> si las variables tienen * no importa el lugar que ocupen dentro del nombre variables que usaremos para reemplazar en el nombre final del objeto */ CadenaSearch = InText.text as String CadenaReplace= OutText.text as string if MP == true then-- contemplamos los dos casos posibles mediante una condicional /*== vs = == sirve para comparación uno solo = es asignacion (variables) */ ( NewText= substitutestring NaS CadenaSearch CadenaReplace-- reemplazamos la parte deseada del nombre del objeto y lo guardamos como variable /*substiturestring Substitutestring <Texto completo> <parte del Texto que queremos cambiar> <nuevo texto> */ objetos.name = NewText-- aplicamos la variable creada anteriormente al nombre de los objetos seleccionados print ("Reemplazando por " + CadenaReplace as string)-- imprime que la accion se lleva a cabo ObjetosCambiados = ObjetosCambiados+1-- por cada cambio realizado suma 1 a variable. ) Else ( Print "Not found"-- imprime que no se ha podido realizar la accion ) ) ResultLog.text = ("Cambio realizado en " + (ObjetosCambiados as string) + " elementos de los "+ (selection.count as string)+" seleccionados" ) -- cambia el texto del LABEL por la informacion sobre los cambios realizados ) ) createDialog PartialRename width:300 --Crear ventana flotante donde irá la interfaz
A lo mejor tiene demasiados comentarios, pero es que como aún estoy aprendiendo, a parte de comentarios explicando qué hace cada paso me gusta añadir una "chuleta" de teoría sobre la sintaxis usada. Procuro ponerlo entre /**/ para que se pueda ocultar/elminar más facilmente

gmendieta
Junior
Junior
Mensajes: 44
Registrado: Jue Oct 08, 2009 10:47 am
Alumno: SI

Re: AUTORIG Curso Abril 2011

Mensajepor gmendieta » Jue May 12, 2011 11:36 pm

Tiene genial pinta tío!!!! Mola mola mola, mucho más conocimiento para manejar cadenas, jejeje. De hecho cuando dupliqué los huesos y controles y me puso el '01' al final de todo dije.... "hace falta algo que lo quite!!" jejeje.

Esta semana no he podido por curro, pero esa creción de piernas automatizada es nuestra, jejeje. Seguro que ya casi lo tenéis.

Un saludo

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Lun May 16, 2011 12:07 am

Bueno, quedamos en que haríamos una Pierna IK esta semana por Maxscript.

Lo he conseguido con bastante éxito y además le he añadido una interfaz de ensayo para lo que un día será un Señor Autorig,
helo aquí

Código: Seleccionar todo

rollout testrig "test" ( --elementos de la interfaz edittext RigName "Rig Name:" button createpoints "points" label TipLog " " button createIKbones "IK_bones" on createpoints pressed do ( global RN = RigName.text as String -- El texto que ha introducido a mano el usuario, se añadirá al nombre de los elementos autocreados --creamos los puntos guía para la colocacion de las articulaciones global HLeg01 =point name:(RN + "punto1") pos:[0,0,100] size: 5 box:on global HLeg02 =point name:(RN + "punto2") pos:[0,-1,50] size: 5 box:on global HLeg03 =point name:(RN + "punto3") pos:[0,0,0] size: 5 box:on /*Variable global: sirve para que sea valida en todo el código y no solo en su parentesis */ --damos un aviso del siguiente paso a seguir TipLog.text = "Mueve los puntos a la posicion deseada" ) on createIKbones pressed do ( --BONES --creamos los huesos que formarán la cadena IK BnIKleg01= BoneSys.createBone HLeg01.pos HLeg02.pos [0,0,1] BnIKleg02= BoneSys.createBone HLeg02.pos HLeg03.pos [0,0,1] BnIKleg03= BoneSys.createBone HLeg03.pos ((HLeg03.pos)+[0,0,-2]/*es un terminador, lo hacemos pequeñito a mano*/) [0,0,1] /*BoneSys.createBone BoneSys.createBone <posicion inicial> <posicion final> <eje Z> Las posiciones deben ser un Vector XYZ [0,0,0] al asignarle la .pos de un objeto ya creado conseguimos flexibilidad en el rig */ --remombramos los huesos BnIKleg01.name =(RN + "_IKLeg01") BnIKleg02.name =(RN + "_IKLeg02") BnIKleg03.name =(RN + "_IKLegTerm") --emparentamos los huesos BnIKleg02.parent = BnIKleg01 BnIKleg03.parent = BnIKleg02 --CONTROLES --creamos los controles de la rodilla HIKLegSolver =point name:(RN + "_IKSolverHelp") pos:((BnIKleg02.pos)+[0,-30,0]) size: 5 box:on axistripod: off CtrIKLegSolver = circle name:(RN+"_IKSolver01") pos: (HIKLegSolver.pos) radius:5 in coordsys HIKLegSolver CtrIKLegSolver.rotation = eulerangles 90 0 0 --SISTEMA IK --creamos el sistema IK CHLeg01= IKSys.ikChain BnIKleg01 BnIKleg03 "IKHISolver" /*IKsys.ikChain IKsys.ikChain <boneInicial> <boneFinal> <tipo de solver (string)> IKHISolver= cadena inversa de varios huesos */ --remombramos el sistema IK CHLeg01.name = (RN + "_IKLegCHAIN") --añadimos el Controlador de la Rodilla como Target del Solver CHLeg01.transform.controller.VHTarget = CtrIKLegSolver --Limpiamos el Texto de ayuda TipLog.text = "" ) ) --creamos la ventana que contiene esta Interfaz createDialog testrig width: 300 /*Problemas actuales -- si la rodilla no esta alineada al mundo hay problemas de alineamiento, sobretodo en el solverGOAL de la rodilla */
Como solo me he centrado en un tipo de pierna no me he enfrentado a problemas de linkajes e interrelaciones entre distintas partes del cuerpo. Tampoco me he metido a averiguar como funciona añadirle unas Listas de Transformación (que cosas como un ReverseFoot necesita) Eso lo dejo para otra semana.

Creo que es lo más sencillo que se puede ser dentro del rango de complejidad necesario para un AutoRig y fácil de entender como para ser capaces de añadir código a partir de él sabiendo lo que se hace

Ha sido bastante lioso encontrar los comandos de creacion de IKs y Bones, me he topado con eso de los SYS que funcionan algo diferente que crear "cosas", a ver si en las lecciones o Iker tienen a bien profundizar en sus diferencias. :dance:

Los problemas derivados de ello es que no supe poner nombres y otros parametros en el momento de la creación sin que petase, asi que como veis cuando necesitaba editar algo en ellos tenia que llamarlos una vez creados. Estoy seguro de que habrá una forma de dejar eso ajustado en el momento de la creación.

También tuve un problema similar rotando el Circle de control del IK. Se que funciona con un quaternion [0,0,0,0], pero por muchos numeritos que cambié no variaba en su creación. así que recurrí al CoordSys para rotarlo a posteriori

Otro fallo gordo que le veo es el que lleva comentado al final.

Y.. ¡nada más! Aqui a la espera de criticas y comentarios

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Mar May 17, 2011 11:02 pm

Hola de nuevo!
Hoy vengo de pataleta, etsoy intentando hacer lo que comentabamos el otro dia del solver de la rodilla IK, que pudiese o bien mantenerse linkado a la pierna o bien quedarse libre, en principio eso se consigue muy facilmente encendiendo y apagando el Weight de un position constraint (creo que en la corrección de Hector de la leccion 3 Iker lo hace)

El asunto es, cuando se activa para que siga la huella, yo quiero que sea de control libre por encima. E independientemente ambas maneras funcionan de perlas. El problema es que ahora, tras ver el método que se usa para hacer el SNAP IK FK he intentado montarme algo similar. pero no hay manera. siempre hay saltos de posicion lo haga como lo haga. Así que con toda la cara del mundo propongo como materia extra para la semana el conseguir un Control de rodilla IK que pueda quedarse libre o seguir a la huella y que tenga un Snap entre ambas opciones para evitar saltos

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

Re: AUTORIG Curso Abril 2011

Mensajepor ikerJ » Mié May 18, 2011 1:57 pm

¡Perfecto, Alberto! Como única recomendación, te diría que en lugar de declarar variables globales (que salvo casos excepcionales, suelen evitarse) dentro de un paréntesis, lo hicieras al principio del 'rollout'. Es decir, en lugar de:

Código: Seleccionar todo

rollout testrig "test" ( --elementos de la interfaz edittext RigName "Rig Name:" button createpoints "points" label TipLog " " button createIKbones "IK_bones" on createpoints pressed do ( global RN = RigName.text as String -- El texto que ha introducido a mano el usuario, se añadirá al nombre de los elementos autocreados --creamos los puntos guía para la colocacion de las articulaciones global HLeg01 = point name:(RN + "punto1") pos:[0,0,100] size: 5 box:on global HLeg02 = point name:(RN + "punto2") pos:[0,-1,50] size: 5 box:on global HLeg03 = point name:(RN + "punto3") pos:[0,0,0] size: 5 box:on /*Variable global: [...]
tendríamos...

Código: Seleccionar todo

rollout testrig "test" ( -- variables locales local HLeg01 local HLeg02 local HLeg03 --elementos de la interfaz edittext RigName "Rig Name:" button createpoints "points" label TipLog " " button createIKbones "IK_bones" on createpoints pressed do ( --creamos los puntos guía para la colocacion de las articulaciones HLeg01 = point name:(RN + "punto1") pos:[0,0,100] size: 5 box:on HLeg02 = point name:(RN + "punto2") pos:[0,-1,50] size: 5 box:on HLeg03 = point name:(RN + "punto3") pos:[0,0,0] size: 5 box:on
Lo mismo podríamos hacer con la cadena de texto que introduce el usuario como nombre. De ese modo, al cerrar la ventana de la herramienta las variables desaparecen con ella, lo cual es un poquito más limpio. Al definir la variable fuera de todos los paréntesis, cualquier cambio que reciba dentro de un paréntesis actualizará la variable. Es como si fuera una variable 'global', accesible en cualquier nivel, pero sólo dentro de la ventana.

¡Bien hecho!

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Jue May 19, 2011 6:06 am

Bueno.
Lo que tiene no tener que madrugar mañana es que entre unas cosas y otras tengo el autorig listo para crear una pierna con IK_FK_blend
Fue un poco jodienda porque el Listener deja de chivarte acciones una vez estás cambiando parametros dentro del Oriantation controller y similares.
Como de momento me estoy centrando en la pata no he empezado a relacionarlo con una "huella",todo se andará
A gozarlo

Código: Seleccionar todo

rollout LegRig "LegRig" ( -- variables locales local HLeg01 local HLeg02 local HLeg03 local HLeg04 local HLeg05 local RN Local HLegStart --variable local prueba Local BnMainleg01 Local BnMainleg02 Local BnMainleg03 Local BnMainleg04 /*TIP:Variables: Locales vs Globales Variable Local: sirve para que sea valida de su parentesis hacia "adentro" --es diferente de una: Variable global: sirve para que sea valida en todo el código y no solo en su parentesis */ --elementos de la interfaz edittext RigName "Rig Name:" label TipLog " " button createpoints "Reference_points" width: 100 button createMainBones "Main_bones" width: 100 enabled:false--el boton empieza apagado button createIKbones "IK_bones" width: 100 enabled:false--el boton empieza apagado button createFKControl "FK_Controls" width: 100 enabled:false--el boton empieza apagado on createpoints pressed do ( -- El texto que ha introducido a mano el usuario, se añadirá al nombre de los elementos autocreados RN = RigName.text as String --creamos los puntos guía para la colocacion de las articulaciones HLeg01 =point name:(RN + "_RefUpLeg") pos:[0,0,100] size: 5 box:on wirecolor:[14,255,2] HLeg02 =point name:(RN + "_RefDwnLeg") pos:[0,-1,55] size: 5 box:on wirecolor:[14,255,2] HLeg03 =point name:(RN + "_RefAnkle") pos:[0,0,5] size: 5 box:on wirecolor:[14,255,2] HLeg04 =point name:(RN + "_RefFoot") pos:[0,-10,0] size: 5 box:on wirecolor:[14,255,2] HLeg05 =point name:(RN + "_RefToePunta") pos:[0,-20,0] size: 5 box:on wirecolor:[14,255,2] --emparentamos los que consideremos oportunos HLeg04.parent = HLeg03 HLeg05.parent = HLeg04 --damos un aviso del siguiente paso a seguir TipLog.text = "Mueve los puntos a la posicion deseada" -- activamos el botón del siguiente paso createpoints.enabled = false createMainbones.enabled = true ) on createMainbones pressed do ( --creamos el point que será el padre y referencia de todas las piernas HLegStart = point name:(RN + "_LegStart") pos:(HLeg01.pos) size: 8 box:on wirecolor:[255,255,0] --BONES Main --creamos los huesos que formarán la cadena main usando como referencia de posicion los points auxiliares BnMainleg01= BoneSys.createBone HLeg01.pos HLeg02.pos [0,0,1] BnMAinleg02= BoneSys.createBone HLeg02.pos HLeg03.pos [0,0,1] BnMAinleg03= BoneSys.createBone HLeg03.pos HLeg04.pos [0,0,1] BnMAinleg04= BoneSys.createBone HLeg04.pos HLeg05.pos [0,0,1] --remombramos los huesos BnMainleg01.name =(RN + "_MainLeg01") BnMainleg02.name =(RN + "_MainLeg02") BnMainleg03.name =(RN + "_MainLeg03") BnMainleg04.name =(RN + "_MainLeg04") --emparentamos los huesos BnMainleg01.parent = HLegStart BnMainleg02.parent = BnMainleg01 BnMainleg03.parent = BnMainleg02 BnMainleg04.parent = BnMainleg03 --cambiamos apariencia BnMainleg01.taper = 0 BnMainleg02.taper = 0 BnMainleg03.taper = 0 BnMainleg04.taper = 0 BnMainleg01.wirecolor = [0,0,0] BnMainleg02.wirecolor = [255,255,0] BnMainleg03.wirecolor = [255,255,0] BnMainleg04.wirecolor = [255,255,0] --añadimos orientation constraints a los huesos, necesario para el IK FK blend BnMainleg01.rotation.controller = rotation_list ()--creamos un expression list BnMainleg01.rotation.controller.Available.controller = orientation_Constraint () -- al canal disponible le añadimos la orientacion BnMainleg01.rotation.controller.orientation_constraint.controller.relative = on-- activamos el keep initial offset BnMainleg02.rotation.controller = rotation_list () BnMainleg02.rotation.controller.Available.controller = orientation_Constraint () BnMainleg02.rotation.controller.orientation_constraint.controller.relative = on BnMainleg03.rotation.controller = rotation_list () BnMainleg03.rotation.controller.Available.controller = orientation_Constraint () BnMainleg03.rotation.controller.orientation_constraint.controller.relative = on BnMainleg04.rotation.controller = rotation_list () BnMainleg04.rotation.controller.Available.controller = orientation_Constraint () BnMainleg04.rotation.controller.orientation_constraint.controller.relative = on --Limpiamos el Texto de ayuda TipLog.text = "Crea los controles" --activamos las Cadenas secundarias createMainbones.enabled = false createIKbones.enabled = true createFKControl.enabled = true ) on createIKbones pressed do ( --creamos los huesos que formarán la cadena IK usando como referencia de posicion los points auxiliares BnIKleg01= BoneSys.createBone HLeg01.pos HLeg02.pos [0,0,1] BnIKleg02= BoneSys.createBone HLeg02.pos HLeg03.pos [0,0,1] BnIKleg03= BoneSys.createBone HLeg03.pos ((HLeg03.pos)+[0,0,-2]/*es un terminador, lo hacemos pequeñito a mano*/) [0,0,1] /*TIP:BoneSys.createBone BoneSys.createBone <posicion inicial> <posicion final> <eje Z> Las posiciones deben ser un Vector XYZ [0,0,0] al asignarle la .pos de un objeto ya creado conseguimos flexibilidad en el rig */ --remombramos los huesos IK BnIKleg01.name =(RN + "_IKLeg01") BnIKleg02.name =(RN + "_IKLeg02") BnIKleg03.name =(RN + "_IKLegTerm") --emparentamos los huesos IK BnIKleg01.parent = HLegStart BnIKleg02.parent = BnIKleg01 BnIKleg03.parent = BnIKleg02 --creamos los controles IK de la rodilla HIKLegSolver =point name:(RN + "_IKLeg_SolverHelp") pos:((BnIKleg02.pos)+[0,-30,0]) size: 5 box:on axistripod: off wirecolor:[220,130,0] CtrIKLegSolver = circle name:(RN+"_IKLeg_Solver01") pos: (HIKLegSolver.pos) radius:5 wirecolor:[225,198, 87] in coordsys HIKLegSolver CtrIKLegSolver.rotation = eulerangles 90 0 0 --creamos los helpers de Snap HIKLegSnapKnee =point name:(RN + "_IKLeg_SnapKnee") pos:(HIKLegSolver.pos) size: 2 box:on axistripod: on wirecolor:[255,0,0] HIKLegSnapFoot =point name:(RN + "_IKLeg_SnapFoot") pos:(HLeg03.pos) size: 2 box:on axistripod: on wirecolor:[255,0,0] --creamos el sistema IK CHLeg01= IKSys.ikChain BnIKleg01 BnIKleg03 "IKHISolver" /*TIP: IKsys.ikChain IKsys.ikChain <boneInicial> <boneFinal> <tipo de solver (string)> IKHISolver= cadena inversa de varios huesos */ --remombramos CHLeg01.name = (RN + "_IKLegCHAIN") --añadimos el Controlador de la Rodilla como Target del Solver CHLeg01.transform.controller.VHTarget = CtrIKLegSolver --creamos el helper de distancia en stretch ExpStretch = exposetm name:(RN + "_IKStretchLeg_ExposeTM") pos:(HLeg01.pos) wirecolor:[255,0,0] ExpStretch.parent = HLegStart-- padre del point start ExpStretch.useParent = off --desactivamos que coga el padre automaticamente(ya lo añadimos a mano nosotros) ExpStretch.localReferenceNode = HLegStart --añadimos el padre como nodo en sus porpiedades --añadimos a los Main Bones como targets de orientacion BnMainleg01.rotation.controller.orientation_constraint.constraints.appendtarget BnIKleg01 100 BnMainleg02.rotation.controller.orientation_constraint.constraints.appendtarget BnIKleg02 100 --Limpiamos el Texto de ayuda TipLog.text = "" --apagamos el boton createIKbones.enabled = false ) on createFKControl pressed do ( --test para funcionamiento de variables locales BnMainleg01.wirecolor = [255,255,0] --Controles FK CtrFKleg01 = circle name:(RN+"_CTR_FKLeg_01") pos: (HLeg01.pos) radius:10 wirecolor:[225,198, 87] CtrFKleg02 = circle name:(RN+"_CTR_FKLeg_02") pos: (HLeg02.pos) radius:10 wirecolor:[225,198, 87] CtrFKleg03 = circle name:(RN+"_CTR_FKFoot") pos: (HLeg03.pos) radius:10 wirecolor:[225,198, 87] CtrFKleg04 = circle name:(RN+"_CTR_FKToet") pos: (HLeg04.pos) radius:10 wirecolor:[225,198, 87] --alineamos al main bone para que funcione bien el Orientation Constraint in coordsys BnMainleg01 CtrFKleg01.rotation = eulerangles 0 0 0 in coordsys BnMainleg02 CtrFKleg02.rotation = eulerangles 0 0 0 in coordsys BnMainleg03 CtrFKleg03.rotation = eulerangles 0 0 0 in coordsys BnMainleg04 CtrFKleg04.rotation = eulerangles 0 0 0 --emparentamos CtrFKleg01.parent = HLegStart CtrFKleg02.parent = CtrFKleg01 CtrFKleg03.parent = CtrFKleg02 CtrFKleg04.parent = CtrFKleg03 --añadimos a los Main Bones como targets de orientacion BnMainleg01.rotation.controller.orientation_constraint.constraints.appendtarget CtrFKleg01 100 BnMainleg02.rotation.controller.orientation_constraint.constraints.appendtarget CtrFKleg02 100 BnMainleg03.rotation.controller.orientation_constraint.constraints.appendtarget CtrFKleg03 100 BnMainleg04.rotation.controller.orientation_constraint.constraints.appendtarget CtrFKleg04 100 --Limpiamos el Texto de ayuda TipLog.text = "" --Apagamos el boton createFKControl.enabled = false ) ) --creamos la ventana que contiene esta Interfaz createDialog LegRig width: 300 /*Problemas actuales -- si la rodilla no esta alineada al mundo hay problemas de alineamiento, sobretodo en el solverGOAL de la rodilla */
Además y por si fuera poco, como los circulos de control tienen que ir así alineados y no me apetecía tener que cambiarlo a mano o mergear objetos de otra escena de librería he empezado a trastear con creacion de Splines Customizadas tambien por Script. esto es lo que he sacado en limpio

Código: Seleccionar todo

fn drawLineBetween4Points pointA pointB pointC pointD= ( ss = SplineShape pos:pointA-- atajo para SplineShape addNewSpline ss addKnot ss 1 #bezier #curve PointA [-120,120,0] [-130,170,0] /* añadir nuevo vertice en spline(abreviada mas arriba) <#tipo de vertice> <# tipo de linea que sale del vertice> <nombredelpunto> [posicion de los tiradores] #smooth | #corner | #bezier | #bezierCorner -- tipos de vertice bezier y beziercorner necesitan posiciones de tirador y ser #curve #curve | #line -- tipos de linea */ addKnot ss 1 #corner #line PointB addKnot ss 1 #corner #line PointC addKnot ss 1 #corner #line PointD updateShape ss-- esto es necesario para evitar pete ss ) newSpline = drawLineBetween4Points [-100,100,0] [100,100,0] [100,-100,0] [-100,-100,0]-- posicion de los points nombrados en orden
No está ni por asomo acabado y aun tengo que averiguar como hacer que se cree en el punto que se quiera y aun mas imporante como cerrarla, que parecerá tonto, pero a las 6 de la mañana no es tan facil.

buenas noches/dias a todos

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Jue Jun 09, 2011 3:07 am

Buenas noches, acabo de ver En la corrección de Iker que me faltó por subir un archivo de Script sobre el que tenía una duda, asi que lo pongo aquí.
basicamente es una columna/twists hecha con una nurb

Código: Seleccionar todo

rollout NURBSpine "NurbSpline" ( --variables que usaremos en varios de los pasos local Start local End local RN --usuario elige nombre del rig edittext RigName "Rig Name:" button StartEnd "createStartEnd" on StartEnd pressed do ( RN = RigName.text as String --points que podrá recolocar el usuario Start =point name:(RN + "_RefUpSpine") pos:[0,0,100] size: 4 axistripod:off box:on centermarker:off cross:off wirecolor:[14,255,2] End =point name:(RN + "_RefDownSpine")pos:[0,0,0] size: 10 axistripod:off box:on centermarker:off cross:off wirecolor:[14,255,2] Start.parent = End ) button Nurb "createNurb" on Nurb pressed do ( --creamos points auxiliares entre el Start y el End Nurbhelp1 =point name:(RN + "_Rig_RefMidUpSpine") pos:[0,0,0] size: 5 box:on wirecolor:[14,255,2] --usamos Position Constraint para ajustar su posicion entre ambos NurbHelp1.pos.controller = position_list ()--creamos una lista de controles de posiciones NurbHelp1.pos.controller.Available.controller = position_Constraint () -- al canal disponible le añadimos el constraint NurbHelp1.pos.controller.position_constraint.controller.relative = off-- desactivamos el keep initial offset --añadimos como targets End y Start y ajustamos posiciones cambaindo las influencias NurbHelp1.pos.controller.position_constraint.constraints.appendtarget Start 66 NurbHelp1.pos.controller.position_constraint.constraints.appendtarget End 33 NurbHelp1.pos.controller.active = 2 NurbHelp2 =point name:(RN + "Rig_RefMidDwnSpine") pos:[0,0,0] size: 5 box:on wirecolor:[14,255,2] NurbHelp2.pos.controller = position_list () NurbHelp2.pos.controller.Available.controller = position_Constraint () NurbHelp2.pos.controller.position_constraint.controller.relative = off NurbHelp2.pos.controller.position_constraint.constraints.appendtarget End 66 NurbHelp2.pos.controller.position_constraint.constraints.appendtarget Start 33 NurbHelp2.pos.controller.active = 2 --creamos la Nurb nset = NURBSSet ()--es necesario crear una lista que gaurdará los parametros de la NURB hasta su creacion c = NURBSCVCurve name:(RN + "_Rig_SpineCVAux") order:4 numCVs:4 numKnots:8 /*nurbs order y knot son cosas internas de creacion y comportamiento de NURB CV = control vertices el numero de knots tiene que ser igual a la suma de order y CV o la nurb peta */ --de la mitad en adelante el numero final del knot tiene que ser mayor que el de la primera mitad, cambiarlos modifica la forma de la linea setKnot c 1 0 setKnot c 2 0 setKnot c 3 0 setKnot c 4 0 setKnot c 5 1 setKnot c 6 1 setKnot c 7 1 setKnot c 8 1 --creamos los vertices de control --sus posiciones son las de los helpers creados anteriormente cv = NURBSControlVertex Start.pos setCV c 1 cv cv.pos = NurbHelp1.pos setCV c 2 cv cv.pos = NurbHelp2.pos setCV c 3 cv cv.pos = end.pos setCV c 4 cv -- añadimos la NURBSCVCurve a la lista appendObject nset c -- creamos la NURB a partir de los datos almacenados en la Lista SpineN = NURBSNode nset name:(RN + "_SpineCVcurve") --añadimos el splineIK control a la Nurb addModifier SpineN (Spline_IK_Control ()) ui:on SpIK = SpineN.modifiers[#Spline_IK_Control]-- atajo hasta el modificador SpIK.linkTypes = 2-- el tipo 2 es en el que no están linkados entre sí SpIK.helper_size = 8 SpIK.createHelper 4-- creamos los helpers que controlan los vertices de la spline --recuperamos los helpers creados Hlp04 = SpIK.helper_list [1] Hlp03 = SpIK.helper_list [2] Hlp02 = SpIK.helper_list [3] Hlp01 = SpIK.helper_list [4] Hlp01.name = (RN + "_Rig_SpineKnot01") Hlp02.name = (RN + "_Rig_SpineKnot02") Hlp03.name = (RN + "_Rig_SpineKnot03") Hlp04.name = (RN + "_Rig_SpineKnot04") --path constraint points Path01 =point name:(RN + "_Rig_SpinePath01") pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path01.pos.controller = position_list ()--creamos una lista de controles de posiciones Path01.pos.controller.Available.controller = path_Constraint () -- al canal disponible le añadimos el constraint Path01.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path01.pos.controller.Path_Constraint.controller.percent = 100 deleteKeys Path01.pos.controller #allKeys-- accede al controlador y borra todas sus claves Path02 =point name:(RN + "_Rig_SpinePath02")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path02.pos.controller = position_list () Path02.pos.controller.Available.controller = path_Constraint () Path02.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path02.pos.controller.Path_Constraint.controller.percent = 83.33 deleteKeys Path02.pos.controller #allKeys Path03 =point name:(RN + "_Rig_SpinePath03") pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path03.pos.controller = position_list () Path03.pos.controller.Available.controller = path_Constraint () Path03.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path03.pos.controller.Path_Constraint.controller.percent = 66.66 deleteKeys Path03.pos.controller #allKeys Path04 =point name:(RN + "_Rig_SpinePath04") pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path04.pos.controller = position_list () Path04.pos.controller.Available.controller = path_Constraint () Path04.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path04.pos.controller.Path_Constraint.controller.percent = 50 deleteKeys Path04.pos.controller #allKeys Path05 =point name:(RN + "_Rig_SpinePath05")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path05.pos.controller = position_list () Path05.pos.controller.Available.controller = path_Constraint () Path05.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path05.pos.controller.Path_Constraint.controller.percent = 33.33 deleteKeys Path05.pos.controller #allKeys Path06 =point name:(RN + "_Rig_SpinePath06") pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path06.pos.controller = position_list () Path06.pos.controller.Available.controller = path_Constraint () Path06.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path06.pos.controller.Path_Constraint.controller.percent = 16.66 deleteKeys Path06.pos.controller #allKeys Path07 =point name:(RN + "_Rig_SpinePath07")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path07.pos.controller = position_list () Path07.pos.controller.Available.controller = path_Constraint () Path07.pos.controller.path_constraint.constraints.appendtarget SpineN 50 Path07.pos.controller.Path_Constraint.controller.percent = 0 deleteKeys Path07.pos.controller #allKeys --creamos los huesos BnNurb01= BoneSys.createBone Path01.pos Path02.pos [0,0,1] BnNurb02= BoneSys.createBone Path02.pos Path03.pos [0,0,1] BnNurb03= BoneSys.createBone Path03.pos Path04.pos [0,0,1] BnNurb04= BoneSys.createBone Path04.pos Path05.pos [0,0,1] BnNurb05= BoneSys.createBone Path05.pos Path06.pos [0,0,1] BnNurb06= BoneSys.createBone Path06.pos Path07.pos [0,0,1] BnNurb07= BoneSys.createBone Path07.pos (Path07.pos + [0,0,2]) [0,0,1] in coordsys BnNurb06 BnNurb07.rotation = eulerangles 0 0 0 BnNurb02.parent = BnNurb01 BnNurb03.parent = BnNurb02 BnNurb04.parent = BnNurb03 BnNurb05.parent = BnNurb04 BnNurb06.parent = BnNurb05 BnNurb07.parent = BnNurb06 BnNurb01.name =(RN + "_Rig_NurbSpineBone01") BnNurb02.name =(RN + "_Rig_NurbSpineBone02") BnNurb03.name =(RN + "_Rig_NurbSpineBone03") BnNurb04.name =(RN + "_Rig_NurbSpineBone04") BnNurb05.name =(RN + "_Rig_NurbSpineBone05") BnNurb06.name =(RN + "_Rig_NurbSpineBone06") BnNurb07.name =(RN + "_Rig_NurbSpineBoneTerm") -- alineamos los points a los huesos in coordsys BnNurb01 Path01.rotation = eulerangles 0 0 0 in coordsys BnNurb02 Path02.rotation = eulerangles 0 0 0 in coordsys BnNurb03 Path03.rotation = eulerangles 0 0 0 in coordsys BnNurb04 Path04.rotation = eulerangles 0 0 0 in coordsys BnNurb05 Path05.rotation = eulerangles 0 0 0 in coordsys BnNurb06 Path06.rotation = eulerangles 0 0 0 in coordsys BnNurb07 Path07.rotation = eulerangles 0 0 0 in coordsys BnNurb07 Hlp04.rotation = eulerangles 0 0 0 in coordsys BnNurb05 Hlp03.rotation = eulerangles 0 0 0 in coordsys BnNurb03 Hlp02.rotation = eulerangles 0 0 0 in coordsys BnNurb01 Hlp01.rotation = eulerangles 0 0 0 --empezamos los Constraints --Path points Orientation Constraints para la torsion uniforme de la columna Path01.rotation.controller = rotation_list () Path01.rotation.controller.Available.controller = orientation_Constraint () Path01.rotation.controller.orientation_constraint.constraints.appendtarget Hlp01 100 Path02.rotation.controller = rotation_list () Path02.rotation.controller.Available.controller = orientation_Constraint () Path02.rotation.controller.orientation_constraint.constraints.appendtarget Path01 66 Path02.rotation.controller.orientation_constraint.constraints.appendtarget Path04 33 Path03.rotation.controller = rotation_list () Path03.rotation.controller.Available.controller = orientation_Constraint () Path03.rotation.controller.orientation_constraint.constraints.appendtarget Path04 66 Path03.rotation.controller.orientation_constraint.constraints.appendtarget Path01 33 Path04.rotation.controller = rotation_list () Path04.rotation.controller.Available.controller = orientation_Constraint () Path04.rotation.controller.orientation_constraint.constraints.appendtarget Path01 50 Path04.rotation.controller.orientation_constraint.constraints.appendtarget Path07 50 Path05.rotation.controller = rotation_list () Path05.rotation.controller.Available.controller = orientation_Constraint () Path05.rotation.controller.orientation_constraint.constraints.appendtarget Path04 66 Path05.rotation.controller.orientation_constraint.constraints.appendtarget Path07 33 Path06.rotation.controller = rotation_list () Path06.rotation.controller.Available.controller = orientation_Constraint () Path06.rotation.controller.orientation_constraint.constraints.appendtarget Path07 66 Path06.rotation.controller.orientation_constraint.constraints.appendtarget Path04 33 Path07.rotation.controller = rotation_list () Path07.rotation.controller.Available.controller = orientation_Constraint () Path07.rotation.controller.orientation_constraint.constraints.appendtarget Hlp04 100 -- enganchamos los huesos a los path points BnNurb01.pos.controller = position_list () BnNurb01.pos.controller.Available.controller = position_Constraint () BnNurb01.pos.controller.position_constraint.controller.relative = off BnNurb01.pos.controller.position_constraint.constraints.appendtarget Path01 100 BnNurb01.pos.controller.active = 2 BnNurb01.rotation.controller = rotation_list () BnNurb01.rotation.controller.Available.controller = LookAt_Constraint () BnNurb01.rotation.controller.LookAt_constraint.constraints.appendtarget Path02 100 BnNurb01.rotation.controller.LookAt_Constraint.controller.pickUpNode = Path01 BnNurb01.rotation.controller.LookAt_Constraint.controller.upnode_world = off BnNurb01.rotation.controller.LookAt_Constraint.controller.viewline_length_abs = off BnNurb01.rotation.controller.active = 2 BnNurb02.pos.controller = position_list () BnNurb02.pos.controller.Available.controller = position_Constraint () BnNurb02.pos.controller.position_constraint.controller.relative = off BnNurb02.pos.controller.position_constraint.constraints.appendtarget Path02 100 BnNurb02.pos.controller.active = 2 BnNurb02.rotation.controller = rotation_list () BnNurb02.rotation.controller.Available.controller = LookAt_Constraint () BnNurb02.rotation.controller.LookAt_constraint.constraints.appendtarget Path03 100 BnNurb02.rotation.controller.LookAt_Constraint.controller.pickUpNode = Path02 BnNurb02.rotation.controller.LookAt_Constraint.controller.upnode_world = off BnNurb02.rotation.controller.LookAt_Constraint.controller.viewline_length_abs = off BnNurb02.rotation.controller.active = 2 BnNurb03.pos.controller = position_list () BnNurb03.pos.controller.Available.controller = position_Constraint () BnNurb03.pos.controller.position_constraint.controller.relative = off BnNurb03.pos.controller.position_constraint.constraints.appendtarget Path03 100 BnNurb03.pos.controller.active = 2 BnNurb03.rotation.controller = rotation_list () BnNurb03.rotation.controller.Available.controller = LookAt_Constraint () BnNurb03.rotation.controller.LookAt_constraint.constraints.appendtarget Path04 100 BnNurb03.rotation.controller.LookAt_Constraint.controller.pickUpNode = Path03 BnNurb03.rotation.controller.LookAt_Constraint.controller.upnode_world = off BnNurb03.rotation.controller.LookAt_Constraint.controller.viewline_length_abs = off BnNurb03.rotation.controller.active = 2 BnNurb04.pos.controller = position_list () BnNurb04.pos.controller.Available.controller = position_Constraint () BnNurb04.pos.controller.position_constraint.controller.relative = off BnNurb04.pos.controller.position_constraint.constraints.appendtarget Path04 100 BnNurb04.pos.controller.active = 2 BnNurb04.rotation.controller = rotation_list () BnNurb04.rotation.controller.Available.controller = LookAt_Constraint () BnNurb04.rotation.controller.LookAt_constraint.constraints.appendtarget Path05 100 BnNurb04.rotation.controller.LookAt_Constraint.controller.pickUpNode = Path04 BnNurb04.rotation.controller.LookAt_Constraint.controller.upnode_world = off BnNurb04.rotation.controller.LookAt_Constraint.controller.viewline_length_abs = off BnNurb04.rotation.controller.active = 2 BnNurb05.pos.controller = position_list () BnNurb05.pos.controller.Available.controller = position_Constraint () BnNurb05.pos.controller.position_constraint.controller.relative = off BnNurb05.pos.controller.position_constraint.constraints.appendtarget Path05 100 BnNurb05.pos.controller.active = 2 BnNurb05.rotation.controller = rotation_list () BnNurb05.rotation.controller.Available.controller = LookAt_Constraint () BnNurb05.rotation.controller.LookAt_constraint.constraints.appendtarget Path06 100 BnNurb05.rotation.controller.LookAt_Constraint.controller.pickUpNode = Path05 BnNurb05.rotation.controller.LookAt_Constraint.controller.upnode_world = off BnNurb05.rotation.controller.LookAt_Constraint.controller.viewline_length_abs = off BnNurb05.rotation.controller.active = 2 BnNurb06.pos.controller = position_list () BnNurb06.pos.controller.Available.controller = position_Constraint () BnNurb06.pos.controller.position_constraint.controller.relative = off BnNurb06.pos.controller.position_constraint.constraints.appendtarget Path06 100 BnNurb06.pos.controller.active = 2 BnNurb06.rotation.controller = rotation_list () BnNurb06.rotation.controller.Available.controller = LookAt_Constraint () BnNurb06.rotation.controller.LookAt_constraint.constraints.appendtarget Path07 100 BnNurb06.rotation.controller.LookAt_Constraint.controller.pickUpNode = Path06 BnNurb06.rotation.controller.LookAt_Constraint.controller.upnode_world = off BnNurb06.rotation.controller.LookAt_Constraint.controller.viewline_length_abs = off BnNurb06.rotation.controller.active = 2 BnNurb07.pos.controller = position_list () BnNurb07.pos.controller.Available.controller = position_Constraint () BnNurb07.pos.controller.position_constraint.controller.relative = off BnNurb07.pos.controller.position_constraint.constraints.appendtarget Path07 100 BnNurb07.pos.controller.active = 2 --borramos los auxiliares que no necesitamos --estos son SOLO de ayuda a la nurb, los helpers de construcción los dejamos delete NurbHelp1 delete NurbHelp2 ) ) createDialog NURBspine width: 300

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Mar Jun 28, 2011 6:12 pm

BUEEEEEEEEEEEENAS
Vuelvo a la carga con dos scripts que en realidad son uno y que solucionarán muchos muchos quebraderos de cabezas.
Basicamente he buscado la manera de hacer un Mirror de controladores que ya hayamos creado. con su rotacion y posicion equivalentes PERO sin la escala negativa que el MIRROR de 3DSMAX, tán majete él, nos cuela.

La primera variante funciona si ya tenemos los controles hechos y hacemos una copia de éstos para utilizar en el lado opuesto:

Código: Seleccionar todo

--elegir primero los originales y despues las copias que queremos reposicionar UNO POR UNO fn CtrMirror= ( --dos listas vacias, OrList = #() TarList = #() --separamos los objetos seleccionados en dos grupos --asumimos que la primera mitad son los originales y la segunda mitad los nuevos for X = 1 to selection.count do ( if X<= selection.count/2 then ( append Orlist (selection[X]) ) if X> selection.count/2 then ( append Tarlist (selection[X]) ) ) --para los objetos "emparejados" de cada lista, hacemos el alineamiento for PosAct = 1 to orlist.count do ( Origin= Orlist[PosAct] Target= Tarlist[PosAct] pos=Origin.position rot=Origin.rotation --Multiplicamos negativamente las rotaciones Z e Y, la X la dejamos igual Target.rotation = (quat rot.x (rot.y*-1) (rot.z*-1) rot.W) --cambiamos su posicion en X por la exactamente opuesta Target.pos = pos*[-1,1,1] ) ) CtrMirror()

La segunda variante, que a mi parecer mola mucho más pero tiene una pega, es una en la que simplemente tu seleccionas los objetos y él te crea unos similares opuestos:

Código: Seleccionar todo

fn CreateInverse= ( OrList = #() TarList = #() for each in selection do ( --añadimos la seleccion a la lista origen append OrList Each --creamos un point y lo añadimos a la lista target pt=point size: 5 centermarker:false cross:false box:true axistripod:false wirecolor:(each.wirecolor) --la posicion inicial del point es la del objeto que le corresponde, aunque esto no es necesario pt.transform = each.transform --igualamos el tipo de objeto del recien credao al tipo del original pt.baseobject = each.baseobject append TarList pt ) for PosAct = 1 to orlist.count do ( Origin= Orlist[PosAct] Target= Tarlist[PosAct] pos=Origin.position rot=Origin.rotation --Multiplicamos negativamente las rotaciones Z e Y, la X la dejamos igual Target.rotation = (quat rot.x (rot.y*-1) (rot.z*-1) rot.W) --cambiamos su posicion en X por la exactamente opuesta Target.pos = pos*[-1,1,1] ) ) CreateInverse()
Su problema: que solo se copia el objeto sin los modificadores que puediese tener añadidos, aunque esto a mano no cuesta nada, seria lo suyo hacerlo por script...
Aqui viene la duda para IKER (que aun tiene una rodilla por ahi pendiente :dance: ) cuando en MAX copio un modificador y se lo pego a otro objeto, el listener solo me chiva como si hubiese creado un modificador nuevo y en la ayuda me he perdido buscando "algo" relacionado. Asi pues: ¿como se copia y pega un modificador de un objeto a otro? y ¿como se se le aplica luego un Dettach?

Postdata: la operacion de mirror en sí: las ultimas lineas de código, son cortesía de un scriptillo que Paul Neale se hacía en un tutorial

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Jue Jul 07, 2011 2:47 am

Publicacion tardía como siempre, esta vez para subir una version definitiva de todas las herramientas que he creado y/o rceopilado a lo largo del curso.

contemplad...
Las AlberTools!

Código: Seleccionar todo

if AlberTools != undefined do destroydialog AlberTools rollout Albertools "AlberTools" ( subrollout Group1 "" ) rollout BnStretch "Create Stretchy Bones" ( --FUNCION PARA CREAR A PARTIR DE BONES fn BoneToStretch = ( --convertir cadenas de huesos a stretchy -- un array vacio al que añadiremos los puntos necesraios para una cadena Stretchy PtList= #() --por cada hueso existente en la seleccion: for each in selection do ( --creamos un point y lo añadimos a la lista pt=point size: 2 centermarker:false cross:false box:true axistripod:false wirecolor:[30,30,180] --lo alineamos con el bone pt.transform = each.transform append PtList pt ) --A cada hueso de 1 hasta (seleccion) for i = 1 to selection.count do ( --añadimos un position_constriant bn=selection[i] bn.pos.controller = position_constraint() --a ese constraint le añadimos como target el punto correspondiente de la lista bn.pos.controller.appendtarget PtList[i] 100 --añadimos el LookAt a todos los huesos menos al último if i < selection.count then ( bn.rotation.controller = lookat_constraint () bn.rotation.controller.appendtarget PtList [i+1] 100 bn.rotation.controller.lookat_vector_length=0 bn.rotation.controller.upnode_world=false bn.rotation.controller.pickupnode=PtList[i] ) ) ) --FUNCIONES PARA CREAR A PARTIR DE POINTS fn FromPT = ( fn makeNubBone lastBone =-- una funcion que crea un endbone a partir de un lastbone definido ( 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 ( 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 = Selection[selection.count] append theBones theNub append theCnts theNubCnt theNub.position.controller = Position_Constraint() 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] ) ) ) label Adv "Select in order either Bones or Points" Button FromBones "From Bones" Offset:[0,5] Button FromPoints "From Points" Offset:[0,5] on FromBones pressed do ( BoneToStretch() ) on FromPoints pressed do ( FromPT () ) ) rollout PartialRename "Partial Rename" ( edittext InText "Search:" width:200 Align:#Center labelontop:true-- cuadro de texto para escirbir lo que quieres cambiar edittext OutText "Replace with:" width:200 Align:#Center labelontop:true-- cuadro de texto para escribir el nuevo texto button RenameAll "Replace" Align:#Center Offset:[0,10] tooltip:"yeah"-- boton de empezar el proceso label ResultLog "Caps Lock Sensitive!" Align:#Center Offset:[0,10]-- texto no modificable por usuario on RenameAll pressed do ( --condicional para contemplar que pueda no haber nada seleccionado If selection.count >0 then ( -- creamos esta variable que luego nos dirá cuantos hemos cambiado ObjetosCambiados= 0 for objetos in selection do ( --hace que el texto introducido sea valido para cualquier posicion CadenaSearchInput = "*" + (InText.text as String) + "*"--Tip 01 NaS = objetos.name as string--Tip 02 -- muestra en el listener la operacion llevada a cabo Print ("Buscando " + InText.text as String+ " en "+ NaS)--Tip 03 -- buscamos dentro del nombre del objeto el texto que hemos introducido MP = matchpattern NaS pattern: CadenaSearchInput--Tip 04 CadenaSearch = InText.text as String CadenaReplace= OutText.text as string -- condicional para mostrar cuantos hemos cambiado if MP == true then--Tip 05 ( -- reemplazamos la parte deseada del nombre del objeto y lo guardamos como variable NewText= substitutestring NaS CadenaSearch CadenaReplace--Tip 06 -- aplicamos la variable creada anteriormente al nombre de los objetos seleccionados objetos.name = NewText -- imprime en el listener que la accion se lleva a cabo print ("Reemplazando por " + CadenaReplace as string) -- por cada cambio realizado suma 1 a variable. ObjetosCambiados = ObjetosCambiados+1 ) Else ( -- imprime en el Listener que no se ha podido realizar la accion Print "Not found" ) -- cambia el texto del LABEL por la informacion sobre los cambios realizados ResultLog.text = ("Changed " + (ObjetosCambiados as string) + " elements from the "+ (selection.count as string)+" selected" ) ) ) else ( --si no hubiese ningun objeto seleccionado da un mensaje de error messagebox "Select Something" ) ) ) rollout MirrorAlign "Mirror Align" ( label Adv1 "Aligns already created objects"Offset:[0,5] --Radiobuttons WhichOn "Axys:" labels:#("X","Y","Z") button RealignOpos "Align Opposite" Align:#Center tooltip:"The position of the second half of the selection is mirror-aligned with the first half"-- boton de empezar el proceso label Adv2 "Creates New objects in a mirrored position "Offset:[0,5] button CreateInv "Create Inverse" Align:#Center tooltip:"Creates New objects in a mirrored position "-- boton de empezar el proceso fn CtrMirror = ( --elegir primero los originales y despues las copias que queremos reposicionar UNO POR UNO --dos listas vacias, OrList = #() TarList = #() --separamos los objetos seleccionados en dos grupos --asumimos que la primera mitad son los originales y la segunda mitad los nuevos for X = 1 to selection.count do ( if X<= selection.count/2 then ( append Orlist (selection[X]) ) if X> selection.count/2 then ( append Tarlist (selection[X]) ) ) --para los objetos "emparejados" de cada lista, hacemos el alineamiento for PosAct = 1 to orlist.count do ( Origin= Orlist[PosAct] Target= Tarlist[PosAct] pos=Origin.position rot=Origin.rotation --Multiplicamos negativamente las rotaciones Z e Y, la X la dejamos igual Target.rotation = (quat rot.x (rot.y*-1) (rot.z*-1) rot.W) --cambiamos su posicion en X por la exactamente opuesta Target.pos = pos*[-1,1,1] ) ) fn CreateInverse = ( OrList = #() TarList = #() for each in selection do ( --añadimos la seleccion a la lista origen append OrList Each --creamos un point y lo añadimos a la lista target pt=point size: 5 centermarker:false cross:false box:true axistripod:false wirecolor:(each.wirecolor) --la posicion inicial del point es la del objeto que le corresponde, aunque esto no es necesario pt.transform = each.transform --igualamos el tipo de objeto del recien credao al tipo del original pt.baseobject = each.baseobject append TarList pt ) for PosAct = 1 to orlist.count do ( Origin= Orlist[PosAct] Target= Tarlist[PosAct] pos=Origin.position rot=Origin.rotation --Multiplicamos negativamente las rotaciones Z e Y, la X la dejamos igual Target.rotation = (quat rot.x (rot.y*-1) (rot.z*-1) rot.W) --cambiamos su posicion en X por la exactamente opuesta Target.pos = pos*[-1,1,1] ) ) on RealignOpos pressed do ( if selection.count < 2 then ( messagebox "select at least two objects" ) else ( CtrMirror() ) ) on CreateInv pressed do ( if selection.count <1 then ( messagebox "Select something" ) else ( CreateInverse() ) ) ) createDialog AlberTools width:300 height: 600 AddSubRollout Albertools.Group1 BnStretch AddSubRollout Albertools.Group1 PartialRename AddSubRollout Albertools.Group1 MirrorAlign Albertools.Group1.Height += 570
y como extra, un Script de creacion de cadenas BENDY con controladores CON UNA ÚNICA PEGA que paso a comentar a ver si alguien (CofIkerCof) puede solucionarme

Código: Seleccionar todo

fn drawSpline pointA pointB HandA HandB= ( SkinSpline = SplineShape pos:pointA-- atajo para SplineShape addNewSpline SkinSpline addKnot SkinSpline 1 #beziercorner #curve PointA PointA HandA--escondemos el segundo tirador no necesraio en la posiciond el vertice /* añadir nuevo vertice en spline(abreviada mas arriba) <#tipo de vertice> <# tipo de linea que sale del vertice> <nombredelpunto> [posicion de los tiradores] #smooth | #corner | #bezier | #bezierCorner -- tipos de vertice bezier y beziercorner necesitan posiciones de tirador y ser #curve #curve | #line -- tipos de linea */ addKnot SkinSpline 1 #beziercorner #curve PointB HandB PointB updateShape SkinSpline-- esto es necesario para evitar pete SkinSpline ) if BendyChain != undefined do destroydialog BendyChain rollout BendyChain "SkinSpline" ( --variables que usaremos en varios de los pasos local Start local End local Nurbhelp1 local Nurbhelp2 local SkinSpline local RN local ChainSkin01 local ChainSkin02 local ChainSkin03 local ChainSkin04 edittext RigName "Rig Name:" button StartEnd "create Ref Points" button CreateSpline "Create Bend Chain" on StartEnd pressed do ( RN = RigName.text as String --points que podrá recolocar el usuario Start =point name:(RN + "_RefUpBendChain") pos:[0,0,50] size: 10 axistripod:off box:on centermarker:off cross:off wirecolor:[14,255,2] End =point name:(RN + "_RefDownBendChain")pos:[0,0,0] size: 10 axistripod:off box:on centermarker:off cross:off wirecolor:[14,255,2] Start.parent = End --creamos points auxiliares entre el Start y el End Nurbhelp1 =point name:(RN + "_RefMidUpBendChain") pos:[0,0,0] size: 5 axistripod:off box:off centermarker:on cross:off wirecolor:[14,255,2] --usamos Position Constraint para ajustar su posicion entre ambos --creamos una lista de controles de posiciones NurbHelp1.pos.controller = position_list () -- al canal disponible le añadimos el constraint NurbHelp1.pos.controller.Available.controller = position_Constraint () -- desactivamos el keep initial offset NurbHelp1.pos.controller.position_constraint.controller.relative = off --añadimos como targets End y Start y ajustamos posiciones cambaindo las influencias NurbHelp1.pos.controller.position_constraint.constraints.appendtarget Start 66 NurbHelp1.pos.controller.position_constraint.constraints.appendtarget End 33 NurbHelp1.pos.controller.active = 2 NurbHelp2 =point name:(RN + "RefMidDwnBendChain") pos:[0,0,0] size: 5 axistripod:off box:off centermarker:on cross:off wirecolor:[14,255,2] NurbHelp2.pos.controller = position_list () NurbHelp2.pos.controller.Available.controller = position_Constraint () NurbHelp2.pos.controller.position_constraint.controller.relative = off NurbHelp2.pos.controller.position_constraint.constraints.appendtarget End 66 NurbHelp2.pos.controller.position_constraint.constraints.appendtarget Start 33 NurbHelp2.pos.controller.active = 2 ) on CreateSpline pressed do ( --CREACION DE LA SPLINE Y SUS CONTROLADORES --points que irán pesados a los vertices de la spline ChainSkin01 =point name:(RN + "Rig_BendChain_Skin01") pos:Start.pos size: 6 axistripod:off box:on centermarker:off cross:off wirecolor:blue ChainSkin02 =point name:(RN + "Rig_BendChain_Skin02") pos:NurbHelp1.pos size: 3 axistripod:off box:on centermarker:off cross:off wirecolor:blue ChainSkin03 =point name:(RN + "Rig_BendChain_Skin03") pos:NurbHelp2.pos size: 3 axistripod:off box:on centermarker:off cross:off wirecolor:blue ChainSkin04 =point name:(RN + "Rig_BendChain_Skin04") pos:End.pos size: 6 axistripod:off box:on centermarker:off cross:off wirecolor:blue --Spline SkinSpline = drawSpline Start.position End.position Nurbhelp1.position Nurbhelp2.position addModifier SkinSpline (Skin ()) ui:on SkinSpline.Name = (RN + "Rig_BendChain_Spline") select SkinSpline skinOps.addBone SkinSpline.modifiers[#Skin] ChainSkin01 1 skinOps.addBone SkinSpline.modifiers[#Skin] ChainSkin02 1 skinOps.addBone SkinSpline.modifiers[#Skin] ChainSkin03 1 skinOps.addBone SkinSpline.modifiers[#Skin] ChainSkin04 1 --Controladores ChainCTR01 = circle name:(RN + "CTR_BendChain01") pos: (ChainSkin02.pos) radius:6 wirecolor:[225,198, 87] ChainCTR02 = circle name:(RN + "CTR_BendChain01") pos: (ChainSkin03.pos) radius:6 wirecolor:[225,198, 87] --CREACION DE LA CADENA DE HUESOS --una lista donde almacenar los Bones del Bend local theBones = #() --creamos una lista donde almacenar los points del path local ThePaths = #() --creamos los points con un path a lo largo de la spline, equitativamente y los añadimos a la lista Path01 =point name:(RN + "_Rig_BendChainPath01")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path01.pos.controller = position_list () Path01.pos.controller.Available.controller = path_Constraint () Path01.pos.controller.path_constraint.constraints.appendtarget SkinSpline 50 Path01.pos.controller.Path_Constraint.controller.percent = 0 deleteKeys Path01.pos.controller #allKeys append ThePaths Path01 Path02 =point name:(RN + "_Rig_BendChainPath02")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path02.pos.controller = position_list () Path02.pos.controller.Available.controller = path_Constraint () Path02.pos.controller.path_constraint.constraints.appendtarget SkinSpline 50 Path02.pos.controller.Path_Constraint.controller.percent = 25 deleteKeys Path02.pos.controller #allKeys append ThePaths Path02 Path03 =point name:(RN + "_Rig_BendChainPath03")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path03.pos.controller = position_list () Path03.pos.controller.Available.controller = path_Constraint () Path03.pos.controller.path_constraint.constraints.appendtarget SkinSpline 50 Path03.pos.controller.Path_Constraint.controller.percent = 50 deleteKeys Path03.pos.controller #allKeys append ThePaths Path03 Path04 =point name:(RN + "_Rig_BendChainPath04")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path04.pos.controller = position_list () Path04.pos.controller.Available.controller = path_Constraint () Path04.pos.controller.path_constraint.constraints.appendtarget SkinSpline 50 Path04.pos.controller.Path_Constraint.controller.percent = 75 deleteKeys Path04.pos.controller #allKeys append ThePaths Path04 Path05 =point name:(RN + "_Rig_BendChainPath02")pos:[0,0,100] size: 5 axistripod:on box:off centermarker:off cross:off wirecolor:[0,0,0] Path05.pos.controller = position_list () Path05.pos.controller.Available.controller = path_Constraint () Path05.pos.controller.path_constraint.constraints.appendtarget SkinSpline 50 Path05.pos.controller.Path_Constraint.controller.percent = 100 deleteKeys Path05.pos.controller #allKeys append ThePaths Path05 -- una funcion que crea un endbone a partir de un lastbone definido 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 ) --creamos los huesos y los añadimos a una lista for i = 1 to ThePaths.count-1 do ( theBone = boneSys.createBone ThePaths[i].pos ThePaths[i+1].pos ThePaths[i].transform[3] append theBones theBone ) --creamos el hueso terminador llamando a la funcion theNub = makeNubBone theBones[theBones.count] theNubCnt = ThePaths.count append theBones theNub theNub.position.controller = Position_Constraint() theNub.position.controller.appendTarget ThePaths[ThePaths.count] 100 --linkamos y nombramos los huesos for i = 2 to theBones.count do ( theBones[i].parent = theBones[i-1] ) for i = 1 to theBones.count do ( theBones[i].name = (RN + "Rig_BendChain_Bone" + i as string) ) --asignamos controladores a los huesos for i = 1 to theBones.count-1 do ( theBones[i].position.controller = Position_Constraint() theBones[i].position.controller.appendTarget ThePaths[i] 100 theBones[i].rotation.controller = LookAt_Constraint() theBones[i].rotation.controller.appendTarget ThePaths[i+1] 100 theBones[i].rotation.controller.viewline_length_abs = false theBones[i].rotation.controller.upnode_world = false theBones[i].rotation.controller.pickUpnode = ThePaths[i] theBones[i].rotation.controller.upnodeAxis = 2 theBones[i].rotation.controller.stoUpAxis = 2 ) --alineamos todos los controladores en los mismos ejes que los huesos y emparentamos for i = 1 to ThePaths.count do ( ThePaths[i].parent = ChainSkin01 ThePaths[i].transform = ChainSkin01.transform ) ChainSkin01.transform = TheBones[1].transform ChainSkin02.transform = ChainSkin01.transform ChainSkin02.position = Nurbhelp1.position ChainSkin03.transform = ChainSkin01.transform ChainSkin03.position = Nurbhelp2.position ChainSkin04.transform = TheBones[TheBones.count].transform ChainCTR01.transform = ChainSkin02.transform ChainCTR02.transform = ChainSkin03.transform ChainSkin02.parent = ChainCTR01 ChainSkin03.parent = ChainCTR02 ChainCTR01.parent = ChainSkin01 ChainCTR02.parent = ChainSkin04 ) ) createDialog BendyChain width: 300

el problema: para que este Script funcione, tiene que estar activa la pestaña de MODIFY en el COMAND PANEL
Esto es porque mi Script añade Skin a la spline en un paso, pero necesito que para que las ordenes siguientes funcionen, el SKIN esté activo y Seleccionado en ese momento. Puedo forzar la seleccion de la SPLINE por código, pero dudo que se pueda seleccionar por código qué pestaña del comand panel es la activa....

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

Re: AUTORIG Curso Abril 2011

Mensajepor ikerJ » Jue Jul 07, 2011 2:56 am

pero dudo que se pueda seleccionar por código qué pestaña del comand panel es la activa....
Puede que no tenga todavía la solución al tema de la pierna... pero prueba esto:

max modify mode

:D :D :D :D :D :D :D

Y gracias por compartir las herramientas ;)

AlbertoFdez
Junior
Junior
Mensajes: 27
Registrado: Lun Abr 04, 2011 7:36 pm

Re: AUTORIG Curso Abril 2011

Mensajepor AlbertoFdez » Jue Jul 07, 2011 4:00 am

Je je je

Funciona perfectamente y eso de poder manejar el interfaz por código abre la puerta a muchas posibilidades (o no) ya le echaré un ojo más afondo.

No hay de qué en lo de las Tools, no las subí antes por que uno de los Scripts era de la escuela, pero todos los demás ya los habia publicado por el foro anteriormente, solo que ahora están bien ordenaditos.
:dance:
Y por cierto, debes de tener de hace un rato un mensaje de dimensiones biblicas sobre la correccion de la Leccion 09.


Volver a “Convocatoria Abril 2011”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados