Exemplo n.º 1
0
    //-------------------------------------------------------------------------
    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;
                }
            }
        }
    }
Exemplo n.º 2
0
/**
 * 指定したアニメーションにアニメーションカーブを読み込む
 *
 * @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 );
	}
}