查看: 1302|回复: 4

开启碰撞检测后 变的极慢。。。为什么。。

[复制链接]

该用户从未签到

发表于 2011-5-12 12:00:15 | 显示全部楼层 |阅读模式
开启碰撞检测后 变的极慢,按下按键过好一会才一动一下,关闭了就恢复速度了。。。
想问一下这种情况有可能是什么原因导致的呢?多谢了啊!

  1. void CSouth::ChangePosition(osg::Vec3& delta)
  2. {
  3.         if (m_bPeng&&m_node.get())
  4.         {
  5.   osg::Vec3 newPos = m_vPosition + delta;
  6.                 osgUtil::IntersectVisitor iv;
  7.                 //前后的线段
  8.                 osg::ref_ptr<osg::LineSegment> line = new osg::LineSegment(newPos,m_vPosition);
  9.                 //上下移动的线段,加入两条线段来检测碰撞
  10.                 osg::ref_ptr<osg::LineSegment> lineZ = new osg::LineSegment(newPos + osg::Vec3(0.0f, 0.0f, m_fMoveSpeed),
  11.                         newPos - osg::Vec3(0.0f, 0.0f, m_fMoveSpeed));

  12.                 iv.addLineSegment(lineZ.get());
  13.                 iv.addLineSegment (line.get()) ;
  14.                 //接受碰撞的检测node                
  15.                 m_node ->accept(iv);
  16.                 if (!iv.hits())//如果没有碰撞则移动旧位置到新的位置上
  17.                 {
  18.                         m_vPosition += delta;
  19.                 }
  20.         }
  21.         //如果碰撞检测根本没开,则直接移过去,
  22.         else
  23.         {
  24.                 m_vPosition += delta;
  25.         }
  26. }
复制代码

该用户从未签到

发表于 2011-5-13 08:33:08 | 显示全部楼层
没有看到您的整个流程的话,我判断不了什么;此外IntersectVisitor完全是为了保持与以前版本的兼容性而设置的,新版本的程序请一律使用IntersectionVisitor

该用户从未签到

 楼主| 发表于 2011-5-13 15:44:04 | 显示全部楼层
回复 2# array

我参考osgkeyboardmouse的例子改写了,也不知道合适不合适,我的场景是一个地面和一个包围的天空盒,可以检测到和地面的碰撞,天空盒就直接穿过去了。。
漫游器就是《OSG程序设计教程》中的那个,按下方向键后执行一个ChangePosition()。
还是开启碰撞检测后会变慢,一卡一卡的。。。。



  1. osg::ref_ptr<osg::Node> sky = CreateSky();
  2. osg::ref_ptr<osg::Group> ground = CreateGround();


  3. mRoot->addChild(ground.get());       
  4. mRoot->addChild(sky.get());
复制代码


  
  1. void CSouth::ChangePosition(osg::Vec3& delta)
  2. {
  3.         if (m_bPeng&&m_node.get())
  4.         {

  5.                 osg::Vec3 newPos = m_vPosition + delta;

  6.                 picker = new osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, m_vPosition, newPos );

  7.                 osgUtil::IntersectionVisitor iv(picker.get());
  8.                 m_HostViewer->getCamera()->accept(iv);
  9.                                
  10.                 if (!picker->containsIntersections())//如果没有碰撞则移动旧位置到新的位置上
  11.                 {
  12.                         m_vPosition += delta;
  13.                 }
  14.         }
  15.         //如果碰撞检测没开,则直接移过去,
  16.         else
  17.         {
  18.                 m_vPosition += delta;
  19.         }
  20. }
复制代码

该用户从未签到

发表于 2011-5-15 15:40:14 | 显示全部楼层
void CSouth::ChangePosition(osg::Vec3& delta)
你这个函数是在什么地方调用的,不说清楚没办法判断

该用户从未签到

 楼主| 发表于 2011-5-23 16:54:37 | 显示全部楼层
回复 4# wangjunchao

