查看: 3307|回复: 29

新手求助:仿书中的路径动画控制遇到异常

[复制链接]

该用户从未签到

发表于 2012-9-5 10:39:39 | 显示全部楼层 |阅读模式
本帖最后由 mxl12315 于 2012-9-29 10:34 编辑

最近对动画很感兴趣,对照肖老师书中的“路径动画控制及显示示例”,写了个小动画,但总是异常不断,以下是异常代码和截图,希望各位大神给小弟指点~拜托了

2222.jpg

该用户从未签到

发表于 2012-9-5 12:57:21 | 显示全部楼层
.valid 判断

该用户从未签到

 楼主| 发表于 2012-9-5 13:53:23 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 12:57
.valid 判断

您说的是让我的条件判断中写入animationcallback.valid()??我尝试过两个地方写入,如果在switch。。。case语句外面用这个判断括起来,这个动画就不动了,连查看器都不能随便移动观看;如果加入一个事件中,比如ea.getKey()=='p'的语句中,动画暂停或开启无响应。。。您看我是不是都加错地方了?求解~

该用户从未签到

发表于 2012-9-5 13:57:48 | 显示全部楼层
                  animationPathCallback = dynamic_cast<osg::AnimationPathCallback*>(group->getChild(0)->getUpdateCallback());


先判断获得的AnimationPathCallback 是否有效,然后在进行动画的控制

该用户从未签到

 楼主| 发表于 2012-9-5 14:05:02 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 13:57
animationPathCallback = dynamic_cast(group->getChild(0)->getUpdateCallback());

...

222.jpg

我按照您的提示写入了判断,运行后无异常错误,但画面打开后就这样了,鼠标移动不了场景。。不知啥原因,您看这种现象如何解决?机子性能和显卡没问题的

该用户从未签到

 楼主| 发表于 2012-9-5 14:08:03 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 13:57
animationPathCallback = dynamic_cast(group->getChild(0)->getUpdateCallback());

...

整个程序还算简单吧,动画路径是导入方式的,运行后可以看到小车按照轨迹运动,无非就是响应键盘事件后小车暂停。。哎,当初就是这句老异常跳出。。。。现在鼠标点击画面无响应了

该用户从未签到

发表于 2012-9-5 14:09:02 | 显示全部楼层
不确定您的问题,鼠标为什么移动不了场景了?在需要进行动画控制的时候,首先要判断动画的有效性,就是这些东西

该用户从未签到

 楼主| 发表于 2012-9-5 14:21:39 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 14:09
不确定您的问题,鼠标为什么移动不了场景了?在需要进行动画控制的时候,首先要判断动画的有效性,就是这些 ...

抱歉哈,鼠标USB口松了。。囧,现在好了,但异常跳到下一行了,您看我如何解决?我觉得我就是个路径导入而已,咋那坎坷
1.bmp
2.bmp

该用户从未签到

 楼主| 发表于 2012-9-5 14:23:35 | 显示全部楼层
mxl12315 发表于 2012-9-5 14:21
抱歉哈,鼠标USB口松了。。囧,现在好了,但异常跳到下一行了,您看我如何解决?我觉得我就是个路径导入而 ...

我按下‘P’键后,爆出异常,在->setPause(true)这里

该用户从未签到

发表于 2012-9-5 14:26:26 | 显示全部楼层
  1. void AnimationVisitor::apply( osg::Node & aNode )
  2. {
  3.         for (osg::NodeCallback* sNodeCallback = aNode.getUpdateCallback();
  4.                 sNodeCallback;
  5.                 sNodeCallback = sNodeCallback->getNestedCallback())
  6.         {
  7.                 if (osg::AnimationPathCallback* callback = dynamic_cast<osg::AnimationPathCallback*>(sNodeCallback))
  8.                 {
  9.                         if (m_Reset)
  10.                                 callback->reset();
  11.                         callback->setPause(m_Pause);
  12.                         switch (m_Looping)
  13.                         {
  14.                         case LOOP: callback->getAnimationPath()->setLoopMode(osg::AnimationPath::LOOP);break;
  15.                         case NO_LOOPING: callback->getAnimationPath()->setLoopMode(osg::AnimationPath::NO_LOOPING); break;
  16.                         case SWING: callback->getAnimationPath()->setLoopMode(osg::AnimationPath::SWING); break;
  17.                         default: break;
  18.                         }
  19.                 }
  20.         }
  21.         traverse(aNode);
  22. }
