查看: 1116|回复: 9

osg新手求帮助

[复制链接]

该用户从未签到

发表于 2013-12-27 16:14:59 | 显示全部楼层 |阅读模式
最近在看OpenSceneGraph程序设计这本书,然后里面有一个添加模型的例子运行总是出问题,请高手解答一下,十分感谢!
#include "stdafx.h"
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Node>

void main()
{
        osgViewer::Viewer viewer;
        osg::Group *root=new osg::Group();
        osg::Node *glider=osgDB::readNodeFile("glider.osg");
        glider->asGroup()->addChild(osgDB::readNodeFile("robot.osg")); //运行时这一句就出问题了
        root->addChild(glider);
        root->addChild(osgDB::readNodeFile("osgcool.osgt"));
        viewer.setSceneData(root);
        viewer.realize();
        viewer.run();
}

捕获.PNG

该用户从未签到

发表于 2013-12-27 17:05:09 | 显示全部楼层
1.
glider->asGroup()成立吗?
估计就不是GROUP 节点,那怎么能加子节点呢?
root是GROUP 节点
可以直接加到root下

该用户从未签到

 楼主| 发表于 2013-12-27 20:16:53 | 显示全部楼层
VR_user_happy 发表于 2013-12-27 17:05
1.
glider->asGroup()成立吗?
估计就不是GROUP 节点,那怎么能加子节点呢?

我也不是很懂,但是书上是这么写的:
如果想要添加别的模型,还可以 root ->addChild,但是,如果想在飞机(glider.osg)上面添加一些什么,就需要把飞机当成组结点,然后再在飞机结点上添加一些东西。就可以这样:
1.PNG

该用户从未签到

发表于 2013-12-27 20:48:06 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-12-27 20:53 编辑
小飞侠水 发表于 2013-12-27 20:16
我也不是很懂,但是书上是这么写的:
如果想要添加别的模型,还可以 root ->addChild,但是,如果想在飞 ...


首先设置断点,看你执行这行的几处指针是否正确调用
1. gilder是否存在(不存在,说明你的这个模型就没有正确读出,查看路径是否正确(估计你没有配置OSG数据(DATA什么的)的路径,网上搜一下,或是在论坛搜一下))
if(gilder)
    osg::Group * pGroup=gilder->asGroup();
2.    是否gilder->asGroup()是否为返回为真
if(pGroup)
     pGroup->addChild(...);
不返回为真,你就不能作指针调用了,这里就是指针的非法运用出的错!

或是吧鼠标放到gilder上看其下是否出现又红色的警示,如果有红色警示,就说明该指针的内存不是正确的数据

该用户从未签到

 楼主| 发表于 2013-12-28 10:47:24 | 显示全部楼层
VR_user_happy 发表于 2013-12-27 20:48
首先设置断点,看你执行这行的几处指针是否正确调用
1. gilder是否存在(不存在,说明你的这个模型就没 ...

试了一下你说的方法,第一个if(glider)可以通过,然后第二个if(pGroup)就跳过去了。还是想不通为什么不能用,指向Node的指针有asGroup的方法呀!后面还有一个例子中也有一个asGroup的用法是:viewer->getSceneData()->asGroup()->getChild(0)->setNodeMask(0);就是隐藏了Group中的一个节点模型。其中 osg::Node  *osgViewer::Viewer::getSceneData()。

该用户从未签到

发表于 2013-12-28 13:39:56 | 显示全部楼层
if(pGroup)就跳过去了
说明这个节点本身就不是GROUP节点
你可以给他的父节点添加一个GROUP节点就可以了
osg::Group *pGroup=new osg::Group;
pGroup->addChild(gilder);
你把这个GRUOP 节点当成gilder节点就可以了
如:
root->addChild(gilder);
换成
root->addChild(pGroup);


该用户从未签到

 楼主| 发表于 2013-12-28 15:04:53 | 显示全部楼层
VR_user_happy 发表于 2013-12-28 13:39
if(pGroup)就跳过去了
说明这个节点本身就不是GROUP节点
你可以给他的父节点添加一个GROUP节点就可以了

呵呵,刚才试了一下你说的方法,可以运行的,但是感觉和使用三次root->addChild()的效果是一样的。运行的效果也是一样,没有感觉到在组节点上面又添加节点的效果。具体我也不是很懂,但是书上说如果是用root->addChild那么每次添加的模型都叠加在屏幕的中间,以某个节点为基础在上面再添加节点我也不知道是会是一个什么效果。

该用户从未签到

发表于 2013-12-28 18:00:22 | 显示全部楼层
现在没有,以后你就知道有什么区别了!
比如你要让节点运动,放大,旋转,你再看看有什么区别!

该用户从未签到

 楼主| 发表于 2013-12-29 16:58:20 | 显示全部楼层
VR_user_happy 发表于 2013-12-28 18:00
现在没有,以后你就知道有什么区别了!
比如你要让节点运动,放大,旋转,你再看看有什么区别!

好的,非常感谢你的帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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