osgEarth 鼠标拾取pick

osgEarth上标注之类的鼠标拾取操作和osg的鼠标相交检测拾取不太一样,原因如下

翻译过来大概就是,PlaceNode和其它的标注类型不是在通常的场景图空间中渲染的,而是作为屏幕空间的叠加层来渲染的,不能通过相交检测获取到;

 

osgEarth上的鼠标拾取操作可以参考osgEarth_pick这个例子。

有一个要注意的问题是,加载.earth文件中的标注都可以拾取到,但是代码里添加的标注却拾取不到,解决办法是针对添加的标注,需要调这么个函数:

osgEarth::Registry::objectIndex()->tagNode(placeNode, owner);

如:osgEarth::Registry::objectIndex()->tagNode(tempPlaceNode, tempPlaceNode);

 

参考:http://forum.osgearth.org/Solved-Pick-PlaceNode-td7591969.html

osgEarth 2.10.x 版本中,要拾取 PlaceNode,可以使用以下步骤: 1. 创建一个拾取Picker: ```c++ osg::ref_ptr<osgEarth::Util::EarthManipulator> manipulator = viewer.getCameraManipulator()->asEarthManipulator(); osg::ref_ptr<osgEarth::Util::Picker> picker = new osgEarth::Util::Picker(viewer.getCamera(), manipulator.get()); ``` 2. 创建一个 PickCallback,并将其添加到 PlaceNode 中: ```c++ struct PickCallback : public osg::NodeCallback { virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { osg::ref_ptr<osg::Group> group = node->asGroup(); if (group) { osg::ref_ptr<osgEarth::Annotation::PlaceNode> placeNode = group->getChild(0)->asTransform()->getChild(0)->as<osgEarth::Annotation::PlaceNode>(); if (placeNode.valid()) { osg::Vec3d world; if (_picker->getWorldCoordsUnderMouse(nv->asNodeVisitor()->getRenderStage()->getCamera(), nv->asNodeVisitor()->getMouseX(), nv->asNodeVisitor()->getMouseY(), world)) { if (placeNode->getNode()->getBound().contains(world)) { // PlaceNode拾取 // TODO: 处理拾取事件 } } } } traverse(node, nv); } osg::ref_ptr<osgEarth::Util::Picker> _picker; }; osg::ref_ptr<PickCallback> pickCallback = new PickCallback(); pickCallback->_picker = picker; placeNode->addCullCallback(pickCallback.get()); ``` 3. 在 Viewer 的帧循环中调用拾取Picker 进行拾取: ```c++ while (!viewer.done()) { viewer.frame(); picker->update(viewer.getCurrentCamera()); // TODO: 处理拾取结果 } ``` 上述代码中,需要注意的是,PlaceNode 是在 Group 和 Transform 中间的一个节点,因此要通过 getChild(0)->asTransform()->getChild(0) 的方式获取到 PlaceNode 节点。同时,在 PickCallback 中,需要在拾取事件发生时,处理对应的逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值