[osg-users] fbx animation

Josue Hernandez osgforum at tevs.eu
Mon Apr 11 10:36:55 PDT 2011


Hi, this is the code that i'm using:

#include <osg/Node>
#include <osg/MatrixTransform>
#include <osg/Group>
#include <osg/Timer>
#include <osgGA/TrackBallManipulator>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <iostream>	
#include <osgViewer/ViewerEventHandlers>
#include <osgAnimation/BasicAnimationManager>
using namespace std;

static osg::Timer_t old_tick,new_tick;
int bandera=0;
static double delta;

class tankControll: public osgGA::GUIEventHandler{
	public:
	tankControll(){
		acc=0;
	};
	virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa){
		if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN && (ea.getKey()=='q' || ea.getKey()=='Q')){
				bandera=0;
				bandera=1;
				return true;
		}else if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN && (ea.getKey()=='w' || ea.getKey()=='W')){
			bandera=0;
			bandera=2;
				return true;
		}else if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN && (ea.getKey()=='e' || ea.getKey()=='E')){
			bandera=0;	
			bandera=3;
				return true;
		}else if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN && (ea.getKey()=='a' || ea.getKey()=='A')){
			bandera=0;	
			bandera=4;
				return true;
		}else if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN && (ea.getKey()=='s' || ea.getKey()=='S')){
			bandera=0;	
			bandera=5;
				return true;
		}else if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN && (ea.getKey()=='d' || ea.getKey()=='D')){
			bandera=0;	
			bandera=6;
				return true;
		}else{
			return false;
		}
	}
private:
	int acc;
};

struct AnimationManagerFinder : public osg::NodeVisitor 
{ 
    osg::ref_ptr<osgAnimation::BasicAnimationManager> _am; 
    
    AnimationManagerFinder() {setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); } 
    
    void apply(osg::Node& node) { 
    
        if (_am.valid()) 
            return; 
    
        if (node.getUpdateCallback()) {        
            _am = dynamic_cast<osgAnimation::BasicAnimationManager*>(node.getUpdateCallback()); 
            return; 
        } 
        
        traverse(node); 
    } 
}; 


int main()
{
	osg::ref_ptr<osg::Node> escena = osgDB::readNodeFile("Lerpz.osgb");    
	if (!escena){
		cout<<"I´m not reading"<<endl;
		//exit(0);
	}
	
	AnimationManagerFinder finder; 
	escena->accept(finder); 

	const osgAnimation::AnimationList& animations = finder._am->getAnimationList();
	tankControll *eh=new tankControll();

	osgViewer::Viewer visor;

	visor.setSceneData(escena);
	visor.addEventHandler(eh);
	/*if(bandera==1)
		finder._am->playAnimation( animations[1].get() );
	else if(bandera==2)
		finder._am->playAnimation( animations[2].get() );
	else if(bandera==3)
		finder._am->playAnimation( animations[3].get() );*/
	
	visor.setCameraManipulator(new osgGA::TrackballManipulator);
	
	visor.realize();
	while ( !visor.done()){
	//while (bandera!=6){
		
		if (bandera==1)
			finder._am->playAnimation( animations[1].get() );
		else
		if (bandera==2)
			finder._am->playAnimation( animations[2].get() );
		else
		if (bandera==3)
			finder._am->playAnimation( animations[3].get() );
		else
			printf("%i",bandera);
		
       visor.frame();
	
	}
	
	return visor.run();
	

}

the problem is the follow: when i press the w after the q, or e, it seems that animations are one over the other, why it happens?

... 

Thank you!

Cheers,
Josue

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=38406#38406








More information about the osg-users mailing list