漫游器中按下键后执行的:
  1. bool CSouth::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us)
  2. {
  3.         float mouseX=ea.getX();
  4.         float mouseY=ea.getY();
  5.         //判断事件类型
  6.         switch (ea.getEventType())
  7.         {
  8.         case (osgGA::GUIEventAdapter::KEYDOWN) :
  9.                 {
  10.                         if (ea.getKey()==' ')//如果是空格 重绘
  11.                         {
  12.                                 us.requestRedraw();
  13.                                 us.requestContinuousUpdate(false);
  14.                                 return true;
  15.                         }

  16.                         if (ea.getKey() == 0xFF50)//如果是home键,则视点向上移动
  17.                         {
  18.                                 ChangePosition(Vec3(0, 0, m_fMoveSpeed));
  19.                                 return true;
  20.                         }
  21.                         if (ea.getKey() == 0xFF57)        //如果是end键,同视点向下移动
  22.                         {
  23.                                 ChangePosition(Vec3(0, 0, -m_fMoveSpeed));
  24.                                 return true;
  25.                         }

  26.                         //向前走,W键,或者UP键
  27.                         if (ea.getKey() == 0xFF52 || ea.getKey () == 'w' || ea.getKey () == 'W')
  28.                         {
  29.                                 ChangePosition(Vec3(0, m_fMoveSpeed * sinf(PI_2+m_vRotation._v[2]), 0));
  30.                                 ChangePosition(Vec3(m_fMoveSpeed * cosf(PI_2+m_vRotation._v[2]), 0, 0));
  31.                                 return true;
  32.                         }
  33.                         //向后退,S键,或者DOWN键
  34.                         if (ea.getKey() == 0xFF54 || ea.getKey () == 's' || ea.getKey () == 'S')
  35.                         {
  36.                                 ChangePosition(Vec3(0, -m_fMoveSpeed *sinf(PI_2+m_vRotation._v[2]), 0));
  37.                                 ChangePosition(Vec3(-m_fMoveSpeed *cosf(PI_2+m_vRotation._v[2]), 0, 0));
  38.                                 return true;
  39.                         }
  40.                         //A
  41.                         if (ea.getKey() == 'A' || ea.getKey () == 'a' )
  42.                         {
  43.                                 ChangePosition(Vec3(0, m_fMoveSpeed *cosf(PI_2+m_vRotation._v[2]), 0));
  44.                                 ChangePosition(Vec3(-m_fMoveSpeed *sinf(PI_2+m_vRotation._v[2]), 0, 0));
  45.                                 return true;
  46.                         }

  47.                         //D
  48.                         if (ea.getKey() == 'D' || ea.getKey () == 'd' )
  49.                         {
  50.                                 ChangePosition(Vec3(0, -m_fMoveSpeed * cosf(PI_2+m_vRotation._v[2]), 0));
  51.                                 ChangePosition(Vec3(m_fMoveSpeed * sinf(PI_2+m_vRotation._v[2]), 0, 0));
  52.                                 return true;
  53.                         }

  54.                         if (ea.getKey() == 0xFF53)//Right
  55.                         {
  56.                                 m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle);
  57.                         }
  58.                         if (ea.getKey()== 0xFF51)//Left
  59.                         {
  60.                                 m_vRotation._v[2] += osg::DegreesToRadians(m_fAngle);
  61.                         }

  62.                         return false;

  63.                 }

  64.                 //单击
  65.         case (osgGA::GUIEventAdapter::PUSH):
  66.                 {

  67.                         if (ea.getButton() == 1)
  68.                         {
  69.                                 m_fpushX = mouseX ;
  70.                                 m_fpushY = mouseY ;
  71.                                 m_bLeftButtonDown = true ;
  72.                         }
  73.                         return false;
  74.                 }
  75.                 //拖动
  76.         case (osgGA::GUIEventAdapter::DRAG):
  77.                 {
  78.                         if ( m_bLeftButtonDown)
  79.                         {
  80.                                 m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle * (mouseX-m_fpushX));
  81.                                 m_vRotation._v[0] += osg::DegreesToRadians(1.0f*(mouseY-m_fpushY));

  82.                                 //防止背过去
  83.                                 if (m_vRotation._v [0] >= 3.14)
  84.                                         m_vRotation._v [0] = 3.14 ;

  85.                                 if (m_vRotation._v [0] <= 0)
  86.                                         m_vRotation._v [0] = 0 ;
  87.                         }
  88.                         return false;
  89.                 }
  90.                 //键弹起
  91.         case (osgGA::GUIEventAdapter ::RELEASE ):
  92.                 {
  93.                         if ( ea.getButton () == 1)
  94.                         {
  95.                                 m_bLeftButtonDown = false ;
  96.                         }
  97.                         return false ;
  98.                 }

  99.         default:
  100.                 return false;

  101.         }//end switch

  102. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表