在Octree场景下的多层次node包围盒问题

在使用Octree场景时,遇到一个问题,即通过OSMLoader导入的模型节点无法利用子节点更新包围盒。Ogre源代码中的_OctreeNode类在更新包围盒时不考虑子节点,导致无法通过_getWorldAABB获取rootNode的大小。为解决此问题,自定义了一个函数CalculateNodeBounds,递归遍历所有子节点,合并它们的世界坐标轴对齐包围盒,从而计算出rootNode的有效包围盒。
摘要由CSDN通过智能技术生成

     这两天遇到了一个问题(毕竟接触ogre不久,可能问题比较弱智哈),由于我把模型用OSMLoader的演示方法导入,它具体是通过一个场景(.osm文件)导入后,将其中的子模型分别用一个node保存,如果你提供了一个node(暂订叫rootNode),那么所有的子模型node都会添加rootNode下.

    这样本来也很没有问题,毕竟如果我用.osm导入一个大场景,为了处理碰撞,我肯定要把各个子模型分散到不同的node下,但是在Octree场景下,问题就来了,请看ogre源代码:

//same as SceneNode, only it doesn't care about children...
void OctreeNode::_updateBounds( void )
{
    mWorldAABB.setNull();
    mLocalAABB.setNull();

    // Update bounds from own attached objects
    ObjectMap::iterator i = mObjectsByName.begin();
    AxisAlignedBox bx;

    while ( i != mObjectsByName.end() )
    {

        // Get local bounds of object
        bx = i->second ->getBoundingBox();

        mLocalAABB.merge( bx );

        mWorldAABB.merge( i->second ->getWorldBoundingBox(true) );
        ++i;
    }


    //update the OctreeSceneManager that thing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值