查看: 2416|回复: 2

请问qt和osg结合,为什么编译时候,如果加入粒子系统的头文件就报错

[复制链接]

该用户从未签到

发表于 2009-2-18 20:49:23 | 显示全部楼层 |阅读模式
我在linux下对osg2.6.0的例子进行使用
int mainQOSGWidget(QApplication& a, osg::ArgumentParser& arguments)
{

        osg::ref_ptr<ViewerQOSG> viewerWindow(new ViewerQOSG);
        viewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
       
        arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates use of particle systems.");
        arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] image_file_left_eye image_file_right_eye");
        arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
   

        // construct the viewer.
        // osgViewer::Viewer viewer(arguments);//delete by alex
       
        // if user request help write it out to cout.
        unsigned int testCase = 0;
        while (arguments.read("-t", testCase)) {}
       
        bool useOverlay = false;
        osgSim::OverlayNode::OverlayTechnique technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY;
        while (arguments.read("--object")) { useOverlay = true; technique = osgSim::OverlayNode::OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY; }
        while (arguments.read("--ortho") || arguments.read("--orthographic")) { useOverlay = true; technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY; }
        while (arguments.read("--persp") || arguments.read("--perspective")) { useOverlay = true; technique = osgSim::OverlayNode::VIEW_DEPENDENT_WITH_PERSPECTIVE_OVERLAY;
                while (arguments.read("--moveradar")){moverdr_flag = TRUE;} }
       
       
        // if user request help write it out to cout.
        if (arguments.read("-h") || arguments.read("--help"))
        {
                arguments.getApplicationUsage()->write(std::cout);
                return 1;
        }
       
        // any option left unread are converted into errors to write out later.
        arguments.reportRemainingOptionsAsUnrecognized();
       
        // report any errors if they have occurred when parsing the program arguments.
        if (arguments.errors())
        {
                arguments.writeErrorMessages(std::cout);
                return 1;
        }
       
        osg::Group *root = new osg::Group;
        build_world(root, testCase, useOverlay, technique);
       
        //viewerWindow->setSceneData(loadedModel.get());
        viewerWindow->setSceneData(root);
        viewerWindow->show();
       
        setupManipulatorAndHandler(*viewerWindow.get(), arguments);
               
        a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
       
        return a.exec();
}

如果包含//
//#include <osgParticle/ExplosionEffect>

//#include <osgParticle/SmokeEffect>
//#include <osgParticle/FireEffect>
#include <osgParticle/ParticleSystemUpdater
前三个头文件的话,编译时候就报错
/usr/include/osgParticle/Emitter:66: 错误:expected unqualified-id before ‘double’
/usr/include/osgParticle/Emitter:66: 错误:expected `)' before ‘double’
/usr/include/osgParticle/ModularEmitter:89: 错误:expected unqualified-id before ‘double’
/usr/include/osgParticle/ModularEmitter:89: 错误:expected `)' before ‘double’

我查过
namespace osgParticle
{

    /**    An abstract base class for particle emitters.
        Descendant classes must override the <CODE>emit()</CODE> method to generate new particles by
        calling the <CODE>ParticleSystem::createParticle()</CODE> method on the particle system associated
        to the emitter.
    */
    class OSGPARTICLE_EXPORT Emitter: public ParticleProcessor {
    public:
        Emitter();
        Emitter(const Emitter& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);

        virtual const char* libraryName() const { return "osgParticle"; }
        virtual const char* className() const { return "Emitter"; }
        virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const Emitter*>(obj) != 0; }
        virtual void accept(osg::NodeVisitor& nv) { if (nv.validNodeMask(*this)) { nv.pushOntoNodePath(this); nv.apply(*this); nv.popFromNodePath(); } }
        
        /// Get the particle template.
        inline const Particle& getParticleTemplate() const;
        
        /// Set the particle template (particle is copied).
        inline void setParticleTemplate(const Particle& p);
        
        /// Return whether the particle system's default template should be used.
        inline bool getUseDefaultTemplate() const;
        
        /** Set whether the default particle template should be used.
            When this flag is true, the particle template is ignored, and the
            particle system's default template is used instead.
        */
        inline void setUseDefaultTemplate(bool v);

    protected:
        virtual ~Emitter() {}
        Emitter& operator=(const Emitter&) { return *this; }
        
        inline void process(double dt);
        
        virtual void emit(double dt) = 0;//error   这行有错误
        
        bool _usedeftemp;
        Particle _ptemp;
    };


osg的头文件也会报错?请教了

该用户从未签到

发表于 2009-2-18 22:00:25 | 显示全部楼层
有点意思,似乎是因为Qt把emit这个关键字给占用了,用于SIGNAL信号的发送。解决方案不是没有,只要与osgParticle有关的类和头文件能完全和Qt的头文件包含脱离就可以了,应当说是Qt做得不好,把这个宏给定死了
没有结合Qt的话估计不会有这个问题。不过不知道OSG会不会为了这么一点小事改emit这个函数的名称。

该用户从未签到

 楼主| 发表于 2009-2-18 23:23:15 | 显示全部楼层
我了解了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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