A ver si me dan algunas luces con este rig

Cuestiones sobre el Rig de Personajes 3D

Moderadores: David, Tutores

Responder
kthalas
Mensajes: 4
Registrado: Mié Oct 06, 2010 10:21 pm

A ver si me dan algunas luces con este rig

Mensaje por kthalas »

Estoy tratando de recrear un rig de maya en max, este es el rig en cuestión: http://vimeo.com/49353110 (creo que no se pueden ver videos en el foro)

http://vimeo.com/49353110[/vimeo]

MAX no cuenta con follicles (por lo que se) así que no podemos hacer uso de las potentes coordenadas UV en un espacio XYZ :( (la herramienta de MAX, surface constraint no puede seguir superficies NURBS deformadas con modificadores) Sin embargo tenemos al querido Path constraint que nos viene bien. Ahora tengo el Rig armado (documento adjunto) pero no logro hacer que obtenga el comportamiento "FK" del video. Si activamos el "Follow" en el Helper que recorre el Path obtenemos "transformaciones dobles" en el shape de control :@ .

Estaba pensando en dejar de lado el llamado al controlador Euler y llamar a la rotacion del objeto en sí (del tipo Quat) para así añadir controllers (un orientation list) a los Shapes de control ya que con un orientation constraint + Euler XYZ se puede hacer que reaccionen a las rotaciones del otro. El problema se resume al comportamiento de los controles, ya que ofrecen una experiencia de animación poco intuitiva.

Para que trasteen el rig en forma automatizada les dejo el script (por ahí que me lo mejoran con un autorig :D ) :

Código: Seleccionar todo

vfkArray =  $*fk* as array
maxindex = 1
totalJoints = 1 as float
for theNull in vfkArray do (
	temp = filterString (theNull.name as string) "_"
	jointTemp = substring temp[1] 6 3
	j =  jointTemp as integer
	index = temp[3] as integer
	if index >= maxindex do (
		maxindex = index
	)
	if j >= totalJoints do (
		totalJoints = j+1 as float
	)
)
for i = 1 to maxindex do (
	for theNull in vfkArray do(
		temp = filterString (theNull.name as string) "_"
		index = temp[3] as integer
		jointTemp = substring temp[1] 6 3
		jo = jointTemp as float
		if index == i do (
			theScript = rotation_script()
			theNull.rotation.controller = theScript
			theCtrl = execute ("$trunkCtrl_0" + i as string + "_shp")
			-- CustomAtt = custAttributes.get theCtrl[4][1] 1
			joPos = ((jo-1.0)/(totalJoints-1.0)) as float
			theScript.AddConstant "allJnt" totalJoints
			theScript.AddConstant "jointPos" joPos
			theScript.AddNode "theCtrl"  theCtrl
			theScript.AddTarget "ctrlPos" theCtrl.modifiers[1].location.controller
			theScript.AddTarget "ctrlFalloff" theCtrl.modifiers[1].falloff.controller
			txt = "(\n"
			txt += "p=ctrlPos*0.01\n"
			txt += "f=ctrlFalloff*0.01\n"
			txt += "if ((p-f)<jointPos) and (jointPos<(p+f)) then (\n"
			txt += "if p>jointPos then falloffPos=(p-f) else falloffPos=(p+f)\n"
			txt += "tempMult = (jointPos-falloffPos)/(p-falloffPos)\n"
			txt += "numJnt = 2*f*allJnt\n"
			txt += "rotationMult = tempMult*(2/numJnt)\n"
			txt += "x = rotationMult*theCtrl.rotation.controller.x_rotation\n"
			txt += "y = rotationMult*theCtrl.rotation.controller.y_rotation\n"
			txt += "z = rotationMult*theCtrl.rotation.controller.z_rotation\n"
			txt += "rot = eulerAngles x y z\n"
			txt += ")\n"
			txt += "else rot = eulerAngles 0 0 0\n"
			txt += ")\n"
			txt += "eulerToQuat rot\n"
			theScript.setExpression txt
		)
	)
)
Bueno pues eso, me he topado con una pared :(
Adjuntos
trunk.rar
(26.41 KiB) Descargado 310 veces

Responder

Volver a “Rigging de Personajes 3D”