繁体   English   中英

如何从其回调函数中删除节点?

[英]How to remove a node from its callback function?

有一个Geode其Geometry是一个球,在其上方分配了MatrixTransform() 它的回调函数使其无法使用。 当球与地面相交时,我希望将其从场景中移除。

以下代码引发异常:

//inside the ball's callback

virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
{
    using namespace osg;
    MatrixTransform* matrix_node = dynamic_cast<MatrixTransform*>(node);
    Matrix matrix = matrix_node->getMatrix();

    velocity += Vec3(0, 0, -0.002);

    matrix.postMultTranslate(velocity);

    matrix_node->setMatrix(matrix);

    Vec3 now_position = start_position * matrix;

    osgUtil::IntersectVisitor ivXY; 

    osg::ref_ptr<osg::LineSegment> lineXY = new osg::LineSegment(now_position, now_position+velocity); 

    ivXY.addLineSegment(lineXY);

    GAME.main_camera->m_pHostViewer->getSceneData()->accept(ivXY) ;
    if(ivXY.hits())
    {
        node->getParent(0)->removeChild(node);
    }
    return;
}

如何正确做? 谢谢!

这是OpenSceneGraph Group的摘录( MatrixTransform继承自该类 ):

void Group::traverse(NodeVisitor& nv)
{
        for(NodeList::iterator itr=_children.begin();
        itr!=_children.end();
        ++itr)
    {
        (*itr)->accept(nv);
    }
}

bool Group::removeChild( Node *child )
{
    unsigned int pos = getChildIndex(child);
    if (pos<_children.size()) return removeChildren(pos,1);
    else return false;
}

您的代码(从遍历中调用)会引发异常,这可能是因为在调用removeChild时,迭代器在循环中间无效。 要删除该节点,您至少必须等到节点回调返回。

为了解决这个问题,我只需要使用节点蒙版来控制是否显示球。 最初,将球节点蒙版设置为“可见”值。 当球撞击地面时,将节点蒙版设置为“隐藏”值。 该节点将不会被遍历/渲染,但仍将保留在内存中。

如果存在内存问题,则可以将代码移动到父节点或更新遍历之外(例如,使用修改后的Viewer :: run方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM