|
发表于 2012-9-29 18:37:12
|
显示全部楼层
本帖最后由 buaahc 于 2012-9-29 19:12 编辑
你不是就是想得到运动小车的位置么 为什么要这么麻烦。。。
怎么还添加了路径动画控制事件。。。
第一我不知道 你为什么要 定义mtcow并且 mtCow->setMatrix(m);这句话有什么用。。。
virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
{
osg::ref_ptr<osg::MatrixTransform> mtCow = dynamic_cast<osg::MatrixTransform*>(node);
if (mtCow.valid())
{
m=osg::computeLocalToWorld(nv->getNodePath());
mtCow->setMatrix(m);
}
traverse( node, nv );
}
直接
class CarCallback :public osg::NodeCallback
{
public:
CarCallback()
{
}
virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
{
{
m=osg::computeLocalToWorld(nv->getNodePath());
}
traverse( node, nv );
}
osg::Matrixd& getMatrixd() //自定义一个方法,每次回调获取的m值
{
return m;
}
public:
osg::Matrixd m;
};
就ok!
然后我不知道osg::ref_ptr<osg::AnimationPathCallback> animationPathCallback = new osg::AnimationPathCallback() ;你要做什么,你所写的事件处理函数
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&)
{
//创建动画更新回调对象---------------------------------------------------------------------------------------
osg::ref_ptr<osg::AnimationPathCallback> animationPathCallback = new osg::AnimationPathCallback() ;//没看懂你定义这个animationPathCallback 做什么
osg::ref_ptr< osg::Group> group = dynamic_cast<osg::Group*>(viewer.getSceneData()) ;//这句话你无非想要得到main()中的根节点点罢了,直接传进来不就行了
//取得节点的动画属性
animationPathCallback = dynamic_cast<osg::AnimationPathCallback*>(group->getChild(0)->getUpdateCallback());//这句话我完全不明白你要干什么。
//节点回调!!!
s_carcallback =new CarCallback();
group->getChild(0)->addUpdateCallback(s_carcallback); //这句话就是进行节点的不断更新回调得到Matrix
。。。。
}
直接这样
class AnimationEventHandler : public osgGA::GUIEventHandler
{
public:
AnimationEventHandler(osg::ref_ptr<osg::group>pMoot)://直接将main函数中的根节点传进来
{
this-> pGroup = pMoot;
this-> pNode = pGroup->getChild(n);//接收group的第n个节点
this-> s_carcallback = new CarCallback();//创建回调节点,不断得出世界坐标
this-> pNode->setUpdateCallback(s_carcallback);//使用第n个节点进行不断地更新回调 ,得到第n个节点的坐标
}
//ok了
void getDistance() //获取小车回调类中的m值
{
this->m1=s_carcallback->getMatrixd();
cout<<m1.getTrans().y()<<endl;
}
//事件处理
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&)
{
switch(ea.getEventType())
{
case (osgGA::GUIEventAdapter::FRAME):
{
getDistance();
return false;
}
default :
return false;
}
}
private:
osg::ref_ptr<osg::group>pGroup;//接收main()函数中的根节点
osg::ref_ptr<CarCallback >s_carcallback ;
osg::ref_pfr<osg::Node>pNode;
osg::Matrix m1;
}
你试一下 有问题再说~ |
|