Twist with no flip

Moderadores: David, Tutores

jonathan
Junior
Junior
Mensajes: 36
Registrado: Mié Oct 05, 2011 3:14 pm

Twist with no flip

Mensajepor jonathan » Lun Nov 21, 2011 9:15 pm

Interesante pero tedioso tema para el asunto de los flips.

http://joleanes.com/tutorials/flippingl ... ess_01.php

jonathan
Junior
Junior
Mensajes: 36
Registrado: Mié Oct 05, 2011 3:14 pm

Re: Twist with no flip

Mensajepor jonathan » Mar Nov 22, 2011 2:50 am

Después de mirarlo bien no es tan tedioso, de hecho la solución de la página 2 creo que resulta verdaderamente útil, por ejemplo para las piernas, los personajes cartoon rompen las reglas contínuamente y ésto está directamente relacionado con el nivel técnico de nuestro rig, hecho que maldigo por todo lo alto!. He estado mirando el problema de la spine pero ese viene de otro lado, concretamente de los orientation constraints, hacen eso y no he encontrado información que explique algo. he encontrado un código de un pive que se lo hace pero bueno, es un poco incomprensible, no obstante lo dejo aquí por si alguno que esté más puesto en maxscript saca algo, en éste ejemplo la pena es que lo hace con una spline y además cuando la pones en vertical se crea un buevo flip, imagino que ésto no tiene que ser muy difícil de solucionar, puesto que si en horizontal no pasa será porque hay que cambiar el eje en el que le añade dos bezier float, pero claro lo óptimo sería implementar ésto sobre una CV de nurbs, además de entenderlo.

Código: Seleccionar todo

setCommandPanelTaskMode mode:#create start = dummy name:"start" pos:[0,0,0] boxsize:[10,10,10] out_start = in start dummy name:"out_start" pos:[33.33,0,0] boxsize:[2.5,2.5,2.5] setTransformLockFlags out_start #{2..9} --#all end = dummy name:"end" pos:[100,0,0] boxsize:[10,10,10] in_end = in end dummy name:"in_end" pos:[66.66,0,0] boxsize:[2.5,2.5,2.5] setTransformLockFlags in_end #{2..9} --#all start.rotation.controller = Euler_XYZ() end.rotation.controller = Euler_XYZ() wire = splineShape name:"wire" adaptive:on wirecolor:yellow addnewSpline wire addKnot wire 1 #corner #curve start.pos addKnot wire 1 #corner #curve end.pos setKnotType wire 1 1 #bezierCorner in coordsys world ( setOutVec wire 1 1 out_start.pos setInVec wire 1 2 in_end.pos setKnotType wire 1 2 #bezierCorner ) updateShape wire animateVertex wire #all wire.controller = Transform_Script script:"matrix3 1" setTransformLockFlags wire #all cc = wire[#Object__Editable_Spline][#Master].controller ps1 = point3_script () ps1.addNode "start" start ps1.setExpression "start.pos" ps2 = point3_script () ps2.addNode "end" end ps2.setExpression "end.pos" cc[#Spline_1___Vertex_1].controller = ps1 cc[#Spline_1___Vertex_2].controller = ps2 ps3 = point3_script () ps3.addNode "start" out_start ps3.setExpression "start.pos" ps4 = point3_script () ps4.addNode "end" in_end ps4.setExpression "end.pos" cc[#Spline_1___OutVec_1].controller = ps3 cc[#Spline_1___InVec_2].controller = ps4 for k=1 to 9 do ( factor = 10*k ghost = point name:("ghost" + k as string) axistripod:on box:on cross:off size:10 wirecolor:red setTransformLockFlags ghost #all ghost.rotation.controller = rc = Euler_XYZ() rc.x_rotation.controller = Float_List() rc.x_rotation.controller.Bezier_Float.controller = start.rotation.controller.x_rotation.controller rc.x_rotation.controller.Available.controller = end.rotation.controller.x_rotation.controller rc.x_rotation.controller.weight[1] = 100 - factor rc.x_rotation.controller.weight[2] = factor ghost.position.controller = pc = path_constraint path:wire percent:factor loop:off constantVel:on follow:on bank:off deletekeys pc.percent.controller #allkeys )

Pues eso, a reflexionar.., joe nos vamos a poner cuadraos Iker! nosé a ver que piensas tu de ésto. Un saludo

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

Re: Twist with no flip

Mensajepor ikerJ » Mié Dic 07, 2011 1:49 pm

¡Encontré una solución para evitar flipeos! La putada es que no se puede usar :-D

Estuvimos hablando de SLERP (Spherical Linear Interpolation), que es una función que interpola entre dos quaternions (básicamente, entre dos rotaciones) como alternativa al Orientation Constraint. Lo que ocurría es que también hacía 'pop' cuando la diferencia de ángulos entre los dos referentes era mayor que 180 grados, o menor que -180.

Bien, realmente SLERP está funcionando bien. Lo que no funciona bien es la conversión de rotaciones Euler (XYZ) a Quaternion, y eso es lo que provoca ese salto. Si usáis un controlador TCBRotation para los dos referentes, y usáis un Script Controller que lea esas dos rotaciones, y usáis como expresión:

Código: Seleccionar todo

slerp rotacionObj1 rotacionObj2 0.5
¡Yuju! ¡No hay flipeos! Pero como anticipaba es completamente inútil, porque aunque vinculemos esos puntos a controles no funcionará la interpolación de rotación a no ser que rotemos esos puntos directamente. Y los animadores no son demasiado amigos de los controladores TCB (¿alguien recuerda Biped?). Estuve intentando darle alguna vuelta para atar esos dos puntos a otros, pero no conseguí nada.

Seguiremos investigando...


Volver a “Convocatoria Octubre 2011”

¿Quién está conectado?

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