要求:
- 星球轨道默认隐藏,鼠标点击某星球,显示该星球轨道;
- 点击空白处隐藏所有轨道;
- 点击其他星球隐藏当前轨道,显示新选中星球轨道。
实际效果:
核心代码:
//对象选取事件处理器
void CPickHander::pick(osg::ref_ptr<osgViewer::View> view, float x, float y)
{
osg::ref_ptr<osg::Node> rpNode = new osg::Node();
osg::ref_ptr<osg::Group> rpGroupParent = new osg::Group();
//创建一个线段相交检测的集合
/*交集怎么得到的呢?可以看作是过屏幕上鼠标一点,垂直于屏幕的一条直线,穿过多少节点,集合里就会有多少元素;
点击一个球的时候,由于穿过球会和球有两个交点,所有会重复两次,当把多个球的球心放在一条直线时,直线穿过球心,那么所穿过的球,都会重复两次
因此,集合的第一个元素一定是你所点击的节点
*/
osgUtil::LineSegmentIntersector::Intersections intersections;
//计算屏幕和场景相交的结果,存入intersectioins中
if (view->computeIntersections(x, y, intersections))
{
osgUtil::LineSegmentIntersector::