00001 #include <gmtl/Math.h>
00002 #include "ani/KeyFrame/PosQuatKey.h"
00003 #include "ani/KeyFrame/KeyFramer.h"
00004
00005 float getDist( const ani::PosQuatKey& key1, const ani::PosQuatKey& key2 )
00006 {
00007 kev::Vec3<float> vec = key1.position() - key2.position();
00008 return vec.length();
00009 }
00010
00011
00012 float getTotalDist( ani::KeyFramer<ani::PosQuatKey>& keyFramer )
00013 {
00014 std::map<float, ani::PosQuatKey>::iterator it1 = keyFramer.keys().begin();
00015 std::map<float, ani::PosQuatKey>::iterator it2 = it1;
00016 ++it2;
00017 float total_dist = 0.0f;
00018 for (; it2 != keyFramer.keys().end(); ++it1, ++it2)
00019 {
00020 ani::PosQuatKey& key1 = (*it1).second;
00021 ani::PosQuatKey& key2 = (*it2).second;
00022 total_dist += getDist( key1, key2 );
00023 }
00024 return total_dist;
00025 }
00026
00027
00028 void output( const ani::PosQuatKey& key )
00029 {
00030 float w, x, y, z;
00031 gmtl::getRot( key.rotation(), w, x, y, z );
00032 std::cout << "KEY "<<key.time()<<": "<<key.position()[0]<<", \t"<<key.position()[1]<<", \t"<<key.position()[2]<<", |#| "<<gmtl::Math::rad2Deg( w )<<", "<<x<<", "<<y<<", "<<z<<"\n"<<std::flush;
00033 }
00034
00035 void smooth( ani::KeyFramer<ani::PosQuatKey>& keyFramer, float length )
00036 {
00037 float total_dist = getTotalDist( keyFramer );
00038 std::map<float, ani::PosQuatKey> workspace = keyFramer.keys();
00039 keyFramer.clear();
00040
00041 cout<<keyFramer.keys().size()<<" "<<workspace.size()<<"\n"<<flush;
00042
00043 float total_time_over_dist = length / total_dist;
00044
00045 std::map<float, ani::PosQuatKey>::const_iterator it1 = workspace.begin();
00046 std::map<float, ani::PosQuatKey>::const_iterator it2 = workspace.begin();
00047 ++it2;
00048 float time_so_far = 0.0f;
00049 ani::PosQuatKey newKey = (*it1).second;
00050 newKey.time() = time_so_far;
00051 keyFramer.addkey( newKey );
00052 for (; it2 != workspace.end(); )
00053 {
00054 const ani::PosQuatKey& key1 = (*it1).second;
00055 const ani::PosQuatKey& key2 = (*it2).second;
00056 float dist = getDist( key1, key2 );
00057 float time = total_time_over_dist * dist;
00058
00059 ani::PosQuatKey newKey1 = key1;
00060 ani::PosQuatKey newKey2 = key2;
00061
00062 newKey1.time() = time_so_far;
00063 newKey2.time() = time_so_far + time;
00064
00065 time_so_far += time;
00066
00067 keyFramer.addkey( newKey2 );
00068 output( newKey1 );
00069 ++it1;
00070 ++it2;
00071 }
00072 }