osgearth 2.10.x 版本 拾取 placenode
时间: 2024-04-30 20:23:52 浏览: 7
在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 中,需要在拾取事件发生时,处理对应的逻辑。