复制代码
好像没有那么难吧

该用户从未签到

 楼主| 发表于 2012-9-5 14:42:01 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 14:26
好像没有那么难吧

是啊,哎~我还不用任何遍历,就一辆车,一个地形,一个路径文件,一个handle事件。。怎么出这个异常?跟肖老师那本书上的结构也一样

该用户从未签到

发表于 2012-9-5 14:46:56 | 显示全部楼层
mxl12315 发表于 2012-9-5 14:42
是啊,哎~我还不用任何遍历,就一辆车,一个地形,一个路径文件,一个handle事件。。怎么出这个异常?跟肖 ...

把你的代码发附件

该用户从未签到

发表于 2012-9-5 15:11:32 | 显示全部楼层
mxl12315 发表于 2012-9-5 14:56

估计还是节点有效性的问题,您在仔细的跟踪一下,查一下堆栈

该用户从未签到

 楼主| 发表于 2012-9-5 15:17:22 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 15:11
估计还是节点有效性的问题,您在仔细的跟踪一下,查一下堆栈

好的~一会还会叨扰您的哈~

该用户从未签到

 楼主| 发表于 2012-9-5 16:38:51 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 15:11
估计还是节点有效性的问题,您在仔细的跟踪一下,查一下堆栈

成功了~跟您说的一样,animationpathcallback那里的有效性出现异常。。呵呵,还需请教您一下,如何在动画中实时获取小车的位置呢?我只看到获取并控制动画时间,但是我需要得到运动中小车的位置。。。。 (PS:动画是导入的)

该用户从未签到

发表于 2012-9-5 16:47:33 | 显示全部楼层
一种方法是addUpdateCallback 给这个Node,然后在callback中直接getMatrix,其实就是getMatrix.getTrans

该用户从未签到

 楼主| 发表于 2012-9-5 17:18:09 | 显示全部楼层
liuzhiyu123 发表于 2012-9-5 16:47
一种方法是addUpdateCallback 给这个Node,然后在callback中直接getMatrix,其实就是getMatrix.getTrans

getMatrix()是一个bool型的方法,和我想的不同 我想获得每一帧的位置(osg::vec3),完后与参照点的位置求模长,完后根据这个膜的长度进行判定。。。您看如何利用这个bool的方法?
  如果我用path->insert(0.0,osg::animatinpath::controlpoint())ne ?能否使用?

该用户从未签到

发表于 2012-9-6 07:50:24 | 显示全部楼层
mxl12315 发表于 2012-9-5 17:18
getMatrix()是一个bool型的方法,和我想的不同 我想获得每一帧的位置(osg::vec3),完后与参照点的 ...

我说的是MatrixTransform的getMatrix 不是动画路径的,另外获得所有的关键帧也是可以的

该用户从未签到

 楼主| 发表于 2012-9-6 10:21:14 | 显示全部楼层
mxl12315 发表于 2012-9-6 09:54
按照您的指导,我大概写了个例子,您看看我写的代码,没有异常了,但是键盘事件按下时无反应,小车还在跑 ...

我找到原因了,我写的动画回调和节点回调彼此没关联上,结果遍历小车运动时的位置永远是一串0.。。您看我如何修改才能关联这两个呢?

该用户从未签到

 楼主| 发表于 2012-9-7 08:56:28 | 显示全部楼层
没人能解答吗?看来石沉大海了~

该用户从未签到

发表于 2012-9-7 09:46:08 | 显示全部楼层
可能需要Local to World  不确定您的层级关系

该用户从未签到

 楼主| 发表于 2012-9-7 09:54:26 | 显示全部楼层
