def fbx2egg(fbx_path, egg_path): manager, scene = FbxCommon.InitializeSdkObjects() FbxCommon.LoadScene(manager, scene, fbx_path) prepare_scene(scene) data = EggData() data.addChild(EggCoordinateSystem(CSYupRight)) # TODO: read coordinate system from fbx group = EggGroup("walking") # TODO: get name from fbx anim layer group.setDartType(EggGroup.DTDefault) traverse_joints(scene, scene.GetRootNode(), group) data.addChild(group) data.writeEgg(egg_path)
def traverse_joints(fbx_scene, fbx_node, egg_parent): for i in range(fbx_node.GetChildCount()): fbx_child = fbx_node.GetChild(i) if fbx_child.GetSkeleton() is None: # we're only concerned with the skeleton for now continue fbx_transform = fbx_child.EvaluateLocalTransform() egg_transform = convert_fbx_matrix(fbx_transform) egg_joint = EggGroup(fbx_child.GetName()) egg_joint.setGroupType(EggGroup.GTJoint) egg_joint.setTransform3d(egg_transform) egg_parent.addChild(egg_joint) traverse_joints(fbx_scene, fbx_child, egg_joint)
def __facestoegg(self, egg, objname, groupname): selectedfaces = self.__facesby(objname, groupname) if len(selectedfaces) == 0: return self eobj = EggGroup(objname) egg.addChild(eobj) egrp = EggGroup(groupname) eobj.addChild(egrp) evpool = EggVertexPool(groupname) egrp.addChild(evpool) for face in selectedfaces: vlist, mdata = face wobj, wgrp, wmat = mdata epoly = EggPolygon() egrp.addChild(epoly) self.__eggifymats(epoly, wmat) self.__eggifyverts(epoly, evpool, vlist) #; each matching face return self
def __polylinestoegg(self, egg, objname, groupname): selectedlines = self.__linesby(objname, groupname) if len(selectedlines) == 0: return self eobj = EggGroup(objname) egg.addChild(eobj) egrp = EggGroup(groupname) eobj.addChild(egrp) evpool = EggVertexPool(groupname) egrp.addChild(evpool) for line in selectedlines: vlist, mdata = line wobj, wgrp, wmat = mdata eline = EggLine() egrp.addChild(eline) self.__eggifymats(eline, wmat) self.__eggifyverts(eline, evpool, vlist) #; each matching line return self
class createNurbsCurve(): def __init__(self): self.data = EggData() self.vtxPool = EggVertexPool('mopath') self.data.addChild(self.vtxPool) self.eggGroup = EggGroup('group') self.data.addChild(self.eggGroup) self.myverts = [] def addPoint(self, pos): eggVtx = EggVertex() eggVtx.setPos(Point3D(pos[0], pos[1], pos[2])) self.myverts.append(eggVtx) self.vtxPool.addVertex(eggVtx) def getNodepath(self): myCurve = EggNurbsCurve() myCurve.setup(3, len(self.myverts) + 3) myCurve.setCurveType(1) for i in self.myverts: myCurve.addVertex(i) self.eggGroup.addChild(myCurve) return NodePath(loadEggData(self.data))
def make_light(self, parent_node, obj): LIGHT_TYPES = { 'POINT': 'PointLight', 'SPOT': 'SpotLight', } egg_group = EggGroup(obj.name) egg_group.set_tag('type', 'Light') egg_group.set_tag('light', LIGHT_TYPES[obj.data.type]) egg_group.set_tag('color', json.dumps(tuple(obj.data.color))) egg_group.set_tag('scale', json.dumps(tuple(obj.scale))) egg_group.set_tag('energy', '{:.3f}'.format(obj.data.energy)) egg_group.set_tag('far', '{:.3f}'.format(obj.data.shadow_soft_size)) if obj.data.type == 'SPOT': egg_group.set_tag( 'fov', '{:.3f}'.format(math.degrees(obj.data.spot_size))) self._setup_node(egg_group, obj) parent_node.add_child(egg_group) return egg_group
def make_armature(self, parent_node, armature): egg_group = EggGroup(armature.name) egg_group.set_dart_type(EggGroup.DT_structured) egg_joints = {} for bone_name, bone in armature.data.bones.items(): bone_matrix = get_bone_matrix(bone, armature) egg_transform = EggTransform() egg_transform.add_matrix4(matrix_to_panda(bone_matrix)) egg_joint = EggGroup(bone_name) egg_joint.set_group_type(EggGroup.GT_joint) egg_joint.add_matrix4(matrix_to_panda(bone_matrix)) egg_joint.set_default_pose(egg_transform) if bone.parent: egg_joints[bone.parent.name].add_child(egg_joint) else: # root bone egg_group.add_child(egg_joint) egg_joints[bone_name] = egg_joint self._setup_node(egg_group, armature) parent_node.add_child(egg_group) return egg_group