Files
Kepler/engine/skeleton.js

109 lines
2.5 KiB
JavaScript
Raw Normal View History

2025-11-17 17:18:43 +01:00
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;
}