//----------------------------------------------------------------------- void Animation::_applyBaseKeyFrame() { if (mUseBaseKeyFrame) { Animation* baseAnim = this; if (mBaseKeyFrameAnimationName != StringUtil::BLANK && mContainer) baseAnim = mContainer->getAnimation(mBaseKeyFrameAnimationName); if (baseAnim) { for (NodeTrackList::iterator i = mNodeTrackList.begin(); i != mNodeTrackList.end(); ++i) { NodeAnimationTrack* track = i->second; NodeAnimationTrack* baseTrack; if (baseAnim == this) baseTrack = track; else baseTrack = baseAnim->getNodeTrack(track->getHandle()); TransformKeyFrame kf(baseTrack, mBaseKeyFrameTime); baseTrack->getInterpolatedKeyFrame(baseAnim->_getTimeIndex(mBaseKeyFrameTime), &kf); track->_applyBaseKeyFrame(&kf); } for (VertexTrackList::iterator i = mVertexTrackList.begin(); i != mVertexTrackList.end(); ++i) { VertexAnimationTrack* track = i->second; if (track->getAnimationType() == VAT_POSE) { VertexAnimationTrack* baseTrack; if (baseAnim == this) baseTrack = track; else baseTrack = baseAnim->getVertexTrack(track->getHandle()); VertexPoseKeyFrame kf(baseTrack, mBaseKeyFrameTime); baseTrack->getInterpolatedKeyFrame(baseAnim->_getTimeIndex(mBaseKeyFrameTime), &kf); track->_applyBaseKeyFrame(&kf); } } } // Re-base has been done, this is a one-way translation mUseBaseKeyFrame = false; } }
void OgreSample19App::tweakSneakAnim() { SkeletonPtr skel = SkeletonManager::getSingleton().load("jaiqua.skeleton",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); Animation * anim = skel->getAnimation("Sneak"); Animation::NodeTrackIterator tracks = anim->getNodeTrackIterator(); while(tracks.hasMoreElements()) { NodeAnimationTrack * track = tracks.getNext(); TransformKeyFrame oldKf(0,0); track->getInterpolatedKeyFrame(ANIM_CHOP,&oldKf); while (track->getKeyFrame(track->getNumKeyFrames()-1)->getTime() >= ANIM_CHOP - 0.3f) { track->removeKeyFrame(track->getNumKeyFrames()-1); } TransformKeyFrame * newKf = track->createNodeKeyFrame(ANIM_CHOP); TransformKeyFrame * startKf = track->getNodeKeyFrame(0); Bone * bone = skel->getBone(track->getHandle()); if (bone->getName() == "Spineroot") { mSneakStartPos = startKf->getTranslate() + bone->getInitialPosition(); mSneakEndPos = oldKf.getTranslate() + bone->getInitialPosition(); mSneakStartPos.y = mSneakEndPos.y; newKf->setTranslate(oldKf.getTranslate()); newKf->setRotation(oldKf.getRotation()); newKf->setScale(oldKf.getScale()); } else { newKf->setTranslate(startKf->getTranslate()); newKf->setRotation(startKf->getRotation()); newKf->setScale(startKf->getScale()); } } }