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

  • 简介

本节课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 Hit
					score+=1;											// Increase Score
					kills+=1;											// Increase Level Kills
					if (kills>level*5)									// New Level Yet?
					{
						miss=0;											// Misses Reset Back To Zero
						kills=0;										// Reset Level Kills
						level+=1;										// Increase Level
						if (level>30)									// Higher Than 30?
							level=30;									// Set Level To 30 (Are You A God?)
					}
				}
			}	

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



你可能感兴趣的:(C++,qt,OpenGL,nehe,OSG)