查看: 1464|回复: 9

nodecallback里的时间差为什么没改变

[复制链接]

该用户从未签到

发表于 2013-9-23 13:57:30 | 显示全部楼层 |阅读模式
本帖最后由 osg小菜 于 2013-9-23 13:57 编辑

写了一个动画回调,希望根据时间变化调用不同的动画路径,可是运行的时候发现“参考时间与当前时间差”只是在刚运行的时候有值,之后不变,对“nv->getFrameStamp()->getReferenceTime()”这个也不是太了解,版主教我啊??
class AnimateCallback : public osg::NodeCallback
{
        public:
                AnimateCallback(){ }

        virtual void operator() (osg::Node* node, osg::NodeVisitor* nv)
        {
               
        //验证得到的结点是不是
                osg:ositionAttitudeTransform* pat =  dynamic_cast<osg::PositionAttitudeTransform*> (node);
        //如果是的
                if (nv  && nv->getFrameStamp())
                {
                        //const osg::BoundingSphere&  bs2 = m_group->getChild(2)->getBound();

                        osg::AnimationPath* animation20= CreateAnimationPath20(osg::Vec3(0.0,0.0,0.0),95,5.0);
                        osg::AnimationPathCallback* apc20 =
                                new osg::AnimationPathCallback(animation20,45,1.0);
                       
                        osg::AnimationPath* animation21= CreateAnimationPath20(osg::Vec3(0.0,0.0,0.0),95,5.0);
                        osg::AnimationPathCallback* apc21 =
                                new osg::AnimationPathCallback(animation21,45,1.0);
                        //得到参考时间与当前时间差,
                        double time = nv->getFrameStamp()->getReferenceTime();
                       
                        if(time>=0.0 && time <=50.0)
                                pat->setUpdateCallback(apc20);                               
                        else
                                 pat->setUpdateCallback(apc21);
                        std::cout<<time<<std::endl;
                }

                traverse(node,nv);
        }
        protected:
};

osg::ref_ptr<osg::PositionAttitudeTransform> pata20 = new osg::PositionAttitudeTransform();
pata20 ->setUpdateCallback(new AnimateCallback);
pata20->addChild(model);
root->addChild(pata20); ... ...

谢谢!

该用户从未签到

发表于 2013-9-23 14:25:53 | 显示全部楼层
首先一个问题 严重的内存管理问题啊osg::AnimationPath* animation21  这些都没有使用内存计数管理

其次您说的那个效果 是不是跟上面的逻辑 是正确的?

该用户从未签到

 楼主| 发表于 2013-9-23 14:36:39 | 显示全部楼层
liuzhiyu123 发表于 2013-9-23 14:25
首先一个问题 严重的内存管理问题啊osg::AnimationPath* animation21  这些都没有使用内存计数管理

其次 ...

小弟刚入手,写的比较粗糙,我给time赋了不同的值做了实验,是按照那个逻辑走的,现在问题就是那个时间不随着动画的进行改变,,,?
谢谢版主纠正指导哈。

该用户从未签到

发表于 2013-9-23 15:06:51 | 显示全部楼层
double time = nv->getFrameStamp()->getReferenceTime();  
这个time 一直是不变的?

该用户从未签到

 楼主| 发表于 2013-9-23 15:13:39 | 显示全部楼层
liuzhiyu123 发表于 2013-9-23 15:06
double time = nv->getFrameStamp()->getReferenceTime();  
这个time 一直是不变的?

QQ截图20130923150819.png
就输出了这组,然后就没改变了??

该用户从未签到

发表于 2013-9-23 15:54:25 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-9-23 15:56 编辑

double time = nv->getFrameStamp()->getReferenceTime();
是指运行到当前帧的相对时间,就是程序执行帧循环开始,到执行该语句时的相对帧的运行时间。
因为这个帧号没有发生改变,所以时间也不会表面化,你可以用绝对帧试试!
另外,得到当前运算时间,如下:
osg::Timer_t tTick = osg::Timer::instance()->tick();
    double dCurrentTime = osg::Timer::instance()->delta_s(pViewer->getStartTick(), tTick);

该用户从未签到

 楼主| 发表于 2013-9-23 16:00:32 | 显示全部楼层
VR_user_happy 发表于 2013-9-23 15:54
double time = nv->getFrameStamp()->getReferenceTime();
是指运行到当前帧的相对时间,就是程序执行帧循 ...

那随着帧的执行,帧开始到当前帧的时间不是应该一直变化的吗?难道这个就执行了一遍?以后就不来这儿了吗?

该用户从未签到

发表于 2013-9-23 16:12:29 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-9-23 16:16 编辑

这就是参考帧的概念,和绝对帧的区别
不是不来了,绝对帧是变化的!
就如同RTT设定了参考帧,这个帧就固定下来了,记录的就是这个邮戳的号的帧!

该用户从未签到

 楼主| 发表于 2013-9-23 17:28:34 | 显示全部楼层
VR_user_happy 发表于 2013-9-23 16:12
这就是参考帧的概念,和绝对帧的区别
不是不来了,绝对帧是变化的!
就如同RTT设定了参考帧,这个帧就固定 ...

恩,,,我再想想,顺便问下我再nodecallback里设置这个“pat->setUpdateCallback(apc20)”会有什么影响?,我调试了下,注释掉这句后time就可以正常走了,

该用户从未签到

发表于 2013-9-23 19:47:08 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-9-23 20:11 编辑

1.注释掉这句:
    就是不执行对应的回调了(估计你的动画路径一个也没执行),它只是执行空行语句!  
不代表你的程序按你的意图执行!
2.不是每时每刻i都需要执行一次动画路径回调(不注释掉前,它在不断地在调用新的动画路径),只需要在相应的地方执行一次就行了,到一定的时间再执行另外的一个就好了!
这个可能是你时间为什么不变的真正原因(回调中迭代回调,相当于每次都是重新计时),就是使用相当于该回调执行开始,到当前帧时间,那么这个相对帧就是固定的了!你注释掉后,那这个相对帧相对于执行回调初始化的位置发生了变化(只执行了一次回调初始化),相对初始化的帧号会不断前进,发生变化了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表