[osg-users] about the state of the BVH plug-in, when used with CMU MoCap files
Alex Chen
alex.xl.zhou at gmail.com
Tue Apr 26 10:20:35 PDT 2016
Hi all,
I get the same problem with BVH plug in when using CMU dataset.
Below is my minor fix to the code and it seems to work for several motions I loaded.
File attached.
Main changes:
typedef std::pair<osg::ref_ptr<osgAnimation::Bone>, std::pair<int, std::string> > JointNode;
void alterChannel( std::string name, std::pair<int, std::string>& p )
{
int& value = p.first;
std::string& str = p.second;
if ( name=="Xposition" ) value |= 0x01;
else if ( name=="Yposition" ) value |= 0x02;
else if ( name=="Zposition" ) value |= 0x04;
else if ( name=="Zrotation" ) {value |= 0x08; str.push_back('Z');}
else if ( name=="Xrotation" ) {value |= 0x10; str.push_back('X');}
else if ( name=="Yrotation" ) {value |= 0x20; str.push_back('Y');}
}
void setKeyframe( osgDB::Input& fr, int ch, const std::string& order, double time,
osgAnimation::Vec3KeyframeContainer* posKey,
osgAnimation::QuatKeyframeContainer* rotKey )
{
if ( ch&0x07 && posKey ) // Position keyframe
{
float keyValue[3] = { 0.0f };
if ( ch&0x01 ) fr.readSequence( keyValue[0] );
if ( ch&0x02 ) fr.readSequence( keyValue[1] );
if ( ch&0x04 ) fr.readSequence( keyValue[2] );
osg::Vec3 vec( keyValue[0], keyValue[1], keyValue[2] );
posKey->push_back( osgAnimation::Vec3Keyframe(time, vec) );
}
if ( ch&0x38 && rotKey ) // Rotation keyframe
{
osg::Matrix rotMat;
float keyValue[3] = { 0.0f };
for(int i = 0; i < order.size(); ++i) {
char f = order[i];
if(f == 'X') {
if ( ch&0x10 ) fr.readSequence( keyValue[0] );
rotMat = osg::Matrix::rotate(osg::DegreesToRadians(keyValue[0]), osg::Vec3(1.0,0.0,0.0)) * rotMat;
}
else if(f == 'Y') {
if ( ch&0x20 ) fr.readSequence( keyValue[1] );
rotMat = osg::Matrix::rotate(osg::DegreesToRadians(keyValue[1]), osg::Vec3(0.0,1.0,0.0)) * rotMat;
}
else if(f == 'Z') {
if ( ch&0x08 ) fr.readSequence( keyValue[2] );
rotMat = osg::Matrix::rotate(osg::DegreesToRadians(keyValue[2]), osg::Vec3(0.0,0.0,1.0)) * rotMat;
}
}
osg::Quat quat = rotMat.getRotate();
rotKey->push_back( osgAnimation::QuatKeyframe(time, quat) );
}
}
There are a few other places that can be seen by compared files.
Cheers,
Alex
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=66969#66969
Attachments:
http://forum.openscenegraph.org//files/readerwriterbvh_119.cpp
More information about the osg-users
mailing list