liuzhiyu123 发表于 2012-9-7 09:46
可能需要Local to World  不确定您的层级关系

啊,您说的是_localtoWorld吗?这个语句怎么写才能加载到osg::Matrix呢?

该用户从未签到

发表于 2012-9-7 10:02:19 | 显示全部楼层
mxl12315 发表于 2012-9-7 09:54
啊,您说的是_localtoWorld吗?这个语句怎么写才能加载到osg::Matrix呢?

当然是您获得的MatrixTransform 转换到world

该用户从未签到

 楼主| 发表于 2012-9-7 10:22:46 | 显示全部楼层
liuzhiyu123 发表于 2012-9-7 10:02
当然是您获得的MatrixTransform 转换到world

让您见笑了,节点回调这里刚开始学习,老是出现些幼稚的错误,还望您继续指点下哈~
我写了个节点回调,但报错,估计是指针问题,但不知如何修改。。。

class SpaceShipCallback :public osg::NodeCallback
{
public:
        SpaceShipCallback(osg::Node* node)
        {
                //
        }

        virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
        {

                osg::ref_ptr <osg::MatrixTransform> matrix =dynamic_cast<osg::MatrixTransform*>(node);
                osg::Matrix m1;
                matrix->setMatrix(m1);
                osg::MatrixTransform::computeLocalToWorldMatrix(matrix,nv);
                //matrix.getMatrix().getTrans();
                traverse( node, nv );
        }
};

1.bmp

该用户从未签到

发表于 2012-9-7 11:13:46 | 显示全部楼层
额。。。。完全不是这个样子
osg::computeLocalToWorldMatrix就可以了 需要获得NodePath

该用户从未签到

发表于 2012-9-7 12:37:21 | 显示全部楼层
                osg::ref_ptr <osg::MatrixTransform> matrix =dynamic_cast<osg::MatrixTransform*>(node);
                osg::Matrix m1;
                matrix->setMatrix(m1);
                matrix->computeLocalToWorldMatrix(m1,nv);
                //matrix.getMatrix().getTrans();
                traverse( node, nv );


您又从新设定值了,当然是000了

该用户从未签到

 楼主| 发表于 2012-9-7 13:06:26 | 显示全部楼层
liuzhiyu123 发表于 2012-9-7 12:37
osg::ref_ptr  matrix =dynamic_cast(node);
                osg::Matrix m1;
         ...

              啊!果然,那我要是把“   osg::Matrix m1;”提到全局变量处,比如放在程序开始;
         内部代码改成:
          osg::ref_ptr <osg::MatrixTransform> matrix =dynamic_cast<osg::MatrixTransform*>(node);
                 matrix->computeLocalToWorldMatrix(m1,nv);
                 traverse( node, nv );
             我看程序还是没取到小车的位置,您看我是不是缺少类似“matrix.getMatrix().getTrans()”的语句?还是缺少什么其他重要的??小弟我总能明白意思和代码结构,但总会出现上下无法关联的现象,程序环节脱钩。。哎

该用户从未签到

发表于 2012-9-7 13:18:09 | 显示全部楼层
额....
osg::Matrix localToWorld = osg::computeLocalToWorld(matrix->getParent(0)->getParentalNodePaths()[0] );

这个又这么难么?

该用户从未签到

 楼主| 发表于 2012-9-7 13:56:51 | 显示全部楼层
liuzhiyu123 发表于 2012-9-7 13:18
额....
osg::Matrix localToWorld = osg::computeLocalToWorld(matrix->getParent(0)->getParentalNodePat ...

我也这么纳闷呢~哎,改了,但还是一串0.。我前后结构蛮清晰的啊,也没有什么堆栈溢出或是其他异常,怎么总获得位置为0.。。

该用户从未签到

发表于 2013-3-16 17:00:40 | 显示全部楼层
mxl12315 发表于 2012-9-5 16:38
成功了~跟您说的一样,animationpathcallback那里的有效性出现异常。。呵呵,还需请教您一下,如何在动画 ...

我的也是animationPathCallback的有效性异常,请问你是怎么改的?谢谢了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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