SkeletonJoint getJoint(Element jointNode, boolean isRootNode) { SkeletonJoint joint = new SkeletonJoint(); joint.name = jointNode.getAttribute("id"); if (!isRootNode) { Element matrixElement = jointNode.getChildByName("matrix"); if (matrixElement != null) { Matrix4 m = getMatrix(matrixElement); m.getTranslation(joint.position); m.getRotation(joint.rotation); // TODO: get scale from matrix } } Array<Element> nodes = jointNode.getChildrenByName("node"); for (int i = 0; i < nodes.size; i++) { SkeletonJoint child = getJoint(nodes.get(i), false); if (!isRootNode) { child.parent = joint; } joint.children.add(child); } return joint; }
private Skeleton generateSkeleton( com.badlogic.gdx.graphics.g3d.loaders.ogre.skeleton.Skeleton ogreSkel) { List<Bone> bones = ogreSkel.getBones().getBone(); List<SkeletonJoint> joints = new ArrayList<SkeletonJoint>(); Map<String, SkeletonJoint> nameToJoint = new HashMap<String, SkeletonJoint>(); for (int i = 0; i < bones.size(); i++) { Bone bone = bones.get(i); SkeletonJoint joint = new SkeletonJoint(); joint.name = bone.name; joint.position.set(bone.position.x, bone.position.y, bone.position.z); joint.rotation.setFromAxis( bone.rotation.axis.x, bone.rotation.axis.y, bone.rotation.axis.z, MathUtils.radiansToDegrees * bone.rotation.angle); if (bone.scale != null) { if (bone.scale.factor == 0) joint.scale.set(bone.scale.x, bone.scale.y, bone.scale.z); else joint.scale.set(bone.scale.factor, bone.scale.factor, bone.scale.factor); } joints.add(joint); nameToJoint.put(joint.name, joint); } List<Boneparent> hierarchy = ogreSkel.getBonehierarchy().getBoneparent(); for (int i = 0; i < hierarchy.size(); i++) { Boneparent link = hierarchy.get(i); SkeletonJoint joint = nameToJoint.get(link.getBone()); SkeletonJoint parent = nameToJoint.get(link.getParent()); parent.children.add(joint); joint.parent = parent; } Skeleton skel = new Skeleton(); for (int i = 0; i < joints.size(); i++) { SkeletonJoint joint = joints.get(i); if (joint.parent == null) skel.hierarchy.add(joint); } skel.buildFromHierarchy(); List<Animation> animations = ogreSkel.getAnimations().getAnimation(); for (int i = 0; i < animations.size(); i++) { Animation animation = animations.get(i); SkeletonKeyframe[][] perJointkeyFrames = new SkeletonKeyframe[skel.bindPoseJoints.size][]; List<Track> tracks = animation.getTracks().getTrack(); if (tracks.size() != perJointkeyFrames.length) throw new IllegalArgumentException("Number of tracks does not equal number of joints"); Matrix4 rotation = new Matrix4(); Matrix4 transform = new Matrix4(); for (int j = 0; j < tracks.size(); j++) { Track track = tracks.get(j); String jointName = track.getBone(); int jointIndex = skel.namesToIndices.get(jointName); if (perJointkeyFrames[jointIndex] != null) throw new IllegalArgumentException( "Track for bone " + jointName + " in animation " + animation.name + " already defined!"); SkeletonKeyframe[] jointKeyFrames = new SkeletonKeyframe[track.getKeyframes().getKeyframe().size()]; perJointkeyFrames[jointIndex] = jointKeyFrames; for (int k = 0; k < track.getKeyframes().getKeyframe().size(); k++) { Keyframe keyFrame = track.getKeyframes().getKeyframe().get(k); SkeletonKeyframe jointKeyframe = new SkeletonKeyframe(); jointKeyframe.timeStamp = keyFrame.time; jointKeyframe.position.set( keyFrame.translate.x, keyFrame.translate.y, keyFrame.translate.z); if (keyFrame.scale != null) { if (keyFrame.scale.factor == 0) jointKeyframe.scale.set(keyFrame.scale.x, keyFrame.scale.y, keyFrame.scale.z); else jointKeyframe.scale.set( keyFrame.scale.factor, keyFrame.scale.factor, keyFrame.scale.factor); } jointKeyframe .rotation .setFromAxis( keyFrame.rotate.axis.x, keyFrame.rotate.axis.y, keyFrame.rotate.axis.z, MathUtils.radiansToDegrees * keyFrame.rotate.angle) .nor(); jointKeyframe.parentIndex = skel.bindPoseJoints.get(jointIndex).parentIndex; jointKeyFrames[k] = jointKeyframe; rotation.set(jointKeyframe.rotation); rotation.trn(jointKeyframe.position); transform.set(skel.sceneMatrices.get(jointIndex)); transform.mul(rotation); if (jointKeyframe.parentIndex != -1) { rotation.set(skel.offsetMatrices.get(jointKeyframe.parentIndex)).mul(transform); transform.set(rotation); } transform.getTranslation(jointKeyframe.position); transform.getRotation(jointKeyframe.rotation); } } for (int j = 0; j < perJointkeyFrames.length; j++) { if (perJointkeyFrames[j] == null) throw new IllegalArgumentException("No track for bone " + skel.jointNames.get(j)); } skel.animations.put( animation.name, new SkeletonAnimation(animation.name, animation.length, perJointkeyFrames)); } return skel; }