const std::list<int>& BoneBridgeCAL3D::GetListChildBoneID() const { CalBone* calBone = (CalBone*)GetCalBone(); CalCoreBone* coreBone = calBone->getCoreBone(); std::list<int>& listChildID = coreBone->getListChildId(); return listChildID; }
void IKCharacter::setup( CalSkeleton* cal_skel, bool _auto_root_follow ) { skeleton = cal_skel; auto_root_follow = _auto_root_follow; // find leaf bones deque<int> current; vector<int> roots = cal_skel->getCoreSkeleton()->getVectorRootCoreBoneId(); current.insert( current.begin(), roots.begin(), roots.end() ); while( !current.empty() ) { CalCoreBone* check = skeleton->getCoreSkeleton()->getCoreBone( current.front() ); list<int> children = check->getListChildId(); if ( children.size()==0 ) { // this is a leaf leaf_bones.push_back( current.front() ); printf("found leaf: %s\n", skeleton->getCoreSkeleton()->getCoreBone( leaf_bones.back() )->getName().c_str() ); } else { // not a leaf current.insert( current.end(), children.begin(), children.end() ); } // store length // default non-zero bone_lengths[current.front()] = 0.0001f; if ( check->getParentId()!= -1 ) { CalCoreBone* parent = skeleton->getCoreSkeleton()->getCoreBone( check->getParentId() ); CalVector delta = check->getTranslationAbsolute() - parent->getTranslationAbsolute(); bone_lengths[check->getParentId()] = delta.length(); } // cached rotations debug_cached_rotations[current.front()] = CalQuaternion(); current.pop_front(); } // set all weights to default vector<CalCoreBone*> all_bones = skeleton->getCoreSkeleton()->getVectorCoreBone(); for( int i=0; i<all_bones.size() ;i++ ) { weight_centres[all_bones[i]->getId()] = 0.5f; } // release all leaves for ( int i=0; i<leaf_bones.size() ;i++ ) { weight_centres[leaf_bones[i]] = 0; } // pin all roots for ( int i=0; i<roots.size(); i++ ) { weight_centres[roots[i]] = 1; } // fetch world positions from Cal3D model pullWorldPositions(); // set targets /* for ( int i=0; i<leaf_bones.size(); i++ ) { CalVector p = world_positions[leaf_bones[i]]; setTarget( leaf_bones[i], ofxVec3f(p.x,p.y,p.z) ); }*/ // setupMagicIgnoringRotationOffsets(); }