Gracias Gracias:  0
Resultados 1 al 4 de 4

Tema: auto-Snap para IK FK

  1. #1
    Senior Member
    Fecha de ingreso
    Jun 2002
    Ubicación
    Euskadi
    Mensajes
    568

    Blender Auto-Snap para IK/FK

    Hola a todos.
    Me estoy blenderizando...bueno... creo que ya he terminado de blenderizarme y me e convertido en un blenderadicto.
    Estoy trasteando con el tema de los rigs y quería darle una vuelta de tuerca más y poner un control con autosnap ik/fk, el tema ese de que se me pase de ik a fque y viceversa sin perder las posiciones y rotaciones... como de programar no tengo ni idea estuve buscando a ver si alguien había hecho algo de eso y encontré un link, con un blend con su código, pero no consigo que me funcione, el lo hizo para la v 2.5 pero en la actual no consigo que chute. Se que han cambiado algunas cosas en el tema de la programación pero es que yo de esto ni p. idea, a ver si alguien me echa una manita que agradezco de antemano y aquí dejo la información:
    el video en cuestión es este:



    Y el código que no se por que no funciona es este, edito para que quede más mono
    Código:
    import bpy
    import mathutils
    from mathutils import *
    
    
    ###########################
    
    class snap_fk_ik(bpy.types.Panel):
     bl_label = "Snap FK/IK" 
     bl_space_type = "VIEW_3D" 
     bl_region_type = "UI" 
    # bl_context = "object" 
    
     def draw_header(self, context): 
     layout = self.layout 
    
     
     def draw(self, context):
     
     layout = self.layout
     col = layout.column()
     row = col.row(align=True)
     
     row.operator("snap_FK", text="fk-->ik")
     row.operator("snap_IK", text="ik-->fk")
    
    ################################
    
    def getmat(bone, active, context, ignoreparent):
     '''Helper function for visual transform copy,
     gets the active transform in bone space
     '''
     data_bone = context.active_object.data.bones[bone.name]
     #all matrices are in armature space unless commented otherwise
     otherloc = active.matrix #final 4x4 mat of target, location.
     bonemat_local = Matrix(data_bone.matrix_local) #self rest matrix
     if data_bone.parent:
     parentposemat = Matrix(
     context.active_object.pose.bones[data_bone.parent.name].matrix)
     parentbonemat = Matrix(data_bone.parent.matrix_local)
     else:
     parentposemat = bonemat_local.copy().identity()
     parentbonemat = bonemat_local.copy().identity()
     if parentbonemat == parentposemat or ignoreparent:
     newmat = bonemat_local.invert() * otherloc
     else:
     bonemat = parentbonemat.invert() * bonemat_local
    
     newmat = bonemat.invert() * parentposemat.invert() * otherloc
     return newmat
    
    
    ###############################
    
    def rotcopy(item, mat):
     '''copy rotation to item from matrix mat depending on item.rotation_mode'''
     if item.rotation_mode == 'QUATERNION':
     item.rotation_quaternion = mat.rotation_part().to_quat()
     elif item.rotation_mode == 'AXIS_ANGLE':
     quat = mat.rotation_part().to_quat()
     item.rotation_axis_angle = Vector([quat.axis[0],
     quat.axis[1], quat.axis[2], quat.angle])
     else:
     item.rotation_euler = mat.rotation_part().to_euler(item.rotation_mode)
     
    ###############################
    
    def pVisLocExec(bone, active, context):
     bone.location = getmat(bone, active, context, False).translation_part()
    
    
    def pVisRotExec(bone, active, context):
     rotcopy(bone, getmat(bone, active,
     context, not context.active_object.data.bones[bone.name].use_inherit_rotation))
    
    
    def pVisScaExec(bone, active, context):
     bone.scale = getmat(bone, active, context,
     not context.active_object.data.bones[bone.name].use_inherit_scale)\
     .scale_part()
    ############################## 
     
    def snap_it(set1,set2,context):
     
     ##set org bone snap ik/fk_set
     
     data = context.active_object.data
     pose = context.active_object.pose
     
     con_in = pose.bones['org.upper'].constraints['ct-ik']
    
     con_in.influence = set1
     
     con_in = pose.bones['org.upper'].constraints['ct-fk']
    
     con_in.influence = set2
     
     con_in = pose.bones['org.fore'].constraints['ct-ik']
    
     con_in.influence = set1
     
     con_in = pose.bones['org.fore'].constraints['ct-fk']
    
     con_in.influence = set2
     
     con_in = pose.bones['org.hand'].constraints['ct-ik']
    
     con_in.influence = set1
     
     con_in = pose.bones['org.hand'].constraints['ct-fk']
    
     con_in.influence = set2
     
    
    
    #####################################
    
    def con_set_it(bname,cname,set1,context):
    
     data = context.active_object.data
     pose = context.active_object.pose
     
     con_in = pose.bones[bname].constraints[cname]
    
     con_in.influence = set1 
     
    ##################################### 
     
    def snap_it2(bname,cname,context):
     
     ##snap rot_loc_sca ik/fk
     
     data = context.active_object.data
     pose = context.active_object.pose
     
     pVisRotExec(pose.bones[bname],pose.bones[cname],context)
     pVisLocExec(pose.bones[bname],pose.bones[cname],context)
     pVisScaExec(pose.bones[bname],pose.bones[cname],context)
     
    ###############################
    
    def sel_layer1(a):
     
     if a == 1:
    
     
     bpy.ops.pose.armature_layers(layers=(True,
     False, True, False, False, False, False, False,
     False, False, False, False, False, False, False, False,
     False, False, False, False, False, False, False, False,
     False, False, False, False, False, False, False, False))
     
    def sel_layer2(a): 
     if a == 1:
     
     bpy.ops.pose.armature_layers(layers=(True,
     True, False, False, False, False, False, False,
     False, False, False, False, False, False, False, False,
     False, False, False, False, True, False, False, False,
     False, False, False, False, False, False, False, False))
     
    
     
    def sel_layer_all(a):
     
     if a == 1:
    
     
     bpy.ops.pose.armature_layers(layers=(True,
     True, True, False, False, False, False, False,
     False, False, False, False, False, False, False, False,
     True, True, True, True, True, False, False, False,
     False, False, False, False, False, False, False, False))
     
    #####################################
    
    class Snap_FK(bpy.types.Operator):
     bl_label = "fk_snap"
     bl_idname = "snap_FK" 
    # bl_options = {'REGISTER', 'UNDO'} 
     
     @classmethod 
     def poll(cls,context):
     return context.mode == 'POSE'
     
     def invoke(self,context,event):
     
     sel_layer_all(1)
     
     pose = context.active_object.pose
     
     snap_it2('fk.upper','ik.upper',context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('fk.fore','ik.fore',context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
    
     
     snap_it2('fk.hand','ik.hand',context)
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
     
     con_set_it('org.fore','Stretch To',0,context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     con_set_it('org.upper','Stretch To',0,context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
    
     
     snap_it(0,1,context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
     
     sel_layer2(1)
     
     print('ok')
     return {'FINISHED'} 
     
    
    ###################################
     
    class Snap_IK(bpy.types.Operator):
     bl_label = "ik_snap"
     bl_idname = "snap_IK" 
    # bl_options = {'REGISTER', 'UNDO'} 
     
     @classmethod 
     def poll(cls,context):
     return context.mode == 'POSE'
     
     def invoke(self,context,event):
     
     sel_layer_all(1)
     
     pose = context.active_object.pose
     
     
     con_set_it('ik.fore','IK',0,context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('ik.upper','fk.upper',context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
    
     
     snap_it2('ik.fore','fk.fore',context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('ik.hand','fk.hand',context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
    
     
     snap_it2('ik.pole','ik.pole.handle',context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
    
     
     con_set_it('ik.fore','IK',1,context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('dummy.pole.a','ik.pole.handle',context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('dummy.pole.b','ik.pole',context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('dummy.pole.a','ik.pole',context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     
     snap_it2('ik.pole','dummy.pole.b',context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     con_set_it('org.fore','Stretch To',0,context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     con_set_it('org.upper','Stretch To',0,context) 
     bpy.ops.object.posemode_toggle() 
     bpy.ops.object.posemode_toggle()
     
     
     snap_it(1,0,context) 
     bpy.ops.object.posemode_toggle()
     bpy.ops.object.posemode_toggle()
     
     sel_layer1(1)
     
     print('okay')
     return {'FINISHED'}
    Última edición por Zuria; 03-11-2011 a las 21:08

  2. #2
    Senior Member
    Fecha de ingreso
    Sep 2008
    Ubicación
    VALENCIA
    Mensajes
    186

    Re: Auto-Snap para IK/FK

    Buenas.sí no sabes programar , sólo te queda esperar a que alguien Lo reescriba. Ayer Lo probé y no funcionaba, primero hay que registrar los class , que antes no hacia falta y me daba problemas con el id_ name, sería echarle horas y a saber sí sale. Suerte
    si quieres ver algo mas...... www.rulflinks.blogspot.com

  3. #3
    Senior Member
    Fecha de ingreso
    Jun 2002
    Ubicación
    Euskadi
    Mensajes
    568

    Re: Auto-Snap para IK/FK

    rulflink
    Pues la verdad es que mucha idea no tengo, pero trasteando he hecho lo mismo que tu con el registro y esas cosas...de las mayúsculas y bla bla... he encontrado un punto donde se bloquea todo y no se por que, más que nada por que no se ni para que hace eso el tío, da pocas explicaciones en la programacion.
    Código:
    def getmat(bone, active, context, ignoreparent):
     '''Helper function for visual transform copy,
     gets the active transform in bone space
     '''
     data_bone = context.active_object.data.bones[bone.name]
    
     #all matrices are in armature space unless commented otherwise
     otherloc = active.matrix #final 4x4 mat of target, location.
     bonemat_local = Matrix(data_bone.matrix_local) #self rest matrix
     
     if data_bone.parent:
     parentposemat = Matrix(context.active_object.pose.bones[data_bone.parent.name].matrix)
     parentbonemat = Matrix(data_bone.parent.matrix_local)
     else:
     
     parentposemat = bonemat_local.copy().identity()# Aquí se me va todo al carajo y me da un error 
     parentbonemat = bonemat_local.copy().identity()
     
     
     
     if parentbonemat == parentposemat or ignoreparent:
     newmat = bonemat_local.invert() * otherloc
     else:
     bonemat = parentbonemat.invert() * bonemat_local
    
     newmat = bonemat.invert() * parentposemat.invert() * otherloc
     return newmat
    
    ###############################
    La cuestión es que a partir de ese `punto con el identify(), que no se para que cojones sirve, se va todo a mamar, creo que si me entero que cojones esta haciendo el tipo en esa función tal vez me aclare un poco de por donde tirar, pero ahora mismo estoy bloqueado por que no entiendo que esta haciendo, a ver si con un poco de cabezoneria sale

  4. #4
    Senior Member
    Fecha de ingreso
    Jun 2002
    Ubicación
    Euskadi
    Mensajes
    568

    Re: Auto-Snap para IK/FK

    Listo calisto... al final era una chorrada... una chorrada de copia y pega, el tío que había hecho el tema había copiado funciones de la addon copy attribute y con las nuevas versiones no funcionaba, pero como el addon ya ha sido actualizado con solo copiar y pegar las funciones se ha solucionado el tema.
    Pero siempre hay un pero, el tío este, un tal kunkun, para calcular la posición del Pole cuando se pasa de fque a ik usaba un par de huesos linkados brazo, es decir que salían del codo y cogia la posición del segundo hueso, y claro esto no es así, esa no seria la posición del pole, así que lo he modificado y usando 3 huesos consigo la posición buena del pole, pero, otra vez otro pero, a mi no me gusta esa solución de poner unos hueso con unos constrain para encontrar la posición, creo que podría hacerse matematicamente, ya que la posiscion seria la suma de el vector brazo más el inverso (no se si esta es la palabra correcta es decir invertir la dirección del vector) del antebrazo desde el codo, pero a mi eso se me escapa, no encuentro donde pegar y copiar eso DDD así que si alguien se anima... solo falta un función para hacerlo elegante y que calcule la posición del pole. por lo demás funciona.
    Aquí dejo el blend por si alguien se anima.
    Archivos adjuntados Archivos adjuntados

Temas similares

  1. The Homer El auto para Homero
    Por Duhast en el foro Trabajos Finalizados
    Respuestas: 45
    Último mensaje: 13-02-2011, 03:26
  2. faro para auto super realista
    Por absoluto en el foro Modelado
    Respuestas: 0
    Último mensaje: 19-02-2007, 10:15
  3. Rigg para auto
    Por Jotagari en el foro Animación y Rigging
    Respuestas: 2
    Último mensaje: 09-12-2006, 14:19
  4. Que conviene para modelar un auto
    Por Jotagari en el foro Modelado
    Respuestas: 5
    Último mensaje: 31-08-2005, 12:41
  5. Necesario para un transporte que se auto alimenta
    Por NeCRoManCeR en el foro Trabajos en Proceso
    Respuestas: 16
    Último mensaje: 31-01-2005, 00:13

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •