查看: 3525|回复: 15

《OSG程序设计教程》第五章 例子13编译不通过

[复制链接]

该用户从未签到

发表于 2012-10-7 00:17:36 | 显示全部楼层 |阅读模式
本帖最后由 xiacanni 于 2012-10-7 00:24 编辑

我刚开始通过《OSG程序设计教程》学习osg。
《OSG程序设计教程》第五章 例子13,编译不通过,是一个交互的pick例子。(之前的例子都是能通过的。)

这个例子是这样的:(和源代码略有区别,把一个【i】改成了【i  】,要不然系统会识别这个【i】把后面的字都变成斜体.......)
//by FreeSouth 2008 6 16
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Group>
#include <osgFX/Scribe>
#include <osgGA/GUIEventHandler>
#include <osgUtil/LineSegmentIntersector>

class CPickHandler : public osgGA::GUIEventHandler
{
public:
        CPickHandler(osgViewer::Viewer* viewer):mViewer(viewer){}
        virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
        {
                switch(ea.getEventType())
                {
                case(osgGA::GUIEventAdapter::PUSH):
                        if (ea.getButton()==1)
                        {
                                Pick(ea.getX(), ea.getY());
                        }
                        return true;
                }
                return false;

        }

protected:
        void Pick(float x, float y)
        {
                osgUtil::LineSegmentIntersector::Intersections intersections;
                if (mViewer->computeIntersections(x, y, intersections))
                {
                        for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
                                hitr != intersections.end();
                                ++hitr)
                        {

                                if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))
                                {

                                        osg::NodePath& np = hitr ->nodePath ;

                                        for (int i=np.size()-1; i>=0; --i)
                                        {
                                                osgFX::Scribe* sc= dynamic_cast<osgFX::Scribe *>(np[i  ]);
                                                if (sc!= NULL)
                                                {
                                                        if(sc ->getNodeMask() != 0)
                                                        sc ->setNodeMask(0) ;
                                                }
                                               
                                        }
                                }
                        }
                }

        }
        osgViewer::Viewer* mViewer ;
};

int main(int, char**)
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group();
        root ->addChild(osgDB::readNodeFile("cessna.osg"));
        osg::ref_ptr<osg::Node> cow  = osgDB::readNodeFile("cow.osg") ;

        osg::ref_ptr<osgFX::Scribe> sc = new osgFX::Scribe() ;
        sc ->addChild(cow.get()) ;

        root->addChild(cow.get ());
        root->addChild(sc.get ()) ;

        viewer.setSceneData(root.get ());
        viewer.addEventHandler(new CPickHandler(&viewer)) ;
        viewer.realize();
        viewer.run();
        return 0;
}



如果照这个代码直接编译,会说这一句  
osg::NodePath& np = hitr ->nodePath ;
无法从“const osg::NodePath”转换为“osg::NodePath &”
我就去掉了&,改成了osg::NodePath np = hitr ->nodePath ;

如果这样编译的话,会有14个 error LNK2001,这里列举其中4个
y_main.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall osgFX::Scribe::Scribe(void)" (__imp_??0Scribe@osgFX@@QAE@XZ)
1>my_main.obj : error LNK2001: 无法解析的外部符号 "public: virtual class osg::Object * __thiscall osgFX::Scribe::cloneType(void)const " (?cloneType@Scribe@osgFX@@UBEPAVObject@osg@@XZ)
1>my_main.obj : error LNK2001: 无法解析的外部符号 "public: virtual class osg::Object * __thiscall osgFX::Scribe::clone(class osg::CopyOp const &)const " (?clone@Scribe@osgFX@@UBEPAVObject@osg@@ABVCopyOp@4@@Z)
1>my_main.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall osgFX::Scribe::isSameKindAs(class osg::Object const *)const " (?isSameKindAs@Scribe@osgFX@@UBE_NPBVObject@osg@@@Z)


