我在Android上使用OSG ......
我在主
中初始化了indexNode = 0int main(int, char **)
{
osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile( "cessna.osg");
osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile( "cow.osg" );
unsigned int indexNode= 0;
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild( model1.get() );
root->addChild( model2.get() );
osg::ref_ptr<PickHandler> picker = new PickHandler;
root->addChild( picker->getOrCreateSelectionBox() );
osgViewer::Viewer viewer;
viewer.setSceneData( root.get() );
viewer.addEventHandler( picker.get() );
return viewer.run();
}
这是带有print语句的部分
class PickHandler : public osgGA::GUIEventHandler
{
public:
osg::Node* getOrCreateSelectionBox();
virtual bool handle( const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa );
protected: osg::ref_ptr<osg::MatrixTransform> _selectionBox;
};
osg::Node* PickHandler::getOrCreateSelectionBox()
{
if ( !_selectionBox )
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(),1.0f)) );
_selectionBox = new osg::MatrixTransform;
_selectionBox->setNodeMask( 0x1 );
_selectionBox->addChild( geode.get() );
osg::StateSet* ss = _selectionBox->getOrCreateStateSet();
ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
ss->setAttributeAndModes(new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE));
}
return _selectionBox.get();
}
bool PickHandler::handle( const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa )
{
if ( ea.getEventType()!=osgGA::GUIEventAdapter::RELEASE || ea.getButton()!=osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON )
return false;
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
if ( viewer )
{
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector( osgUtil::Intersector::WINDOW, ea.getX(), ea.getY());
osgUtil::IntersectionVisitor iv( intersector.get() );
iv.setTraversalMask( ~0x1 );
viewer->getCamera()->accept( iv );
if ( intersector->containsIntersections() )
{
osgUtil::LineSegmentIntersector::Intersection result=*(intersector->getIntersections().begin());
osg::BoundingBox bb = result.drawable->getBound();
osg::ref_ptr newnode = result.drawable->getParent(0);
indexNode= mTransform->getChildIndex(newnode);
__android_log_print(ANDROID_LOG_INFO,"index","%d\n",indexNode);
osg::Vec3 worldCenter = bb.center() * osg::computeLocalToWorld(result.nodePath);
_selectionBox->setMatrix(osg::Matrix::scale(bb.xMax()-bb.xMin(), bb.yMax()-bb.yMin(), bb.zMax()-bb.zMin()) *osg::Matrix::translate(worldCenter) );
}
}
return false;
}
这些界限:
osg::ref_ptr newnode = result.drawable->getParent(0);
indexNode= mTransform->getChildIndex(newnode);
__android_log_print(ANDROID_LOG_INFO,"index","%d\n",indexNode);
我想在选择任何节点(牛或平面)时获取节点名称或索引节点, 我需要返回任何能帮助我知道我选择了哪个对象的东西吗?
我不知道我所做的是否正确,但当我点击任何一个物体时它会给我3号
答案 0 :(得分:0)
乍一看,目前尚不清楚它在哪里'给'你3号。我没有看到任何打印的东西,我也看不到任何可能包含3的int。我看到很多界限和矩阵。
您需要更好地解释这种情况,或许可以使用更简单的演示代码。
答案 1 :(得分:0)
这是添加节点名称和标识符的方法:
int main()
{
....
osg::ref_ptr<osg::Group> root = new osg::Group;
root->setName("Node Name");
root->setUserValue("id", idNumber);
...
}
当选择一个对象时,这是您检索其名称和标识符的方式:
osg::Node *node;
node->getUserValue("id", returnedString);
std::string name = node->getName();
希望这可以解除你的怀疑。