查看: 1317|回复: 7

很不解的问题-dos启动场景结构就不对了

[复制链接]

该用户从未签到

发表于 2010-10-29 09:57:03 | 显示全部楼层 |阅读模式
  1. osg::ref_ptr<osg::MatrixTransform> trans=new osg::MatrixTransform;

  2. osg::Group* root = new osg::Group();

  3. //读取地形模型
  4. osg::Node* node = new osg::Node();
  5. node = osgDB::readNodeFile("port.ive");
  6. osg::Node* follownode=new osg::Node();
  7. follownode=osgDB::readNodeFile("ship.ive");
  8. trans->addChild(follownode);

  9. //添加到场景
  10. root->addChild(node);
  11. root->addChild(trans);

  12. //优化场景数据
  13. osgUtil::Optimizer optimizer ;
  14. optimizer.optimize(root) ;

  15. viewer->setSceneData(root);
  16. UseEventHandler *ev=new UseEventHandler(trans);
  17. TM->transMatrix=ev;//TM为视点矩阵,获取模型运动矩阵以便同步
  18. viewer->addEventHandler(ev);
  19. viewer->realize();

  20. viewer->run();

  21. return 0 ;
复制代码
这么直接组织场景结构键盘相应trans没问题,可是在另一个程序里:
  1. osg::ref_ptr<osg::Group> root = new osg::Group;
  2. osg::ref_ptr<osg::Node> port=new osg::Node;
  3. if(arguments.read("-p"),port)
  4. port=osgDB::readNodeFiles(arguments);

  5. osg::ref_ptr<osg::Node> ship=NULL;
  6. if(arguments.read("-sp"),ship)
  7. ship=osgDB::readNodeFiles(arguments);
  8. //while(arguments.read("-ship"),ship);这么写很多编译器不能编译。改为上面写法


  9. osg::ref_ptr<osg::MatrixTransform> trans=new osg::MatrixTransform;

  10. trans->addChild(ship.get());//场景组织一下
  11. root->addChild(port.get());
  12. root->addChild(trans);
  13. viewer->setSceneData(root.get());

  14. viewer->realize();
  15. UseEventHandler* ev = new UseEventHandler(transMTF);
  16. TM->transMatrix = ev;//TM为视点矩阵,获取模型运动矩阵以便同步
  17. viewer->addEventHandler(ev);


  18. // read up the osgcluster specific arguments.
  19. ViewerMode viewerMode = STAND_ALONE;
  20. while (arguments.read("-m")) viewerMode = MASTER;
  21. while (arguments.read("-s")) viewerMode = SLAVE;
复制代码
这么组织场景的时候,ship模型就不响应了,只有视点能动,trans下挂着ship呀,可是就是不响应,我觉得是场景结构出问题了,请问什么原因?

该用户从未签到

发表于 2010-10-29 17:06:56 | 显示全部楼层
if(arguments.read("-sp"),ship)
ship=osgDB::readNodeFiles(arguments);
再重新问一句,您这么写是什么意思?我记得之前您问过这个问题,并且我误以为您已经理解我给出的代码了。
既然这样的话,这次我就尝试不给出代码,您来尝试分析一下自己语句的错误如何?我敢肯定是这一句没写对

该用户从未签到

 楼主| 发表于 2010-10-30 09:52:31 | 显示全部楼层
2# array
的确问过这个问题。而且模型也能加载进来。
我的理解是在dos窗口里,遇到-sp命令后,-sp的内容就赋给ship节点。如:-sp ship.ive 这样ship.ive就赋给了ship节点。

该用户从未签到

发表于 2010-11-1 08:32:49 | 显示全部楼层
但是您的代码,也就是我指出的部分,它并不能做这样的事情,甚至它不符合通常的C++语法

该用户从未签到

 楼主| 发表于 2010-11-1 11:33:38 | 显示全部楼层
4# array
悲剧了,真不知道问题出在哪里了,还请老大指明!

该用户从未签到

发表于 2010-11-1 14:42:46 | 显示全部楼层
if(  arguments.read("-sp"),  ship  )
这一句中您使用逗号操作符是作什么用?

此外您认为ArgumentParser能够往您的ship节点类型中传递什么信息?它能处理的只是字符串以及字符串转换到数字之类而已

该用户从未签到

 楼主| 发表于 2010-11-3 10:55:47 | 显示全部楼层
6# array
o o 不好意思array,看错了您以前的代码,但是这么写之后就又出现新问题了:
  1. osg::ref_ptr<osg::Group> root = new osg::Group;
  2. osg::ref_ptr<osg::Node> port=new osg::Node;
  3. std::string portfile;
  4. if(arguments.read("-p",portfile))
  5. port=osgDB::readNodeFile(portfile);

  6. osg::ref_ptr<osg::Node> ship=new osg::Node;
  7. std::string shipfile;
  8. if(arguments.read("-sp",shipfile))
  9. ship=osgDB::readNodeFile(shipfile);
  10. osg::ref_ptr<osg::MatrixTransform> transMTF=new osg::MatrixTransform;

  11. transMTF->addChild(ship.get());//场景组织一下
  12. root->addChild(port.get());
  13. root->addChild(transMTF);
复制代码

命令改为:-m -sp ship.ive port.ive之后只能显示ship,
命令改为:-m -sp ship.ive -p port.ive之后就什么也不执行了,进程也是一闪而过。很是奇怪为什么,读源码也不明白为什么

该用户从未签到

发表于 2010-11-3 12:48:28 | 显示全部楼层
您的代码在我这里运行正常:
test -p cow.osg -sp cessna.osg

可以看到两个模型同时出现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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