用OpenSceneGraph实现的NeHe OpenGL教程 - 第三十二课

来源:互联网 发布:如何上淘宝开发票抬头 编辑:程序博客网 时间:2024/04/29 07:04
  • 简介

本节课NeHe课程主要想我们介绍了OpenGL中的拾取(Selection)的方式来和场景中的物体进行交换,在OSG中并没有封装OpenGL中的拾取方式,而是用了更高效的一种方式来实现与场景中的模型进行求交的操作,对于OSG这样处理的原因可以参考OSG中的这个MailList: New to OSG, some questions (selection buffer, parametric curves)

  • 实现

在NeHe课程中本课中实现的关键在Selection函数中,它实现了OpenGL中Selection的方式,在我们OSG中进行选择求交的代码就相对比较简单:

通过osgUtil提供的几种求交器实现:本课中使用的是osgUtil::LIneSegmentIntersector,用来检测指定线段与场景图形之间的相交情况

case (osgGA::GUIEventAdapter::PUSH):{int choose = 0;osg::Node *node;osgUtil::LineSegmentIntersector::Intersections intersections;if (viewer->computeIntersections(ea,intersections)){osgUtil::LineSegmentIntersector::Intersection  intersection = *intersections.begin();osg::NodePath &nodepath = intersection.nodePath;node = (nodepath.size() >= 1) ? nodepath[nodepath.size()-1]:0;const char *name = node->getName().c_str();choose = atoi(name);}if (!object[choose].hit)// If The Object Hasn't Already Been Hit{object[choose].hit=TRUE;// Mark The Object As Being Hitscore+=1;// Increase Scorekills+=1;// Increase Level Killsif (kills>level*5)// New Level Yet?{miss=0;// Misses Reset Back To Zerokills=0;// Reset Level Killslevel+=1;// Increase Levelif (level>30)// Higher Than 30?level=30;// Set Level To 30 (Are You A God?)}}}

代码中的其他部分涉及大量的回调更新与位置的计算,十分繁琐,但这些内容在以前的课程中都有介绍,具体的过程读者可以参考NeHe课程中的内容进行。



0 0