查看: 8973|回复: 5

请教大家setNodeMask和osg::Switch的问题

[复制链接]

该用户从未签到

发表于 2008-5-5 10:07:02 | 显示全部楼层 |阅读模式
菜鸟又来请教了
(^_^)
我把根节点设置成了一个osg::switch,目的是控制场景中节点的显示。
程序能对场景中的物体一一进行隐藏(直接对选中的节点进行setNodeMask(0),这方法是不是很笨?),但是我不太清楚应该如何再将他们一一显示出来(因为隐藏物体时我可以进行鼠标选择,而要显示物体时由于物体是已经被隐藏的,所以选择不了,能不能告诉小弟应该如何实现对单一物体进行显示)
所以现在我想实现整个场景中物体的显示,但是遇到了两个问题:
1.我通过一个NodeVisitor来得到根节点osg::switch,但此时NodeVisitor将它看作是一个osg::node,没有setAllChildrenOn的功能
如果通过dynamic_cast来转换成osg::Switch的话,比如说osg::Switch* _switch = dynamic_cast<osg::Switch*>(tun.getNode())(tun.getNode()就是根节点osg::switch),但此时的_switch似乎并不是真正的根节点,只是将根节点赋值给了它,进行setAllChildrenOn不起作用(是这样的吗?)
2.同时我又试了另外一种想法,就是通过一个NodeVisitor遍历所有的节点,对所有节点进行setNodeMask()来进行显示,但是并没有成功,大侠们请帮忙,小弟先行谢过。

该用户从未签到

发表于 2008-5-5 13:26:29 | 显示全部楼层
osg::Switch* _switch = dynamic_cast&lt;osg::Switch*&gt;(tun.getNode())应该是没有问题的,只要你确实得到了节点的地址而不是NULL。那么相应地setAllChildrenOn也会起作用。问题在于您是如何实现节点隐藏的,从您的叙述来看,似乎是采用了setNodeMask的方法,这样的话和Switch节点是没有直接联系的。

OSG的摄像机具有setCullMask方法,同样节点也具有setNodeMask方法,这里我们通过掩码(mask)的“与”运算来判断节点是否在指定的摄像机中显示。例如getCamera()的cullMask设置为0x1(同时还要设置osg::CullSettings::VariablesMask的值,可以参看NPS教程的第16课),那么凡是nodeMask与0x1相“与”之后不为0的节点都可以在这个摄像机中显示。据此我们可以实现诸如小地图导航等功能。

由上面可以看出,这里的setNodeMask与场景的CULL过程是相关的,但是与Switch节点并不相关。因此使用setAllChildrenOn是有效的,但是您看不出效果,因为对于Switch而言所有的子节点本来就是显示的,只是在场景筛选(CULL)的过程中被cullMask过滤掉了而已。应当用setValue等函数设置Switch子节点是否隐藏/显示。

该用户从未签到

 楼主| 发表于 2008-5-5 15:56:24 | 显示全部楼层
感谢王锐热情的答复,每次都那么详细。
您的解释很清楚,我懂了,受益匪浅

该用户从未签到

 楼主| 发表于 2008-5-5 16:42:00 | 显示全部楼层
我发现一个问题,在官方例子里面说:
在渲染前的场景图形遍历中,系统将进行当前节点掩码和摄像机掩码的逻辑“或”运算比较。如果比较的结果不为0,则遍历过程继续执行,节点所包含的几何体信息将被传递到渲染系统中。如果逻辑“或”的结果为0,则之后的遍历过程中止,与该节点相关的几何体也就因此不再被渲染。

官方为什么说是“或”运算?英文官网也是,说的是a logical OR comparison。
我仔细看了一下例子,发现王锐版主说的应该是对的,应该是“与”。
“与”和“或”明显不一样的啊,难道我搞错了?
疑惑中~~

该用户从未签到

发表于 2008-5-5 20:07:17 | 显示全部楼层
原帖由 soda 于 2008-5-5 16:42 发表
我发现一个问题,在官方例子里面说:
在渲染前的场景图形遍历中,系统将进行当前节点掩码和摄像机掩码的逻辑“或”运算比较。如果比较的结果不为0,则遍历过程继续执行,节点所包含的几何体信息将被传递到渲染系统中 ...


可能是官方的疏忽吧,OR运算只有运算两者均为0的时候才可能会结果为0。这显然不太可能

该用户从未签到

 楼主| 发表于 2008-5-5 22:06:39 | 显示全部楼层
果然是这样的,官方网页上也免不了有点小错误啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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