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,用来检测指定线段与场景图形之间的相交情况

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. case (osgGA::GUIEventAdapter::PUSH):  
  2.     {  
  3.         int choose = 0;  
  4.         osg::Node *node;  
  5.   
  6.         osgUtil::LineSegmentIntersector::Intersections intersections;  
  7.         if (viewer->computeIntersections(ea,intersections))  
  8.         {  
  9.             osgUtil::LineSegmentIntersector::Intersection  intersection = *intersections.begin();  
  10.             osg::NodePath &nodepath = intersection.nodePath;  
  11.             node = (nodepath.size() >= 1) ? nodepath[nodepath.size()-1]:0;  
  12.   
  13.             const char *name = node->getName().c_str();  
  14.             choose = atoi(name);  
  15.         }  
  16.   
  17.         if (!object[choose].hit)                                // If The Object Hasn't Already Been Hit  
  18.         {  
  19.             object[choose].hit=TRUE;                            // Mark The Object As Being Hit  
  20.             score+=1;                                           // Increase Score  
  21.             kills+=1;                                           // Increase Level Kills  
  22.             if (kills>level*5)                                   // New Level Yet?  
  23.             {  
  24.                 miss=0;                                         // Misses Reset Back To Zero  
  25.                 kills=0;                                        // Reset Level Kills  
  26.                 level+=1;                                       // Increase Level  
  27.                 if (level>30)                                    // Higher Than 30?  
  28.                     level=30;                                   // Set Level To 30 (Are You A God?)  
  29.             }  
  30.         }  
  31.     }     

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值