|
楼主 |
发表于 2012-5-24 15:28:16
|
显示全部楼层
本帖最后由 travller 于 2012-5-24 15:29 编辑
CWorld 发表于 2012-5-24 11:22
1 "switch类" 是指osg::Switch类吗? 这个地方没说清楚。
2 正如你说的那样,osg的绝大多数类都设计为保 ...
你好!
1.这里是指osg::switch的开关类;
2.一开始我也想到了将析构函数设为protected是强制将类对象分配在堆上,但是这样一来写出来的代码感觉不像以前那么简洁明了
,就是说如果你想把一句很长的代码进行分拆,必须为每一个具有保护类型的析构函数的类对象用超级指针进行实例化,否则编译就会不通过如geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius),hints));这行代码,如果拆开写的话必须要写成这样osg::ref_ptr<osg::Sphere> sphere=new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius);
osg::ref_ptr<osg::ShapeDrawable> sd=new osg::ShapeDrawable(sphere,hints);。您能和我谈谈OSG中如果不把对象强制分配在堆上能带来哪些不利吗?至于将一个节点加到switch对象中,并关闭时如sw->addChild(transBuiltIn,false);FreeSouth在他的书中说此时该节点transBuiltIn的内存会被释放,我疑问的是既然被释放那么是不是要调用每一个对象的析构函数包括受保护的析构函数,如果调用了,那么又是如何调用的?(通常情况下此时受保护的析构函数应该无法被调用);如果没有被调用,那么也许是由OSG超级指针在发挥作用,我要好好摸索下?。我的代码很简单,下面是和该贴相关的代码:
osg::ref_ptr<osg::Node> CreateBuiltInShape()
{
float radius=0.08f;//内置球图元模型的半径
float height=0.1f;//内置模型的高
osg::ref_ptr<osg::TessellationHints> hints=new osg::TessellationHints();//模型精确度类
hints->setDetailRatio(0.5f);//设定模型的精确度,值越大表示模型的越细腻
osg::ref_ptr<osg::Geode> geode=new osg::Geode();
osg::ref_ptr<osg::Sphere> sphere=new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius);
osg::ref_ptr<osg::ShapeDrawable> sd=new osg::ShapeDrawable(sphere,hints);
geode->addDrawable(sd);
return geode;
}
int _tmain(int argc, _TCHAR* argv[])
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root=new osg::Group();
osg::ref_ptr<osg::MatrixTransform> transBuiltIn=new osg::MatrixTransform();
transBuiltIn->setMatrix(osg::Matrix::translate(0,0,-2));
osg::ref_ptr<osg::Node> builtIn=CreateBuiltInShape();
transBuiltIn->addChild(builtIn);
osg::ref_ptr<osg::Switch> sw=new osg::Switch();
sw->addChild(transBuiltIn,true);//sw->addChild(transBuiltIn,false)
root->addChild(sw)
viewer.setSceneData(root);
viewer.realize();
viewer.run();
return 0;
}
3.关于你的说的宽容:我不是说一个人回帖回的不对就说他很差,那样我会很次。问题是我给回我帖子的人留言说他想的不对,之后他给我的回复,(也许是他表达不好的缘故),就是让人感到他不是一个有自尊的人,自以为是,因为他不懂得尊重别人! |
|