查看: 1391|回复: 4

求助:动画控制无反应

[复制链接]

该用户从未签到

发表于 2011-1-27 10:55:55 | 显示全部楼层 |阅读模式
是三维引擎编程指南这本书,第十章路径控制动画,程序可以调试成功,没有报错,但是键盘无法控制。比如我设定按r建动画暂停,但是实际上按下去没有反应。而程序有没有错,求高手解答是哪方面原因。

该用户从未签到

发表于 2011-1-27 14:55:15 | 显示全部楼层
非常不解您是如何控制的,我记得r我设置的是重新开始~~~~


  1.                   case(osgGA::GUIEventAdapter::KEYDOWN):
  2.                           {
  3.                                   if (ea.getKey()=='p')
  4.                                   {
  5.                                           //暂停
  6.                                           animationPathCallback->setPause(true) ;

  7.                                           return true;
  8.                                   }

  9.                                   if(ea.getKey()=='s')
  10.                                   {
  11.                                           //开始
  12.                                           animationPathCallback->setPause(false) ;

  13.                                           return true ;
  14.                                   }

  15.                                   if(ea.getKey()=='r')
  16.                                   {
  17.                                           //重新开始
  18.                                           animationPathCallback->reset() ;

  19.                                           return true ;
  20.                                   }

  21.                                   break;
  22.                           }

复制代码

该用户从未签到

发表于 2011-1-27 14:59:24 | 显示全部楼层
如果您已购买本书,请您仔细对照书中的代码及讲解~~~

该用户从未签到

 楼主| 发表于 2011-2-28 14:52:50 | 显示全部楼层
是这个程序
/**********************************************************
*Write by FlySky
*zzuxp@163.com  http://www.OsgChina.org   
**********************************************************/

#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Group>
#include <osg/Camera>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Sequence>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>

#include <iostream>

//对节点进行适当的缩放
osg::ref_ptr<osg::Node> createScaledNode(osg::ref_ptr<osg::Node> node, float targetScale)
{
        //通过包围盒确定合适的缩放
        const osg::BoundingSphere& bsphere = node->getBound();
        float scale = targetScale / bsphere._radius;

        osg::ref_ptr<osg:ositionAttitudeTransform> pat = new osg::PositionAttitudeTransform() ;
        pat->setPosition(osg::Vec3(0.0f,0.0f,0.0f));
        pat->setScale(osg::Vec3(scale,scale,scale)) ;
        pat->setDataVariance(osg::Object:YNAMIC);
        pat->addChild(node.get());

        //法线归一化,保证光照明暗均匀
        osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet() ;
        stateset=pat->getOrCreateStateSet() ;
        stateset->setMode(GL_NORMALIZE,osg::StateAttribute::ON);

        return pat.get() ;
}

//创建帧动画
osg::ref_ptr<osg::Sequence> createSequence()
{
        //创建帧动画对象
        osg::ref_ptr<osg::Sequence> seq = new osg::Sequence;

        //文件名向量对象
        typedef std::vector<std::string> Filenames;
        Filenames filenames;

        //添加模型名
        filenames.push_back("cow.osg");
        filenames.push_back("spaceship.osg");
        filenames.push_back("dumptruck.osg");
        filenames.push_back("cessna.osg");
        filenames.push_back("glider.osg");

        for(Filenames::iterator itr = filenames.begin();itr != filenames.end();++itr)        
        {
                //加载模型
                osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(*itr);

                if (node)
                {
                        //添加子节点
                        seq->addChild(createScaledNode(node, 100.0f));
                        //设定节点的持续时间
                        seq->setTime(seq->getNumChildren()-1, 1.0f);
                }
        }

        //设置帧动画持续的时间
        seq->setInterval(osg::Sequence:OOP, 0,-1);

        //设置播放的速度及重复的次数
        seq->setDuration(1.0f, -1);

        //开始播放
        seq->setMode(osg::Sequence::START);

        return seq.get();
}

//帧动画事件控制
class SequenceEventHandler : public osgGA::GUIEventHandler
{

public:
        //构造函数
        SequenceEventHandler(osg::ref_ptr<osg::Sequence> seq)
        {
                _seq = seq;
        }

        virtual bool handle(const osgGA::GUIEventAdapter& ea,
                osgGA::GUIActionAdapter&)
        {
                osg::Sequence::SequenceMode mode = _seq->getMode();

                if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN)
                {
                        switch (ea.getKey())
                        {
                                //暂停
                        case 'p':
                                {
                                        mode = osg::Sequence::PAUSE ;

                                        _seq->setMode(mode);
                                }
                                break;
                                //开始
                        case 's':
                                {
                                        mode = osg::Sequence::START ;

                                        _seq->setMode(mode) ;
                                }
                                break ;
                                //继续
                        case 'r':
                                {
                                        mode = osg::Sequence::RESUME ;

                                        _seq->setMode(mode);
                                }
                                break ;
                                //停止
                        case 't':
                                {
                                        mode = osg::Sequence::STOP ;

                                        _seq->setMode(mode) ;
                                }
                                break ;
                        default:
                                break ;
                        }

                }
                return false;
        }

private:

        osg::ref_ptr<osg::Sequence> _seq;
};

int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

        osg::ref_ptr<osg::Group> root = new osg::Group();

        //向场景中添加帧动画
        osg::ref_ptr<osg::Sequence> sq = new osg::Sequence();
        sq = createSequence();

        root->addChild(sq.get()) ;

        //添加帧动画控制事件
        viewer->addEventHandler(new SequenceEventHandler(sq.get()));

        osgUtil::Optimizer optimizer ;
        optimizer.optimize(root.get()) ;

        viewer->setSceneData(root.get());

        viewer->realize();

        viewer->run();

        return 0 ;
}

该用户从未签到

发表于 2011-2-28 15:04:54 | 显示全部楼层
看不出这个程序有什么问题~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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