[英]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.