109 lines
2.5 KiB
JavaScript
Executable File
109 lines
2.5 KiB
JavaScript
Executable File
kepler.skeleton(){
|
|
this.root;
|
|
this.bones = [];
|
|
this.name;
|
|
|
|
this.rootTransformation;
|
|
|
|
this.delta = 0;
|
|
this.currentAnimationMatrix;
|
|
}
|
|
|
|
kepler.skeleton.prototype.parse( boneInfo, rootNode ) {
|
|
var bone = kepler.createObject("bone");
|
|
|
|
this.rootTransformation = kepler.matrix4.fromArray( rootNode.transformation );
|
|
|
|
bone.isRoot = true;
|
|
bone.transformation = kepler.matrix4.fromArray( boneInfo.transformation );
|
|
bone.globalTransformation = bone.transformation;
|
|
|
|
this.bones.push(bone);
|
|
this.root = bone;
|
|
|
|
|
|
for(var c = 0; c < boneInfo.children.length; c++) {
|
|
|
|
this.parseChild(bone, boneInfo.children[c]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
kepler.skeleton.prototype.parseChild( parentBone, childBoneInfo ) {
|
|
var bone = kepler.createObject("bone");
|
|
|
|
bone.parent = parentBone;
|
|
bone.transformation = kepler.matrix4.fromArray( childBoneInfo.transformation );
|
|
bone.name = childBoneInfo.name;
|
|
bone.globalTransformation = kepler.matrix4.mul( bone.transformation, parentBone.globalTransformation );
|
|
|
|
this.bones.push(bone);
|
|
|
|
parentBone.addChild(bone);
|
|
|
|
//parse Children
|
|
if(childBoneInfo.children)
|
|
for(var c = 0; c < childBoneInfo.children.length; c++) {
|
|
|
|
this.parseChild(bone, childBoneInfo.children[c]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
kepler.skeleton.prototype.getBoneByName( name ) {
|
|
var bones = this.bones;
|
|
for(var c = 0; c < bones.length; c++) {
|
|
var bone = bones[c];
|
|
|
|
if(bone.name == name)
|
|
return bone;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
kepler.skeleton.prototype.parseAnimation( channels ) {
|
|
for(var c = 0; c < channels.length; c++) {
|
|
var channel = channels[c];
|
|
var name = channel.name;
|
|
|
|
var bone = this.getBoneByName(name);
|
|
|
|
if(bone) {
|
|
bone.positionkeys = channel.positionkeys;
|
|
bone.rotationkeys = channel.rotationkeys;
|
|
}
|
|
}
|
|
}
|
|
|
|
kepler.skeleton.prototype.animate( bone, id ) {
|
|
bone.currentAnimationMatrix = kepler.matrix4.identity();
|
|
|
|
if(bone.positionkeys) {
|
|
|
|
|
|
if(bone.positionkeys[id]) {
|
|
var currentTranslation = bone.positionkeys[id][1];
|
|
bone.currentAnimationMatrix = kepler.matrix4.setTranslation(bone.currentAnimationMatrix, currentTranslation);
|
|
}
|
|
|
|
|
|
if(bone.rotationkeys[id]) {
|
|
var currentRotation = bone.rotationkeys[id][1];
|
|
bone.currentAnimationMatrix = kepler.matrix4.rotateZYX(bone.currentAnimationMatrix, currentRotation);
|
|
|
|
}
|
|
//console.log(bone.currentAnimationMatrix);
|
|
|
|
if(bone.parent)
|
|
bone.globalTransformation = kepler.matrix4.mul( bone.currentAnimationMatrix, bone.parent.globalTransformation );
|
|
//else
|
|
// bone.globalTransformation = kepler.matrix4.identity();
|
|
}
|
|
|
|
|
|
return bone;
|
|
|
|
} |