//------------------------------------------------------------------------- void AFile::addTo( Ogre::SkeletonPtr skeleton, const String& name ) const { if( skeleton->hasAnimation( name) ) return; Ogre::Real length( ( m_frames.size() - 1 ) * FRAME_DURATION ); Ogre::Animation *anim( skeleton->createAnimation(name, length )); uint16 track_handle( 0 ); Ogre::Bone* bone( skeleton->getBone( "root" ) ); Ogre::NodeAnimationTrack* track; track = anim->createNodeTrack( track_handle++, bone ); Ogre::Real time; size_t index( 0 ); for( FrameList::const_iterator frame( m_frames.begin()) ;frame != m_frames.end(); ++frame ) { time = (index++) * FRAME_DURATION; Ogre::TransformKeyFrame* key_frame( track->createNodeKeyFrame( time ) ); key_frame->setTranslate( frame->root_translation ); setFrameRotation( key_frame, frame->root_rotation ); } for( uint32 i(0); i < m_bone_count; ++i ) { if (i + 1 >= skeleton->getNumBones()) { // TODO: Figure out why this happens/fix it LOG_ERROR("Bone " + std::to_string(i + 1) + " is out of bounds " + std::to_string(skeleton->getNumBones()) + " for: " + name + " in: " + skeleton->getName()); } else { bone = skeleton->getBone(i + 1); track = anim->createNodeTrack(track_handle++, bone); time = 0; for (FrameList::const_iterator frame(m_frames.begin()) ; frame != m_frames.end(); ++frame) { const Ogre::Vector3& rot(frame->bone_rotations[i]); Ogre::TransformKeyFrame* key_frame(track->createNodeKeyFrame(time)); setFrameRotation(key_frame, rot); time += FRAME_DURATION; } } } }
/** * 指定したアニメーションにアニメーションカーブを読み込む * * @param animation アニメーション * @param channel_index アニメーションのチャンネルのインデックス * @param anim_curve FbxAnimCurve */ void FbxFileLoader::load_curve_for_animation( Animation& animation, Animation::ChannelIndex channel_index, const FbxAnimCurve* anim_curve ) { if ( ! anim_curve ) { return; } for ( int l = 0; l < anim_curve->KeyGetCount(); l++ ) { AnimationKeyFrame key_frame( static_cast< float >( anim_curve->KeyGetTime( l ).GetFrameCount() ), static_cast< float >( anim_curve->KeyGetValue( l ) ) ); animation.get_channel( channel_index ).add_key_frame( key_frame ); } }