查看: 1967|回复: 11

NODE转变为GROUP时的问题

[复制链接]

该用户从未签到

发表于 2010-7-8 16:08:29 | 显示全部楼层 |阅读模式
void main()
{
osgViewer::Viewer viewer;
osg::Node *glider =osgDB::readNodeFile("glider.osg") ;
osg::Group* root = new osg::Group() ;
glider ->asGroup() ->addChild(osgDB::readNodeFile("osgcool.osg")) ;
root ->addChild(glider) ;
root ->addChild(osgDB::readNodeFile("osgcool.osg"));
viewer.setSceneData(root);
viewer.realize();
viewer.run();
}

在运行到:glider ->asGroup() ->addChild(osgDB::readNodeFile("osgcool.osg")) ;时崩溃,输出信息0x004140c7 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
这是为什么

该用户从未签到

发表于 2010-7-8 16:19:30 | 显示全部楼层
您需要判断glider->asGroup()能够得到结果。只有glider本身是Group类型的前提下,这个转换才能得到数据,否则为空。事实上glider的根节点不是Group,而是Geode

该用户从未签到

 楼主| 发表于 2010-7-9 09:18:51 | 显示全部楼层
2# array

感谢您的解答,但有个问题,如果glider已经是Group,那么就不用asGroup进行转换了吧,正因为不是Group,所以才进行转换的。另外asGroup难道不是把非group转换为group吗?我是初学,如果有错误的地方请见谅哈,这段代码是我从《OSG程序设计教程》里得到的,难道教程里有错误?

该用户从未签到

发表于 2010-7-9 10:20:26 | 显示全部楼层
估计教程太老了

该用户从未签到

发表于 2010-7-9 11:07:04 | 显示全部楼层
如果glider已经是Group,那么就不用asGroup进行转换了吧
恰恰是这个时候用asGroup转换,这其实是C++的类继承特性决定的

Group和Geode等都是继承自Node类的,因此您完全可以用Node* node = new Group来表达一个Group节点。此时node变量虽然是Node类型,但是它本质上却是使用Group的方法和属性表的。

此时可以用dynamic_cast甚至强制转换把node变量转成Group类型,即:
Group* group = dynamic_cast<Group*>(node);

但是dynamic_cast的效率上有损耗(大约是强制转换的100倍左右),而强制转换是不安全的,因此OSG提供了直接的转换函数asGroup,把这些本质上是Group的节点转成Group类型。

从Geode转到Group的转换是不可能的,因为继承关系上根本就不符合。从原理上也不存在两者之间转换的道理。

该用户从未签到

发表于 2010-7-9 13:04:53 | 显示全部楼层
学习下

该用户从未签到

 楼主| 发表于 2010-7-12 09:49:07 | 显示全部楼层
您需要判断glider->asGroup()能够得到结果。只有glider本身是Group类型的前提下,这个转换才能得到数据,否则为空。事实上glider的根节点不是Group,而是Geode
array 发表于 2010-7-8 16:19


osg::Node *glider =osgDB::readNodeFile("glider.osg") ;这个语句是将glider定义为Node类型,但看您写的似乎glider是Geode是类型,但代码里没有进行类型转换的语句,有点不明白。

该用户从未签到

发表于 2010-7-12 10:43:31 | 显示全部楼层
本帖最后由 gaoqian506 于 2010-7-12 10:45 编辑

7# ivanland


Geode 是从 Node 继承的, 也就是说 Node 是Geode 的基类, 所以 从 Geode 到 Node 的转换可以自动完成, 反之则需要转换语句。

该用户从未签到

发表于 2010-7-12 23:51:12 | 显示全部楼层
看了上面诸位的讨论有点晕了,到底asGroup是用在什么场合???

该用户从未签到

 楼主| 发表于 2010-7-13 10:06:06 | 显示全部楼层
7# ivanland


Geode 是从 Node 继承的, 也就是说 Node 是Geode 的基类, 所以 从 Geode 到 Node 的转换可以自动完成, 反之则需要转换语句。
gaoqian506 发表于 2010-7-12 10:43


您没看完我的代码吧?在代码里面只是将glider定义为Node类型,而没有将glider转换为Goeode的语句,那为什么glider变为Geode类型了?难道是自动转换的?那为什么glider不会自动转换为Group子类呢

该用户从未签到

发表于 2010-7-13 10:52:02 | 显示全部楼层
您没看完我的代码吧?在代码里面只是将glider定义为Node类型,而没有将glider转换为Goeode的语句,那为什么glider变为Geode类型了?难道是自动转换的?那为什么glider不会自动转换为Group子类呢
ivanland 发表于 2010-7-13 10:06


不知道你是否看了glider.osg文件的定义呢,那里最顶层节点的名称是Geode。

该用户从未签到

 楼主| 发表于 2010-7-13 15:52:31 | 显示全部楼层
总算知道哪出问题了,原来是glider.osg本身就是Geode类型,谢谢大家,又学到一点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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