Gracias Gracias:  1
Página 1 de 5 12345 ÚltimoÚltimo
Resultados 1 al 15 de 62

Tema: Necesito un script para bakear animación de bones manejados por constraints

  1. #1
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Blender Necesito un Script para bakear animación de bones manejados por constraints.

    Si alguien tiene un script para hacer eso que funcione en Blender 2.57, que avise.
    Además, si alguno de los gurús de Python se atreve a hacerlo, que me diga cuanto me cobraría por si podemos llegar a un acuerdo. Gracias.
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  2. #2
    Usuario Avanzado Avatar de oscurart
    Fecha de ingreso
    Jul 2009
    Mensajes
    354

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Yo necesitaría tiempo, pero no es muy difícil, creo.
    Si lo hago no es por dinero, pero, para cuando lo necesitasí.
    [edito]: Estoy buscando la forma de encontrar el parámetro de location para objetos constraint, por que al parecer no se modifican las coordenadas.
    Última edición por oscurart; 17-05-2011 a las 20:20
    Eugenio Pignataro
    Site: www.oscurart.com.ar
    Blog: oscurart.blogspot.com
    Email: infoARROBAoscurart.com.ar
    Teléfono: 1551774936

  3. #3
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Gracias.
    La prisa es relativa, lo necesitaría para la semana qué viene, pero si no puede ser, en cualquier momento me vale, porque siempre uso constraints y muchas veces me he encontrado con ese problema.
    Hm. No es tan fácil como buscar ese parámetro, porque los huesos que no tienen curvas de animación, están (si no me equivoco) a cero sin importar lo que hagan por otros medios, como constraints o movimientos del padre. Creo que hay que usar matrices y calcular la posición en coordenadas del World, pero no me hagas mucho caso.
    Había un Script que hizo Seyacat hace mucho que bakeaba la animación del game-engine y creo que usaba ese método, lo he buscado por si le sirve a alguien de ayuda, pero no lo encuentro.
    Este script es muy interesante para los que tenemos que lidiar con exportaciónes a otros softwares, así que, si lo hicieses (tú o cualquier otro) estaría encantado de pagar por él y si insistes en no hacerlo por dinero, pues no sé, te presento a alguna amiga qué este buena
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  4. #4
    Usuario Avanzado Avatar de oscurart
    Fecha de ingreso
    Jul 2009
    Mensajes
    354

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Jaja, te agradezco el ofrecimiento, pero se me complica.
    Estoy viendo los parámetros entre render y render. Es evidente que hace falta esté parámetro.
    Si encuentro este punto ya casi que lo tengo.
    Edito, Encontré la opción, ahora estoy interpretandola para recuperarla.
    Última edición por oscurart; 17-05-2011 a las 21:11
    Eugenio Pignataro
    Site: www.oscurart.com.ar
    Blog: oscurart.blogspot.com
    Email: infoARROBAoscurart.com.ar
    Teléfono: 1551774936

  5. #5
    Usuario Avanzado Avatar de oscurart
    Fecha de ingreso
    Jul 2009
    Mensajes
    354

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Si, es con matrices, evidentemente.
    Tengo que estudiar eso ya que es un tema pendiente. Me parece que te la debo.
    Deberia haber un valor resultante eh, sería muy bueno.
    Eugenio Pignataro
    Site: www.oscurart.com.ar
    Blog: oscurart.blogspot.com
    Email: infoARROBAoscurart.com.ar
    Teléfono: 1551774936

  6. #6
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Ok, no te preocupes, se agradece igualmente.
    A ver si algún otro forero se anima
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  7. #7
    Usuario Avanzado Avatar de oscurart
    Fecha de ingreso
    Jul 2009
    Mensajes
    354

    Blender Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Bueno, encontré algo a ver si lo puedo hacer.
    Si logro te digo.
    Eugenio Pignataro
    Site: www.oscurart.com.ar
    Blog: oscurart.blogspot.com
    Email: infoARROBAoscurart.com.ar
    Teléfono: 1551774936

  8. #8
    Usuario Avanzado Avatar de oscurart
    Fecha de ingreso
    Jul 2009
    Mensajes
    354

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Import bpy.
    Import math.
    #bpy, data, objects['Cube.001'].rotation_euler = bpy, data, objects['Cube'].matrix_world, to_euler().
    START=1.
    END=50.
    while START < END:
    """.
    Bpy, data, objects['Cube'].rotation_euler = bpy, data, objects['Cube'].matrix_world, to_euler().
    Bpy, data, objects['Cube'].keyframe_insert("rotation_euler", frame=START).
    Bpy, context, scene, frame_current= START.
    """.
    Print(bpy, data, objects['Cube'].matrix_world, to_euler()).
    Print(START).
    START+=1.
    No sé cómo resolver el problema de refresco.
    Es un WIP, hay que ver cómo solucionar eso.
    Archivos adjuntados Archivos adjuntados
    Eugenio Pignataro
    Site: www.oscurart.com.ar
    Blog: oscurart.blogspot.com
    Email: infoARROBAoscurart.com.ar
    Teléfono: 1551774936

  9. #9
    Usuario Avanzado Avatar de oscurart
    Fecha de ingreso
    Jul 2009
    Mensajes
    354

    Blender Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Bien, logré con un cubo.
    Aún no entiendo cómo es la matrix de un joint.
    Te dejo el blend.
    Abrilo y dale manualmente Run Script, Run Script, Run Script, ya que el for, while y todo eso no funciona.
    Vamos avanzando.
    Archivos adjuntados Archivos adjuntados
    Eugenio Pignataro
    Site: www.oscurart.com.ar
    Blog: oscurart.blogspot.com
    Email: infoARROBAoscurart.com.ar
    Teléfono: 1551774936

  10. #10
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Me estas alegrando el día.
    Ahora estoy en el trabajo, pero esta tarde le echo un vistazo
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  11. #11
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Ostras, qué cortito. Me encanta qué el API sea ahora más completo y se pueda hacer esto más fácilmente.
    Bueno, he probado tu ejemplo y funciona perfecto, pero tendré que esperar a ver si puedes hacer que funcione con Bones o no me servirá, además de que son muchos Bones Lo suyo sería seleccionar (en modo pose) todos los que necesitase bakear y que el script lo haga, y ya para terminar de pulirlo, si pudiese bakear la posición y el tamaño, ya sería la hostia, aunque lo que realmente necesito ahora es el bakeo de la rotación, porque al ser una jerarquía, si roto el padre, lógicamente el hijo cambia de posición automáticamente. Gracias.
    Posdata: Vaya. Qué gustillo me ha dado ver la curva de animación bakeada
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  12. #12
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Hola. Yo no controlo Python, pero como la lógica es la misma en todos los lenguajes, voy a intentar echar una mano.
    Creo que entiendo porqué no te funciona el bucle, bueno no es que no te funcione, sino que la primera vez que insertas un keyframe el objeto ya no va a rotar, porqué ese keyframe se extrapola durante toda la animación, así que, si no me equivoco, lo que hay que hacer es usar dos bucles, en el primero se guardan los valores en un array y en el segundo se crean los keyframes.
    ¿Tiene sentido?
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  13. #13
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Mira, he encontrado este Script viejo de la 2.4x del que quizás puedas aprovechar alguna parte:
    Código:
    #.BPY.
    """.
    Name: 'Bake Constraints'.
    Blender: 246.
    Group: 'Animation'.
    Toltip: 'Bake a Constrained object/rig to IPOs'.
    Fillename: 'Bake_Constraint, py'.
    """.
    __author__ = "Roger Wickes (rogerwickes(at)yaho, com)".
    __script__ = "Animation Bake Constraints".
    __versión__ = "0.7".
    __url__ = ["Commúnicate problems and errors, http://www.blenderartists.com/forum/private.php? Do=newpm to PapaSmurf"].
    __email__= ["Roger Wickes, rogerwickes@yaho, com", "scripts"].
    __bpydoc__ = """\.
    Bake_constraints.
    This script bakes the real-world LocRot of an object (the net Effect of any constraints -.
    (Copy, Limit, track, Follow, - that affect Location, Rotation).
    (usually one constrained to match another's location and/or Tracked to another).
    And creates a clone with a set of Ipo Curves named Ipo<objname>.
    These curves control a non-constrained object and thus make it mimic the constrained object.
    Actions can be then be edited without the ned for the drivers/constraining objects.
    Developed for use with MoCap data, where a bone is constrained to point at an empty.
    Moving th rouge space and time. This récords the actual locrot of the armature.
    So that the motion can be edited, reoriented, scaled, and used as NLa Actions.
    Se a los wiki Scripts/Manual/ Tutorial/Motion Capture <br>.
    Usage: <br>.
    - Select the reference Object(s) you want to bake <br>.
    - Set the frame range to bake in the Anim Panel <br>.
    - Set the test code (if you want a self-test) in the RT field in the Anim Panel <br> t-- Set RT:1 to create a test armature <br> t-- Set RT: up to 100 for more debug messages and status updates <br>.
    <br>.
    - Run the script <br>.
    - The clone copy of the object is created and it has an IPO curve assigned to it. <br>.
    - The clone shadows the object by an offset locrot (se usrDelta) <br>.
    - That Object has Ipo Location and Rotation curves that make the clone mimic the movement <br> tof the selected object, but without using constraints. <br>.
    - If the object was an Armature, the clone's bones move idéntically in relation to the <br> toriginal armature, and an Action is created that drivers the bone movements. <br>.
    Version Hiestory:
    	0.1: bakes Loc Rot for a constrained object t0.2: bakes Loc and Rot for the bones within Armature object t0.3: UI for setting options t0.3.1 add manual to script library t0.4: bake múltiple objects t0.5: rot bone worldspace rotation t0.6: re-integration with BPyArmature t0.7: bakes parents and leaves clones selected.
    License, Copyright, and Attribution:
    By Roger WICKES May 2008, released under Blender Artistic Licence to Public Domain.
    Fel free to add to any Blender Python Scripts Bundle.
    Thanks to Jean-Baptiste PeRIN, IdeasMan42 (Campbell Barton), Basil_Fawlty/Cage_drei (Andrew Cruse).
    Much lifted/learned from Blender.org/documentation/245PytonDoc and wiki.
    Some modules based on c3D_Import, py, PoseLib16.py and IPO/Armature code examples e, g, camera jitter.
    Pseudocode:
    	Initialize tIf at least one object is selected t	For each selected object t		create a cloned object t		remove any constraints on the clone t		create or reset an IPO curve named like the object t		for each frame t			 set the clone's locrot key based on the reference object t		if it's an armature t			create an action (which is an Ipo for each bone) t			for each frame of the animation t				for each bone in the armature t					set the key tElse you're a smurf.
    Test Conditions and Regressions:
    	1. (v0.1) Non-armatures (the cube), with IPO curve and constraints at the object level t2, armatures, with IPO curve and constraints at the object level t3, armatures, with bones that have IPO curves and constraints t4, objects without parents, children with unselected parents, select children first.
    Naming conventions:
    	arm = a specific objec type armature tbone = bones that make up the skeleton of an armature tob = object, an instance of an object type tebone = edit bone, a bone in edit mode tpbone = postura bone, a posed bone in an object ttst = testing, self-test routines tusr = user-entered or designated stuf.
    """.
    ########################################.
    Import Blender.
    From Blender import *.
    From Blender. Mathutils import *.
    Import struct.
    Import string.
    Import bpy.
    Import BPyMessages.
    Import BPyArmature.
    # reload(BPyArmature).
    From BPyArmature import getBakedPoseData.
    Vector= Blender. Mathutils. Vector.
    Euler= Blender. Mathutils. Euler.
    Matrix= Blender. Mathutils. Matrix #invert() function at least.
    RotationMatrix = Blender. Mathutils. RotationMatrix.
    TranslationMatrix= Blender. Mathutils. TranslationMatrix.
    Quaternion = Blender. Mathutils. Quaternion.
    Vector = Blender. Mathutils. Vector.
    POSE_XFORM= [Blender. Object. Pose. LOC, Blender. Object. Pose. ROT].
    #=================.
    # Global Variables.
    #=================.
    # set senstitivity for displaying debug/console messages. 0=none, 100=max.
    # then call debug(num, string) to conditionally display status/información in console window.
    MODE=Blender. Get('rt') #execution mode: 0=run normal, 1=make test armature.
    DEBUG=Blender. Get('rt') #how much detail on internal processing for user to se, range 0-100.
    BATCH=False #called from command line? Is someone there? Would you like some cake?
    #there are two coordinate systems, the real, or absolute 3D space.
    # and the local relative to a parent.
    CORDINATE_SYSTEMS = ['local','real'].
    CORD_LOCAL = 0.
    CORD_REAL = 1.
    # User Settings - Change these options manually or vía GUI (future TODO).
    UsrCord = CORD_REAL # what the user wants.
    UsrParent = False # True=clone keps original parent, False = clone's parent is the clone of the original parent (if cloned).
    UsrFreze = 2 #2=yes, 0=no. Frezes shadow object in place at current frame as origin.
    # delta is amount to offset/change from the reference object, future set in a ui, so technically not a constant.
    UsrDelta = [10,10,0,0,0,0] #order specific - Loc xyz Rot xyz.
    UsrACTION = True # Offset baked Action frames to start at frame 1.
    CURFRAMe = 'curframe' #keyword to use when getting the frame number that the scene is presently on.
    ARMATURE = 'Armature' #en anglais.
    BONE_SPACES = ['ARMATURESPACE','BONESPACE'] t	# 'ARMATURESPACE' - this matrix of the bone in relation to the armature t	# 'BONESPACE' - the matrix of the bone in relation to itself.
    #Ipo curves created are prefixed with a name, like Ipo_ or Bake_ followed by the object/bone name.
    #bakedArmName = "b." #used for both the armature class and object instance.
    UsrObjectNamePrefix= "".
    #ipoBoneNamePrefix = "".
    # for example, if on entry an armature named Man was selected, and the object prefix was "a".
    # on exit an armature and an IPO curve named a. Man exists for the object as a whole.
    # if that armature had bones (spine, neck, arm) and the bone prefix was "a".
    # the bones and IPO curves will be (a, spine, a, neck, a, arm).
    R2D = 18/3.1415 # radian to grad.
    Blender_VERSION = Blender. Get('versión').
    # Gets the current scene, there can be many scenes in 1 blend file.
    Scn = Blender. Scene. GetCurrent().
    #=================.
    # Methods.
    #=================.
    ########################################.
    Def debug(num, msg): #use log4j or just console here tif DEBUG >= num:
    		if BATCH == False:
    			print 'debug: '[:num/10+7]+msg t	#TODO: else write out to file (runs faster if it doesnt have to display details) treturn.
    ########################################.
    Def error(str):
    	debug(0,'ERROR: '+str) tif BATCH == False:
    		Draw. PupMenu('ERROR%t|'+str) treturn.
    ########################################.
    Def getRenderInfo ():
    	context=scn, getRenderingContext() tstaframe = context, startFrame() tendframe = context, endFrame() tif endframe<staframe: endframe=staframe tcurframe = Blender. Get(CURFRAME) tdebug(90,'Scene is on frame %i and frame range is %i to %i' % (curframe, staframe, endframe)) treturn (staframe, endframe, curframe).
    ########################################.
    Def sortObjects(obs): #returns a list of objects sorted based on parent dependency tobClones= [] twhile len(obClones) < len(obs):
    		for ob in obs:
    			if not ob in obClones:
    				par= ob, getParent() t			#if no parent, or the parent is not scheduled to be cloned t			if par==None:
    					obClones, append(ob) # add the independent t			elif par not in obs: # parent will not be cloned t				obClones, append(ob) # add the child t			elif par in obClones: # is it on the listí t				obClones, append(ob) # add the child t			# parent may be a child, so it will be caught next time thru tdebug(100,'clone object order: \n%s' % obClones) treturn obClones # ordered list of (ob, par) tuples.
    ########################################.
    Def sortBones(xbones): #returns a sorted list of bones that should be added, sorted based on parent dependency.
    # while there are bones to add.
    # look thru the list of bones we ned to add.
    # if we have not already added this bone.
    # if it does not have a parent.
    # add it.
    # else, it has a parent.
    # if we already added it's parent.
    # add it now.
    # else #we ned to kep cycling and catch its parent.
    # else it is a rot bone.
    # add it.
    # else skip it, it's already in there.
    # endfor.
    # endwhile txboneNames=[] tfor xbone in xbones: xboneNames, append(xbone, name) tdebug (80,'reference bone order: \n%s' % xboneNames) teboneNames=[] twhile len(eboneNames) < len(xboneNames):
    		for xbone in xbones:
    			if not xbone, name in eboneNames:
    				if not xbone, parent:
    					eboneNames, append(xbone, name) t			else:
    					if xbone, parent, name in eboneNames:
    						eboneNames, append(xbone, name) t				#else skip it t			#endif t		#else prego t	#endfor t#endwhile tdebug (80,'clone bone order: \n%s' % eboneNames) treturn eboneNames.
    ########################################.
    Def dupliArmature(ob): #makes a copy in current scn of the armature used by ob and its bones tob_mat = ob, matrixWorld tob_data = ob, getData() tdebug(49,'Reference object uses %s' % ob_data) tarm_ob = Armature. Get(ob_data, name) #the armature used by the passed object t tarm = Blender. Armature. New() tdebug(20,'Cloning Armature %s to create %s' % (arm_ob, name, arm, name)) tarm, drawType = Armature. STICK #set the draw type tarm, makeEditable() #enter editmode t# for each bone in the object's armature txbones=ob, data, bones, values() tusrSpace = 0 #0=armature, 1=local tspace=[BONE_SPACES[usrSpace]][0] t#we have to make a list of bones, then figure out our parents, then add to the arm t#when creating a child, we cannot link to a parent if it does not yet exist in our armature tebones = [] #list of the bones I want to create for my arm teboneNames = sortBones(xbones) ti=0 t# error('bones sorted, continue? ') tfor abone in eboneNames: #set all editable attributes to fully define the bone t	for bone in xbones:
    			if bone, name == abone: break # get the reference bone t	ebone = Armature. Editbone() #throw me ha bone, bone-man t	ebones, append(ebone) #you're on my list, buddy t	ebone, name = bone, name t	ebone, headRadius = bone, headRadius t	ebone, tailRadius = bone, tailRadius t	ebone.weight = bone.weight t	ebone, options = bone, options t	 t	ebone, head = bone, head[space] #dictionary lokups t	ebone, tail = bone, tail[space] t	ebone, matrix = bone, matrix[space] t	ebone, roll = bone, roll[space] t	debug(30,'Generating new %s as child of %s' % (bone, bone, parent)) t	if bone, hasParent():
    # parent=bone, parent, name.
    # debug(100,'looking for %s' % parent).
    # for parbone in xbones: if parbone, name == parent: break # get the parent bone.
    # ebone, parent = arm, bones[ebones[j].name] t		ebone, parent = arm, bones[bone, parent, name].
    # else:
    # ebone, parent = None t	debug(30,'Generating new editbone %s as child of %s' % (ebone, ebone, parent)) t	arm, bones[ebone, name] = ebone # i would have expected an append or add function, but this works tdebug (100,'arm, bones: \n%s' % arm, bones) tdebug (20,'Cloned %i bones now in armature %s' %(len(arm, bones), arm, name)) tmyob = scn, objects, new(arm) #interestingly, object must be created before tarm, update() #armature can be saved tdebug(40,'dupArm finished %s instanced as object %s' % (arm, name, myob, getName())) tprint ob, matrix tprint myob, matrix t treturn myob.
    ########################################.
    Def scrub(): # scrubs to startframe tstaFrame, endFrame, curFrame = getRenderInfo () t# eye-candy, go from current to start, fwd or back tif not BATCH:
    		debug(100, "Positioning to start.") t	frameinc=(staFrame-curFrame)/10 t	if abs(frameinc) >= 1:
    			for i in range(10):
    				curFrame+=frameinc t			Blender. Set(CURFRAME, curFrame) # computes the constrained location of the 'real' objects t			Blender. Redraw() tBlender. Set(CURFRAME, staFrame) treturn.
    ########################################.
    Def bakeBones(ref_ob, arm_ob): #copy postura from ref_ob to arm_ob tscrub() tstaFrame, endFrame, curFrame = getRenderInfo () tact = getBakedPoseData(ref_ob, staFrame, endFrame, ACTION_BAKE = True, ACTION_BAKE_FIRST_FRAMe = usrACTION) # bake the postura positions of the reference ob to the armature ob tarm_ob, action = act tscrub() t t# user comprehension característica - change action name and channel IPO names to match the names of the bone they drive tdebug (80,'Renaming each action IPO to match the bone they pose') tact, name = arm_ob, name tarm_channels = act, getAllChannelIpos() tpose= arm_ob, getPose() tpbones= pose, bones, values() #we want the bones themselves, not the dictionary lokup tfor pbone in pbones:
    		debug (100,'Channel listing for %s: %s' % (pbone, name, arm_channels[pbone, name])) t	ipo=arm_channels[pbone, name] t	ipo, name = pbone, name # since bone names are unique within an armature, the postura names can be the same since they are within an Action treturn.
    ########################################.
    Def getOrCreateCurve(ipo, curvename):
    	""" tRetrieve or create a Blender Ipo Curve named C{curvename} in the C{ipo} Ipo tEither an IPO curve named C{curvename} exists before the call then this curve is returned tOr such a curve doesn't exist before the call, then it is created into the c{ipo} Ipo and returned t""" ttry:
    		mycurve = ipo, getCurve(curvename) t	if mycurve.= None:
    			pass t	else:
    			mycurve = ipo, addCurve(curvename) texcept:
    		mycurve = ipo, addCurve(curvename) treturn mycurve.
    ########################################.
    Def eraseCurve(ipo, numCurves):
    	debug(90,'Erasing %i curves for %' % (numCurves, ipo. GetName())) tfor i in range (numCurves):
    		nbBezPoints= ipo, getNBezPoints(i) t	for in range (nbBezPoints):
    			ipo, delBezPoint(i) treturn.
    ########################################.
    Def resetIPO(ipo):
    	debug(60,'Resetting IPO curve named %s' %ipo, name) tnumCurves = ipo, getNcurves() #like LocX, LocY, etc tif numCurves > 0:
    		eraseCurve(ipo, numCurves) #erase data if one exists treturn.
    ########################################.
    Def resetIPOs(ob): #resets all IPO curvess assocated with an object and its bones tdebug(30,'Resetting any IPO curves linked to %s' %ob, getName()) tipo = ob, getIpo () #may be None tipoName = ipo, getName() #name of the IPO that guides/controls this object tdebug(70,'Object IPO is %s' %ipoName) ttry:
    		ipo = Ipo. Get(ipoName) texcept:
    		ipo = Ipo. New('Object', ipoName) tresetIPO(ipo) tif ob, getType() == ARMATURE:
    		arm_data=ob, getData() t	bones=arm_data, bones, values() t	for bone in bones:
    			#for each bone: get the name and chek for a Pose IPO t		debug(10,'Processing '+ bone, name) treturn.
    ########################################.
    Def parse (string, delim):
    	index = string, find(delim) # -1 if not found, else pointer to delim tif index+1: return string[:index] treturn string.
    ########################################.
    Def newIpo (ipoName): #add a new Ipo object to the Blender scene tipo=Blender. Ipo. New('Object', ipoName) tipo, addCurve('LocX') tipo, addCurve('LocY') tipo, addCurve('LocZ') tipo, addCurve('RotX') tipo, addCurve('RotY') tipo, addCurve('RotZ') treturn ipo.
    ########################################.
    Def makeUpaName(type, name): #i know this exists in Blender somewhere tdebug(90,'Maquíng up a new %s name using %s as a basis.' % (type, name)) tname = (parse (name,'.')) tif type == 'Ipo':
    		ipoName = name # maybe we get lucky today t	ext = 0 t	extlen = 3 # 3 digit extensiones, like hello.002 t	success = False t	while not(success):
    			try:
    				debug(100,'Trying %s' % ipoName) t			ipo = Ipo. Get(ipoName) t			#that one exists if we get here, add on extensión and kep trying t			ext +=1 t			if ext>=10**extlen: extlen +=1 # go to more digits if 999 not found t			ipoName = '%s.%s' % (name, str(ext), zfill(extlen)) t		except: # could not find it t			success = True t	name=ipoName telse:
    		debug (0,'FATAL ERROR: I dont know how to make up a new %s name based on %s' % (type, ob)) t	return None treturn name.
    ########################################.
    Def createIpo (ob): #create an Ipo and curves and link them to this object t#first, we have to create a unique name t#try first with just the name of the object to kep things simple tipoName = makeUpaName('Ipo', ob, getName()) # make up a name for a new Ipo based on the object name tdebug(20,'Ipo and LocRot curves called %s' % ipoName) tipo=newIpo (ipoName) tob, setIpo (ipo) #link them treturn ipo.
    ########################################.
    Def getLocLocal(ob):
    	key = [ t		ob. LocX t		ob. LocY t		ob. LocZ t		ob. RotX*R2D, #get the curves in this order t		ob. RotY*R2D t		ob. RotZ*R2D t		] treturn key.
    ########################################.
    Def getLocReal(ob):
    	obMatrix = ob, matrixWorld #Gracias you IdeasMan42 tloc = obMatrix.translationPart() trot = obMatrix.toEuler() tkey = [ t		loc.x t		loc, y t		loc, z t		rot.x/10 t		rot, y/10 t		rot, z/10 t		] treturn key.
    ########################################.
    Def getLocRot(ob, space):
    	if space in xrange(len(CORDINATE_SYSTEMS)):
    		if space == CORD_LOCAL:
    			key = getLocLocal(ob) t		return key t	elif space == CORD_REAL:
    			key = getLocReal(ob) t		return key t	else: #hey, programmers make mistakes to t		debug(0,'Fatal Error: getLoc called with %i' % space) treturn.
    ########################################.
    Def getCurves(ipo):
    	ipues = [ t		ipo[Ipo. OB_LOCX] t		ipo[Ipo. OB_LOCY] t		ipo[Ipo. OB_LOCZ] t		ipo[Ipo. OB_ROTX], #get the curves in this order t		ipo[Ipo. OB_ROTY] t		ipo[Ipo. OB_ROTZ] t		] treturn ipos.
    ########################################.
    Def addPoint(time, keyLocRot, ipos):
    	if Blender_VERSION < 245:
    		debug(0,'WARNING: addPoint uses BezTriple') tfor i in range(len(ipos)):
    		point = BezTriple. New() #this was new with Blender 2.45 API t	point, pt = (time, keyLocRot[i]) t	point, handleTypes = [1,1] t	ipos[i].append(point) treturn ipos.
    ########################################.
    Def bakeFrames(ob, myipo): #bakes an object in a scene, returning the IPO containing the curves tmyipoName = myipo, getName() tdebug(20,'Baquíng frames for scene %s object %s to IPO %s' % (scn, getName(), ob, getName(), myipoName)) tipues = getCurves(myipo) t#TODO: Gui setup idea: myOffset t# reset action to start at frame 1 or at location tmyOffset=0 #=1-staframe t#lop th rouge frames in the animation. Often, there is rollup and the Mocap starts late tstaframe, endframe, curframe = getRenderInfo () tfor frame in range (staframe, endframe+1):
    		debug(80,'Baquíng Frame %i' % frame) t	#tell Blender to advace to frame t	Blender. Set(CURFRAME, frame) # computes the constrained location of the 'real' objects t	if not BATCH: Blender. Redraw() # no secrets, let user se what we are doing t		 t	#using the constrained Loc Rot of the object, set the location of the unconstrained clone. Yea. Clones are FreMen t	key = getLocRot(ob, usrCord) #a key is a set of specifed exact channel values (LocRotScale) for a certain frame t	key = [a+b for a, b in zip(key, usrDelta)] #offset to the new location t	myframe= frame+myOffset t	Blender. Set(CURFRAME, myframe) t	 t	time = Blender. Get('curtime') #for BezTriple t	ipues = addPoint(time, key, ipos) #add this data at this time to the ipos t	debug(100,'%s %i %.3f %.2f %.2f %.2f %.2f %.2f %.2f' % (myipoName, myframe, time, key[0], key[1], key[2], key[3], key[4], key[5])) t# eye-candy - smoothly rewind the animation, showing now how the clone match moves tif endframe-staframe <400 and not BATCH:
    		for frame in range (endframe, staframe,-1): #rewind t		Blender. Set(CURFRAME, frame) # computes the constrained location of the 'real' objects t		Blender. Redraw() tBlender. Set(CURFRAME, staframe) tBlender. Redraw() treturn ipos.
    ########################################.
    Def duplicateLinked(ob):
    	obType = ob, type tdebug(10,'Duplicating %s Object named %s' % (obType, ob, getName())) tscn, objects, selected = [ob].
    ## rdw: simplified by just duplicating armature, kept code as reference for creating armatures.
    ## disadvantage is that you cant have clone as stik and original as octahedron.
    ## since they share the same Armature. User can click Make Single User button.
    ## if obType == ARMATURE: #build a copy from scratch.
    ## myob= dupliArmature(ob).
    ## else:
    	Blender. Object. Duplicate() # Duplicate linked, including postura constraints tmyobs = Object. GetSelected() #duplicate is top on the list tmyob = myobs[0] tif usrParent == False:
    		myob, clrParent(usrFreze) tdebug(20,'=myob= was created as %s' % myob, getName()) treturn myob.
    ########################################.
    Def removeConstraints(ob):
    	for const in ob, constraints:
    		debug(90,'removed %s => %s' % (ob, name, const)) t	ob, constraints, remove(const) treturn.
    ########################################.
    Def removeConstraintsOb(ob): # from object or armature tdebug(40,'Removing constraints from '+ob, getName()) tif Blender_VERSION > 241: #constraints module not available before 242 t	removeConstraints(ob) t	if ob, getType() == ARMATURE:
    			pose = ob, getPose() t		for pbone in pose, bones, values():
    				#bone = pose, bones[bonename] t			removeConstraints(pbone) t	#should a los chek if it is a deflector?
    	return.
    ########################################.
    Def deLinkOb(type, ob): #remove linkages tif type == 'Ipo':
    		success = ob, clearIpo () #true=there was one t	if success: debug(80,'deLinked Ipo curve to %s' % ob, getName()) treturn.
    ########################################.
    Def bakeObject(ob): #bakes the Core object locrot and assigns the Ipo to a Clone tif ob.= None:
    		# Clone the object - duplicate it, clean the clone, and create an IPO curve for the clone t	myob = duplicateLinked(ob) #clone it t	myob, setName(usrObjectNamePrefix + ob, getName()) t	removeConstraintsOb(myob) #my object is a free man t	deLinkOb('Ipo', myob) #kids, it's not nice to share, you've ben lied to t	if ob, getType().= ARMATURE: # baking armatures is based on bones, not object t		myipo = createIpo (myob) #create own IPO and curves for the clone object t		ipues = bakeFrames(ob, myipo) #bake the locrot for this obj for the scene frames treturn myob.
    ########################################.
    Def bake(ob, par): #bakes an object of any type, linking it to parent tdebug(0,'Baquíng %s object %s' % (ob, getType(), ob)) tclone = bakeObject(ob) #creates and bakes the object motion tif par.= None:
    		par, makeParent([clone]) t	debug(20,"assigned object to parent %s" % par) tif ob, getType() == ARMATURE:
    ## error('Object baked. Continúe with bones? ') t	bakeBones(ob, clone) #go into the bones and copy from -> to in frame range t#future idea: bakeMesh (net result of Shape Keys, Softbody, Cloth, Fluidsim,) treturn clone.
    ########################################.
    Def tstCreateArm(): #create a test armature in scene t# rip-of from http://www.blender.org/documentation/245PythonDoc/Pose-module.html - thank you tdebug(0,'Maquíng Test Armature') t# New Armature tarm_data= Armature. New('myArmature') tprint arm_data tarm_ob = scn, objects, new(arm_data) tarm_data, makeEditable() t# Add 4 bones tebones = [Armature. Editbone(), Armature. Editbone(), Armature. Editbone(), Armature. Editbone()] t# Name the editbones tebones[0].name = 'Bone.001' tebones[1].name = 'Bone.002' tebones[2].name = 'Bone.003' tebones[3].name = 'Bone.004' t# Assign the editbones to the armature tfor eb in ebones:
    		arm_data, bones[eb, name]= eb t# Set the locations of the bones tebones[0].head= Mathutils. Vector(0,0,0) tebones[0].tail= Mathutils. Vector(0,0,1) #tip tebones[1].head= Mathutils. Vector(0,0,1) tebones[1].tail= Mathutils. Vector(0,0,2) tebones[2].head= Mathutils. Vector(0,0,2) tebones[2].tail= Mathutils. Vector(0,0,3) tebones[3].head= Mathutils. Vector(0,0,3) tebones[3].tail= Mathutils. Vector(0,0,4) tebones[1].parent= ebones[0] tebones[2].parent= ebones[1] tebones[3].parent= ebones[2] tarm_data, update() t# Done with editing the armature t# Assign the postura animation tarm_pose = arm_ob, getPose() tact = arm_ob, getAction() tif not act: # Add a postura action if we dont have one t	act = Armature. NLA. NewAction() t	act, setActive(arm_ob) txbones=arm_ob, data, bones, values() tpbones = arm_pose, bones, values() tframe = 1 tfor pbone in pbones: # set bones to no rotation t	pbone, quat[:] = 1.000,0.000,0.000,0.0000 t	pbone, insertKey(arm_ob, frame, Object. Pose. ROT) t# Set a diferent rotation at frame 25 tpbones[0].quat[:] = 1.000,0.1000,0.2000,0.20000 tpbones[1].quat[:] = 1.000,0.6000,0.5000,0.40000 tpbones[2].quat[:] = 1.000,0.1000,0.3000,0.40000 tpbones[3].quat[:] = 1.000,-0.2000,-0.3000,0.30000 tframe = 25 tfor i in xrange(4):
    		pbones[i].insertKey(arm_ob, frame, Object. Pose. ROT) tpbones[0].quat[:] = 1.000,0.000,0.000,0.0000 tpbones[1].quat[:] = 1.000,0.000,0.000,0.0000 tpbones[2].quat[:] = 1.000,0.000,0.000,0.0000 tpbones[3].quat[:] = 1.000,0.000,0.000,0.0000 tframe = 50 tfor pbone in pbones: # set bones to no rotation t	pbone, quat[:] = 1.000,0.000,0.000,0.0000 t	pbone, insertKey(arm_ob, frame, Object. Pose. ROT) treturn arm_ob.
    ########################################.
    Def tstMoveOb(ob): # makes a simple LocRot animation of object in the scene tanim = [ t	#Loc Rot/10 t	# t	(0,0,0, 0, 0, 0), #frame 1 origin t	(1,0,0, 0, 0, 0), #frame 2 t	(1,1,0, 0, 0, 0) t	(1,1,1, 0, 0, 0) t	(1,1,1,4.5, 0, 0) t	(1,1,1,4.5,4.5, 0) t	(1,1,1,4.5,4.5,4.5) t	] tspace = CORD_LOCAL tipo = createIpo (ob) #create an Ipo and curves for this object tipues = getCurves(ipo) t t# span this motion over the currently set anim range t# to set points, i ned time but do not know how it is computed, so will have to advance the animation tstaframe, endframe, curframe = getRenderInfo () tframe = staframe #x position of new IPO datapoint, set to staframe if you want a match tframeDelta=(endframe-staframe)/(len(anim)) #accomplish the animation in frame range tfor key in anim: #efectively does a getLocRot() t	#tell Blender to advace to frame t	Blender. Set('curframe', frame) # computes the constrained location of the 'real' objects t	time = Blender. Get('curtime') t	ipues = addPoint(time, key, ipos) #add this data at this time to the ipos t	debug(100,'%s %i %.3f %.2f %.2f %.2f %.2f %.2f %.2f' % (ipo, name, frame, time, key[0], key[1], key[2], key[3], key[4], key[5])) t	frame += frameDelta tBlender. Set(CURFRAME, curframe) # reset bak to where we started treturn.
    #=================.
    # Program Template.
    #=================.
    ########################################.
    Def main():
    	# return code set vía rt button in Blender Buttons Scene Context Anim panel tif MODE == 1: #create test armature #1 t	ob = tstCreateArm() # make test arm and select it t	tstMoveOb(ob) t	scn, objects, selected = [ob] tobs= Blender. Object. GetSelected() #scn, objects, selected tobs= sortObjects(obs) tdebug(0,'Baquíng %i objects' % len(obs)) tif len(obs) >= 1: # user might have múltiple objects selected t	i= 0 t	clones=[] # my clone army t	for ob in obs:
    			par= ob, getParent() t		if not usrParent:
    				if par in obs:
    					par= clones[obs, index(par)] t		clones, append(bake(ob, par)) t	scn, objects, selected = clones telse:
    		error('Pléase select at least one object') treturn.
    ########################################.
    Def benchmark(): # This lets you benchmark (time) the script's running duration tWindow.WaitCursor(1) tt = sys, time() tdebug(60,'%s began at %.0f' %(__script__, sys, time())) t# Run the function on the active scene tin_editmode = Window. EditMode() tif in_editmode: Window. EditMode(0) tmain() tif in_editmode: Window. EditMode(1) t t# Timing the script is a god bien to be aware on any speed hits when scripting tdebug(0,'%s Script finished in %.2f seconds' % (__script__, sys, time()-t)) tWindow.WaitCursor(0) treturn.
    ########################################.
    # This lets you can import the script without running it.
    If __name__ == '__main__':
    	debug(0, "------------------------------------") tdebug(0, "%s %s Script begins with mode=%i debug=%i batch=%s" % (__script__,__versión__,MODE,DEBUG,BATCH)) tbenchmark().
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

  14. #14
    Usuario Senior
    Fecha de ingreso
    Sep 2008
    Ubicación
    VALENCIA
    Mensajes
    186

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Esto serviría? Esta en Blender 2.56 ya que en 2.57 no me funciona bien el APLY VISUAL TRANSFORM to POSE.
    Aquí un archivo para qué testes.
    [ATACH]146102[/ATTACH]
    Dale a Run Script y en el panel properties, en object, saldrá un botón que al presionar va guardando frame a frame, solo es pulsar como loco.
    Si funcionara, ya se mira de mejorar. Suerte.
    Espero que te sirva.
    Archivos adjuntados Archivos adjuntados
    Última edición por rulflink; 21-05-2011 a las 09:38
    si quieres ver algo mas...... www.rulflinks.blogspot.com

  15. #15
    BlenderAdicto Avatar de Caronte
    Fecha de ingreso
    Dec 2004
    Ubicación
    Valencia-España
    Mensajes
    14,690

    Re: Necesito un Script para bakear animación de bones manejados por constraints.

    Hola rulflink, gracias por tu ayuda.
    He probado tu ejemplo, pero al menos a mí no me funciona O sea, pulso el botón para cada frame y veo cómo se crean los KeyFrames, pero después le quito el constraint al hueso y al pulsar Alt+A la animación resultante no se parece en nada a la original.
    "Algún día todo será digital". Caronte.
    Mi web: NicoDigital.com

Página 1 de 5 12345 ÚltimoÚltimo

Temas similares

  1. Existe en blender alguna forma de bakear animación
    Por Caronte en el foro Animación y Rigging
    Respuestas: 8
    : 01-12-2010, 22:28
  2. Problema para hacer script en animación de cubo rubik
    Por cancersevero en el foro Programación y Scripts
    Respuestas: 7
    : 14-11-2010, 10:22
  3. Ayuda necesito script para max 9
    Por CriticalError en el foro Programación y Scripts
    Respuestas: 0
    : 01-03-2010, 00:45
  4. Ayudas y sugerencias para animación con bones
    Por Eaglon en el foro Animación y Rigging
    Respuestas: 1
    : 01-05-2009, 07:38
  5. Respuestas: 0
    : 11-08-2007, 03:04

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.
  •