First commit
This commit is contained in:
109
engine/skeleton.js
Executable file
109
engine/skeleton.js
Executable file
@@ -0,0 +1,109 @@
|
||||
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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user