OpenSceneGraph开发中的一些陷阱

1.如果对osg::PositionAttitudeTransform这个节点设置了更新回调,那么对这个节点做的一些平移,旋转,缩放操作都会失效,即setAttitude,setPosition,setScale这些函数都会无效。


解决的办法:在这个更新回调下面添加一个osg::PositionAttitudeTransform类型的子节点,将之前想要进行的平移,旋转,缩放操作施加在这个子节点中,这样更新操作和平移,旋转,缩放操作就都会起作用了。


注意:没有对和osg::PositionAttitudeTransform类似的osg::MatrixTransform类进行测试,所以不知道osg::MatrixTransform类是否也是这样,使用osg::MatrixTransform时如果出现设置无效,注意联想到这个问题。


2.osg::Switch类添加更新回调无效。

不知道为什么在OpenSceneGraph的参考手册中osg::Switch类中有void osg::Node::setUpdateCallback(osg::NodeCallback *nc)这个函数,事实上,继承自osg::Node的类都有这个更新回调函数,但是在使用时发现,往这个osg::Switch的更新回调中添加继承自osg::NodeCallback的osg::AnimationPathCallback回调时,设置的路径动画回调不起作用。

解决的办法:一般使用osg::Switch的动机是为了切换,那么就不要在这个节点上添加太多的逻辑,在它的下面添加一个子节点,将更新回调放置在这个子节点上,这样分工也比较明确。

3.几何体透明的问题。
在OpenSceneGraph中创建了一个圆锥,要将这个圆锥设置透明,事实上osg::ShapeDrawable类的对象有一个setColor函数,这个函数接受4个参数,明显这四个参数是R,G,B,Alpha值,第4个参数应该是这是透明的,但是这样设置后几何体仍然没有透明效果。

解决的办法:需要在几何体对应的osg::Geode对象的osg::StateSet对象上设置混合模式并开启透明渲染的设置,代码如下:
	osg::ref_ptr<osg::Geode> geode=new osg::Geode;

	//生成圆锥
	osg::ref_ptr<osg::Cone>  cone=new osg::Cone;

	cone->setHeight(30);
	cone->setRadius(30);

	osg::ref_ptr<osg::ShapeDrawable> shap=new osg::ShapeDrawable(cone);

	shap->setColor(osg::Vec4(0.7,0.7,0.7,0.95));
	geode->addDrawable(shap);

	//设置几何体透明效果
	osg::ref_ptr<osg::StateSet> stateset=geode->getOrCreateStateSet();
	stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
	stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);


你可能感兴趣的:(问题,陷阱,OSG)