在三维场景中有时需要对两点求其是否可见,即两点之间有没有障碍物的遮挡。在OSG中则可使用碰撞检测完成此功能。
核心的碰撞检测代码为:
// 创建需要进行检测的两点之间的线段
osg::ref_ptr<osg::LineSegment> line = new osg::LineSegment(point1,point2);
// 创建一个IV
osgUtil::IntersectVisitor iv;
// 把线段添加到IV中
iv.addLineSegment(line);
node->accept(iv);
// 最后可以对iv.hits()的返回值进行判断
if (iv.hits())
{
// 两点间有障碍
}
else
{
// 两点间无障碍
}
```
完整的两点通视代码为:lineanalysis.h
```c++
class LineAnalysis : public HandleAdapter
{
public:
LineAnalysis(GraphicsView* view);
~LineAnalysis();
protected:
virtual void slotPicked(osg::Vec3d pos);
virtual void slotMoveing(osg::Vec3d pos);
virtual void slotRightHandle();
private:
void analysis(osg::Vec3d pos);
osg::Vec3d getWorldCoord(osg::Vec3d pos);
private:
osgEarth::Annotation::FeatureNode* m_pLine;
osg::Vec3d m_firstPoint;
osgEarth::Annotation::PlaceNode* m_pPlaceNode;
osgEarth::Symbology::Style<