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);


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值