查看: 4434|回复: 12

动态生成包围盒的问题

[复制链接]

该用户从未签到

发表于 2009-3-28 09:19:02 | 显示全部楼层 |阅读模式
我想根据某个组节点在不同时间中的不同场景,动态生成它的包围盒
不过好像有点问题
例如在某一时刻组节点testGroup中只有一个立方体,这时候包围盒显示是正确的[如图一]
在另一时刻向testGroup中又加入了一个奶牛的节点,这时包围盒显示也是正确的[如图二]
此时如果用removeChild,移除掉奶牛节点
再检测testGroup的包围盒时,发现得到的仍然是一个包含了奶牛节点大小的包围盒(虽然奶牛节点已被移除)[如图三]
我的本意是此时仍然得到的是立方体的包围盒
这个问题应该如何解决?

图一

图一

图二

图二

图三

图三

该用户从未签到

发表于 2009-3-28 09:41:43 | 显示全部楼层
这个挺奇怪的,那如果你给奶牛节点加一个osg::Switch节点呢?当你不需要奶牛的时候,你只需要将其关掉就可以了。

该用户从未签到

发表于 2009-3-28 09:58:21 | 显示全部楼层
要动态计算新的包围盒的话,只要dirtyBound就可以了。这之后的一帧里系统会自动重新计算包围盒的大小

该用户从未签到

 楼主| 发表于 2009-3-28 10:01:23 | 显示全部楼层
如panbin兄所述,貌似如果对奶牛使用Switch节点,最后的包围盒仍然包含了奶牛

该用户从未签到

 楼主| 发表于 2009-3-28 10:09:08 | 显示全部楼层
testGroup的包围盒是通过ComputeBoundsVisitor计算得到的
  1. osg::ComputeBoundsVisitor cbv;
  2. osg::BoundingBox bb;

  3. testGroup->accept(cbv);
  4. bb = cbv.getBoundingBox();
  5. boundingBoxGeode = createBoundingBox(bb);
  6. root->addChild(boundingBoxGeode.get());
复制代码
请问array,这个dirtyBound如何调用才有效?

该用户从未签到

发表于 2009-3-28 10:38:33 | 显示全部楼层
如你上面代码所示,请教两个问题:
1. testGroup->accept(cbv); 这句话是要计算boundingbox?他只计算了testGroup的boundingbox还是对testGroup的所有子节点都要计算?
2. boundingBoxGeode = createBoundingBox(bb);  这个是创建一个boundingbox的Geode的节点?是你自己定义的函数吧?

该用户从未签到

发表于 2009-3-28 10:41:09 | 显示全部楼层
dirtyBound(); 应该是在你removechild之后,testGroup->dirtyBound()吧

该用户从未签到

发表于 2009-3-28 11:09:32 | 显示全部楼层
dirtyBound只要调用就可以了。但是它不会立即生效,而是在下一帧再次遍历到这个节点时生效。不过直接dirtyBound然后getBound也是可以的,这时getBound会自动重新计算包围盒的数据。

该用户从未签到

 楼主| 发表于 2009-3-28 14:46:06 | 显示全部楼层
原帖由 panbin 于 2009-3-28 10:38 发表
如你上面代码所示,请教两个问题:
1. testGroup->accept(cbv); 这句话是要计算boundingbox?他只计算了testGroup的boundingbox还是对testGroup的所有子节点都要计算?
2. boundingBoxGeode = createBoundingBox(b ...


1.对于Node节点对象,如果直接调用getBound,得到的是它的包围球,我也没啥好方法,只能这样子来求testGroup的包围盒了,呵呵。
  它计算的是testGroup的boundingbox
2.boundingBoxGeode是一个Geode类型的几何体节点,createBoundingBox是我自定义的一个方法。
  其实就是通过传入的包围盒的物理信息,例如长、宽、高和中心坐标,创建了一个线框体

该用户从未签到

发表于 2009-3-29 08:06:55 | 显示全部楼层
LZ不知道能不能分享一下您的关于包围盒的程序,我想学习学习,现在在做碰撞检测方面的事情,我想这对我很有帮助,谢谢~
uuunreal@gmail.com
我的邮箱

该用户从未签到

 楼主| 发表于 2009-3-29 12:06:23 | 显示全部楼层
我也是在做碰撞检测的前期工作,以后多交流啊~
box.3ds是用3DMAX生成的
代码很简单,放上来吧,呵呵
希望大家别见笑

090327_01.rar

1.73 KB, 下载次数: 307, 下载积分: 威望 1

动态生成包围盒

该用户从未签到

发表于 2009-3-29 20:47:52 | 显示全部楼层
同志啊~其实咱们俩都是在这个论坛里捣乱的,人家是搞渲染的~
我是在做毕业设计的~以后多联系,咱OSG群里你在么,回头加个QQ~

该用户从未签到

发表于 2015-11-30 14:05:25 | 显示全部楼层
本帖最后由 louis 于 2015-11-30 14:08 编辑

小弟有一事不明啊,出现楼主的第三种情况,添加节点是好用的,但是删除节点或者隐藏节点就不更新了,它的包围盒是不断扩大的
我是想,无论场景中有多少节点,包围盒都是随着场景包围的这种
transform->dirtyBound();
    transform->accept(cbv);
    bb = cbv.getBoundingBox();    //得到包围盒

    qDebug()<<bb.xMin()<<"==="<<bb.xMax();
    qDebug()<<bb.yMin()<<"==="<<bb.yMax();
    qDebug()<<bb.zMin()<<"==="<<bb.zMax();
    qDebug()<<"--------------------------";
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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