Bone/Skin System understanding check

I just wanted to make sure i understood the bone/skin system correctly.



SkinNode-propagates bone transforms to the node's geometry while controlling influence with weights



Bone-primary job is to propagate transforms to children

AnimationController-(building on the control of BoneAnimation)controls the use of the bone animation data by grouping data sets so we can do run jump and roll animations without chopping the animation up; ie frames 1-20 run, 21-40 jump, 41-60 roll.

BoneAnimation-controls the use of the bone animation data(cycles through the animation)

BoneTransform-raw bone animation data



What is the difference between bones and node? do nodes not have the propagation of transformations?

And what is the difference between SpatialTransformer and BoneAnimation?

Fungi said:
What is the difference between bones and node?

The difference is that nodes propagate transforms at the time of rendering where as bones have to propagate their transforms before rendering to be able to apply the weights properly. right?

/bump, because this is my current field of work, and I'd really like to see some lines from the developers on this topic.  :slight_smile:

Bones and Nodes are very similar because Bones extend Nodes, and so therefore are everything Nodes are.  What the Bone class adds on top of Node functionality is the idea of a "Bind Matrix" or in other words, a reference to an initially understood positioning of that Bone in space.  It also has helper functions for moving a vertices from positions relative to the bind pose to positions relative to the Bones current position.  This is used in skin deformation to keep a skin attached and moving alongside a bone (or multiple bones using weighting)

I'm trying to figure out what ConnectionPoints are for but i can't get it. I've got a guess how they will be used but its still unclear. Anyone know what they are for?

Connection points were originally written as simple points for weapons, armor, or other accessories to be connected to a model.  Mojo has been spending time working on improvements to animation and such, so it's possible this has evolved.

I still don't under stand there use. You can add and save connection points in skinnode but it doesn't seem to actually to anything with them. As for attaching item it would seem that you could just attached int to the bone node with the item's node transform acting like a bind matrix and since it would be node propagation the effective weight would be 1. i can't think of a time when a weapon would be affected by multiple bones or have weights other than 1. if such a case did exist you could just put the weapon inside skin node and attach it. so i don't see what connection point does or was designed to become.



I'm inside a cloud of confusion and can't see, please help me! :slight_smile:

I think they served the purpose of being easier to find in a game.  You set up the connection points in a tool beforehand against a Bone that may be in a very deep hierarchy, then your game just finds ands uses the connection points at the skin level without having to understand the hierarchy of your skeleton.

why an ArrayList, I don't know much about optimization and big O notation but it seems that a Hashtable would be better. Assuming you are using the name of the connection point as a reference.

That's possible, although you probably will have only a few connection points most of the time.  Still, mark (mojomonkey) is working on this section so expect to see changes and improvements.

The original purpose of ConnectionPoints has been lost with some changes to the Skin/Bone system. Originally, the Skeleton did not actually move with the skin in world space. Therefore, you could not attach any objects to the skeletal system and have it move with the skin. The ConnectionPoint would be used to connect to the skin, and replicate the movement of the bone, but in the skin's world space. However, skeletons now move with the skins, so ConnectionPoints are no longer needed and should be removed from CVS.



I have an implementation of hardpoints here at work. They are much simpler, as they are simply a Bone with a tag of being hardpoints to allow for easier location (most of the work is on a system to manage hardpoints, not the hardpoints themselves).



So, basically, to answer your question, you don't need to use ConnectionPoints any longer.

mojomonk said:
However, skeletons now move with the skins


I cannot confirm this.

I have a particle system attached to a bone. The system animates nicely with the animation, so far so good. But no transformation of the skin (or the root node for that matter) carries over to the skeleton (made visible via BoneDebugger) or the attached particle system.

Any idea what I could be doing wrong?

what are the xOffset and nOffset fields in the Bone Influence?


public void applyBone(BoneInfluence inf, Vector3f vstore, Vector3f nstore) {
       if(!optimizeTransform) {
           transform.loadIdentity();
           transform.setRotationQuaternion(worldRotation);
           transform.setTranslation(worldTranslation);
       }

        if(inf.vOffset != null) {
           workVectA.set(inf.vOffset);
           transform.rotateVect(workVectA);
           transform.translateVect(workVectA);
           workVectA.multLocal(inf.weight);
           vstore.addLocal(workVectA);
        }

        if(inf.nOffset != null) {
            workVectA.set(inf.nOffset);       
            transform.rotateVect(workVectA);
            workVectA.multLocal(inf.weight);
            nstore.addLocal(workVectA);
        }
    }