Revision: 22958 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22958 Author: letterrip Date: 2009-09-03 00:16:00 +0200 (Thu, 03 Sep 2009)
Log Message: ----------- reverting - theeth pointed out we are in a freeze on head... Modified Paths: -------------- trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py =================================================================== --- trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py 2009-09-02 21:57:27 UTC (rev 22957) +++ trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py 2009-09-02 22:16:00 UTC (rev 22958) @@ -6,7 +6,7 @@ # Copyright (C) 2006: Illusoft - colladablen...@illusoft.com # - 2008.08: multiple bugfixes by migius (AKA Remigiusz Fiedler) # - 2009.05: bugfixes by jan (AKA Jan Diederich) -# - 2009.08: bugfixes by dynabyte (AKA Dmitri Sviridov, cast3d.org) +# - 2009.08: bugfixed by nico (AKA Nicolai Wojke, Labor Bilderkennen Uni-Koblenz) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -26,26 +26,14 @@ # -------------------------------------------------------------------------- # History -# 2009.08.11 by dynabyte ( cas...@gmail.com, www.cast3d.org): -# - Fixed skeleton/bone and animation. (export only). Brief change log: -# - Fuction Controller.SaveToDae : -# INV_BIND_MATRIX composition as = (bArmatureObject.matrixWorld * Bone.matrix['ARMATURESPACE']).invert() -# - Fuction ArmatrureNode.SaveToDae : -# - mutliple root bones handling added -# - return argument as list -# - Fuction ArmatrureNode.BoneToDae : -# - local bone matrix composition as = Bone.matrix['ARMATURESPACE'] * parent_bone.matrix["ARMATURESPACE"].invert() -# - bone's action IPOs compiled in to list -# - removed redundant function arguments -# - Fuction Animation.SaveToDae : - new impementation -# - removed unused getEulerAnimation() function -# - function takes IPOs list as input argument -# - new function getLocalPoseMatrix added -# - Fuction SceneNode.SaveSceneToDae : -# - Added creation of Armature node as parent of Skeleton -# - Controler transforms cleaned up -# - Node animation handling fixedS -# +# 2009.08.22 by nico: +# - Fixed a bug where visual scene nodes containing instances of nodes in the nodes library, +# which themselves instantiate geometry in the geometry library, where not imported +# correctly (only the node instantiation was created, not the geometry) +# - Fixed a bug where nodes in the nodes library that have children instantiating other +# nodes in the nodes library where not resolved properly. Added a post-library-creation +# phase where DaeInstance object references are updated after the entire library is created +# - Changed nodes library syntax from 'library_NODES' to 'library_nodes' # 2009.05.17 by jan: # - More information for the user if an error happened (wrong/missing parenting). # - Added a progress bar for export (bar for import already exists). @@ -85,10 +73,9 @@ import BPyMesh import BPyObject -import bpy debprn = 0 #--- print debug "print 'deb: ..." -dmitri = 1 #switch for testing patch from Dmitri +dmitri = 0 #switch for testing patch from Dmitri class Translator(object): isImporter = False @@ -1046,7 +1033,7 @@ daeSkin.source = meshName # Set the bindshapematrix - daeSkin.bindShapeMatrix = Matrix(bMeshObject.matrix).transpose() + daeSkin.bindShapeMatrix = Matrix(bMeshObject.matrix).transpose()##bMeshObject.getMatrix('localspace').transpose() bArmatureObject = bModifier[Blender.Modifier.Settings.OBJECT] if (bArmatureObject is None): @@ -1120,7 +1107,6 @@ # Get all vertextGroups vGroups = dict() - #print "Bone Mesh=", meshName, "vGroups= ", bMesh.getVertGroupNames() for vertexGroupName in bMesh.getVertGroupNames(): vwsdict = vGroups[vertexGroupName] = dict() try: @@ -1146,16 +1132,24 @@ ## print ## PrintTransforms(Matrix(bArmature.bones[vertexGroupName].matrix['ARMATURESPACE']).transpose().invert(), vertexGroupName) - #by dmitri(dynabyte): Use ARAMATURE matrix for a global position/orientation - bindMatrix = Matrix(bArmature.bones[vertexGroupName].matrix["ARMATURESPACE"]).resize4x4().transpose() - bindMatrix = Matrix(bArmatureObject.matrixWorld).transpose() * bindMatrix + if 0: + bindMatrix = Matrix(bArmature.bones[vertexGroupName].matrix['ARMATURESPACE']).transpose() + bindMatrix = Matrix(bMeshObject.matrix).transpose() * bindMatrix + elif dmitri: #by dmitri: Use ARAMATURE matrix for a global position/orientation + bindMatrix = Matrix(bArmature.bones[vertexGroupName].matrix["ARMATURESPACE"]).resize4x4().transpose() + bindMatrix = Matrix(bArmatureObject.getMatrix('localspace')).transpose() * bindMatrix + else: + headPos = bArmature.bones[vertexGroupName].head["ARMATURESPACE"] + bindMatrix = Matrix([1,0,0,headPos.x], [0,1,0,headPos.y], [0,0,1,headPos.z],[0,0,0,1]) + bindMatrix = Matrix(bArmatureObject.getMatrix('localspace')).transpose() * bindMatrix + invBindMatrix = Matrix(bindMatrix).invert() - #print "Bone =", vertexGroupName, "Final invBindMatrix= " , invBindMatrix.toEuler(), invBindMatrix.translationPart() poseSourceArray.data.extend(MatrixToList(invBindMatrix)) poseAccessor.count += 1 for vert in verts: weightAccessor.count += 1 + vertJointCount = dict() weightIndex = 0 for vert in bMesh.verts: @@ -1305,99 +1299,193 @@ if t[2] == ta[0]: return [t[0],ta] return None - - def getLocalPoseMatrix(self, node, bArmatureObject=None): - if type(node) == Blender.Types.BoneType: - pose = bArmatureObject.getPose() - pose_bone = pose.bones[node.name] - - if node.hasParent(): - parent_bone = node.parent - pose_bone_pose = pose.bones[parent_bone.name] - if not (pose_bone_pose is None): - return pose_bone.poseMatrix.copy() * pose_bone_pose.poseMatrix.invert() - else: - return pose_bone.poseMatrix.copy() - else: - parent = node.getParent() - if parent is None: - return node.matrixWorld.copy() - else: - return node.matrixWorld.copy() * parent.matrixWorld.copy().invert() - return None - - def SaveToDae(self, ipos, targetDaeNode, joint, bPose=None, bArmatureObject=None): + + def GetEulerAnimations(self, ipo, targetDaeNode, joint=None, bPose=None, bParentMatrix=None, bArmatureObject=None): + curves = ipo.getCurves() + if not curves is None: + quatXList = dict() + quatYList = dict() + quatZList = dict() + quatWList = dict() + + #collect quats + quatKey = dict() + for cur in curves: + curName = cur.getName() + if curName.startswith("Quat"): + quatKey[curName] = [] + curNameIndex = curName[-1] + if curNameIndex == 'X': + for point in cur.bezierPoints: + quatXList[point.pt[0]] = point.pt[1] + elif curNameIndex == 'Y': + for point in cur.bezierPoints: + quatYList[point.pt[0]] = point.pt[1] + elif curNameIndex == 'Z': + for point in cur.bezierPoints: + quatZList[point.pt[0]] = point.pt[1] + elif curNameIndex == 'W': + for point in cur.bezierPoints: + quatWList[point.pt[0]] = point.pt[1] + + quats = dict() + eulers = dict() + + xKeyList = quatXList.keys() + yKeyList = quatYList.keys() + zKeyList = quatZList.keys() + wKeyList = quatWList.keys() + + #Assumption: All the keys are the same!! + for xKey in xKeyList: + if not quats.has_key(xKey): + quats[xKey] = Quaternion() + + #assign value + for key in xKeyList: + quats[key].x = quatXList[key] + for key in yKeyList: + quats[key].y = quatYList[key] + for key in zKeyList: + quats[key].z = quatZList[key] + for key in wKeyList: + quats[key].w = quatWList[key] + + for key in quats: + euler = quats[key].toEuler() + + if joint is not None: + if dmitri: + bindMatrix = Matrix(joint.matrix["ARMATURESPACE"]).resize4x4().transpose() + else: + headPos = joint.head["ARMATURESPACE"] + bindMatrix = Matrix([1,0,0,headPos.x], [0,1,0,headPos.y], [0,0,1,headPos.z],[0,0,0,1]) + armMatrix = Matrix(bindMatrix) + if not joint.hasParent(): + armMatrix = Matrix(bArmatureObject.getMatrix('localspace')).transpose().invert() + armMatrix *= bindMatrix + + if 1: #migius + swap = euler.y + euler.y = - euler.z + euler.z = swap + + else: + poseMatrix = Matrix(bParentMatrix).invert() * armMatrix + poseMatrix.transpose() + + poseEuler = poseMatrix.toEuler() + euler.x += poseEuler.x + euler.y += poseEuler.y + euler.z += poseEuler.z + #if debprn: print 'deb: getEuler: ', joint.name , poseEuler, euler + + eulers[key] = euler + + # this nodes list of euler angles: + return eulers + return None + + def SaveToDae(self, ipo, targetDaeNode, joint=None, bPose=None, bParentMatrix=None, bArmatureObject=None): global sampleAnimation - frame_orig = Blender.Get('curframe') - - # animations for these object types - animations = dict() - - for ipo, startFrame in ipos: - #print "Ipo=", ipo - curves = ipo.getCurves() - if not curves is None: - for curve in curves: - cName = curve.getName() - interpolation = curve.getInterpolation() - #interpolation = curve.interpolation - if debprn: print 'deb: interpolation=', interpolation #-------- + animations = None + curves = ipo.getCurves() + if not curves is None: + animations = dict() - # Get all the framenumbers for the current curve. - frames = [bp.pt[0] for bp in curve.bezierPoints] - if sampleAnimation: ## if the users wants to sample the animation each frame.. - # .. generate a sequence of frames, starting at the first(smallest) framenumber of the current curve @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs