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

时间:2015-06-01 13:30:15

标签: c++ 3d openscenegraph

有一个Geode,其几何图形是一个球,其上方分配有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;
}

如何正确完成?谢谢!

1 个答案:

答案 0 :(得分:1)

这是摘自OpenSceneGraph Group classListView yourList = (ListView) findViewById(...); yourList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Object listItem = list.getItemAtPosition(position); } }); 继承):

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; } 。要删除节点,您必须至少等待节点回调返回。

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

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