请问大家是怎么回事?
是因为我osg没配置好?虽然之前的例子没问题,但是之前的例子没有用到过 <osgFX/Scribe>,<osgUtil/LineSegmentIntersector>这两个头文件,因为用了这两个头文件而dll、lib什么的不对所以会通不过?(我的系统是win7 64,按照论坛里http://bbs.osgchina.org/forum.ph ... &extra=page%3D1配置的 32位osg
还是因为osg::NodePath& np = hitr ->nodePath ;这一句不应该改?

该用户从未签到

发表于 2012-10-7 00:31:05 | 显示全部楼层
没有包含osgFX.lib

该用户从未签到

 楼主| 发表于 2012-10-7 09:33:21 | 显示全部楼层
本帖最后由 xiacanni 于 2012-10-7 09:39 编辑
Hehykissool 发表于 2012-10-7 00:31
没有包含osgFX.lib


先谢过了

osg::NodePath& np = hitr ->nodePath ;
这个的&要删掉吗?

加上osgFX.lib,并且删掉&,可以编译通过,但是显示不出来,程序会停止工作...
(调试了一下,好像是主函数到这一句sc ->addChild(cow.get()) ;有问题)

该用户从未签到

 楼主| 发表于 2012-10-7 09:45:16 | 显示全部楼层
本帖最后由 xiacanni 于 2012-10-7 09:48 编辑
Hehykissool 发表于 2012-10-7 00:31
没有包含osgFX.lib


哈哈,这次成功了,把osgFX.lib 改成了osgFXd.lib就行了。(因为看到lib文件夹有这两个,本身教程里让添加的lib也有很多带d的)

但是为什么啊,osgFX.lib 和 osgFXd.lib有什么区别啊?

(顺便问一下.osg和.osgt有什么区别啊)

该用户从未签到

发表于 2012-10-7 12:16:22 | 显示全部楼层
osgFX.lib 用于编译 release版本,--d.lib用于编译debug版本,vs默认编译debug版本

该用户从未签到

发表于 2012-10-7 12:23:08 | 显示全部楼层
xiacanni 发表于 2012-10-7 09:45
哈哈,这次成功了,把osgFX.lib 改成了osgFXd.lib就行了。(因为看到lib文件夹有这两个,本身教程里让添 ...

osgt应该是自定义的格式,本质应该跟osg一样

该用户从未签到

发表于 2012-10-7 12:43:58 | 显示全部楼层
osgt 可不是自定义的格式

该用户从未签到

 楼主| 发表于 2012-10-7 20:07:15 | 显示全部楼层
StackSnow 发表于 2012-10-7 12:43
osgt 可不是自定义的格式

osgt和osg什么区别啊,求指教

该用户从未签到

 楼主| 发表于 2012-10-7 20:10:36 | 显示全部楼层
Hehykissool 发表于 2012-10-7 12:16
osgFX.lib 用于编译 release版本,--d.lib用于编译debug版本,vs默认编译debug版本

谢过了!

该用户从未签到

发表于 2012-10-7 20:41:16 | 显示全部楼层
xiacanni 发表于 2012-10-7 20:07
osgt和osg什么区别啊,求指教

只能说都是ASCII格式的封装,但具体有什么差别咱实在是看不懂,抱歉了

该用户从未签到

发表于 2012-10-8 08:08:17 | 显示全部楼层

该用户从未签到

 楼主| 发表于 2012-10-8 15:26:25 | 显示全部楼层
Hehykissool 发表于 2012-10-7 20:41
只能说都是ASCII格式的封装,但具体有什么差别咱实在是看不懂,抱歉了

你已经很热心了!

该用户从未签到

 楼主| 发表于 2012-10-8 15:26:37 | 显示全部楼层
liuzhiyu123 发表于 2012-10-8 08:08

版主晓得吗?

该用户从未签到

发表于 2012-10-9 15:02:24 | 显示全部楼层
osgt,osgb是我设计的第二代OSG本地格式,支持序列化,可以随意扩展内容和格式

该用户从未签到

 楼主| 发表于 2012-10-10 10:45:27 | 显示全部楼层
array 发表于 2012-10-9 15:02
osgt,osgb是我设计的第二代OSG本地格式,支持序列化,可以随意扩展内容和格式

thank you

该用户从未签到

发表于 2017-8-15 18:09:22 | 显示全部楼层
array 发表于 2012-10-9 15:02
osgt,osgb是我设计的第二代OSG本地格式,支持序列化,可以随意扩展内容和格式

对于同样的一幅场景图像,生成osg、osgt以及osgb文件,请问三者在内容上有差别吗?还是仅仅在格式上不一样?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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