void CalCoreBone::calculateState() { if(m_parentId == -1) { // no parent, this means absolute state == relative state m_translationAbsolute = m_translation; m_rotationAbsolute = m_rotation; } else { // get the parent bone CalCoreBone *pParent; pParent = m_pCoreSkeleton->getCoreBone(m_parentId); // transform relative state with the absolute state of the parent m_translationAbsolute = m_translation; m_translationAbsolute *= pParent->getRotationAbsolute(); m_translationAbsolute += pParent->getTranslationAbsolute(); m_rotationAbsolute = m_rotation; m_rotationAbsolute *= pParent->getRotationAbsolute(); } // calculate all child bones std::list<int>::iterator iteratorChildId; for(iteratorChildId = m_listChildId.begin(); iteratorChildId != m_listChildId.end(); ++iteratorChildId) { m_pCoreSkeleton->getCoreBone(*iteratorChildId)->calculateState(); } }
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(); }