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


_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to