有一个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;
}
如何正确完成?谢谢!
答案 0 :(得分:1)
这是摘自OpenSceneGraph Group
class(ListView 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方法)。