查看: 1620|回复: 3

在TrackballManipulator的基础上添加碰撞检测,碰到墙壁不会穿墙而过。

[复制链接]

该用户从未签到

发表于 2011-11-23 09:18:09 | 显示全部楼层 |阅读模式
请教一下如何在TrackballManipulator的基础上添加碰撞检测,碰到墙壁不会穿墙而过。
_center是camera 的位置吗,如何求camera 的位置?下面的代码是在TrackballManipulator.cpp上修改的,明显不行,不知道怎么改。
  1.     else if (buttonMask==GUIEventAdapter::MIDDLE_MOUSE_BUTTON ||
  2.         buttonMask==(GUIEventAdapter::LEFT_MOUSE_BUTTON|GUIEventAdapter::RIGHT_MOUSE_BUTTON))//鼠标中键或者同时按鼠标左键和右键
  3.     {

  4.         // pan model.上下左右移动模型

  5.         float scale = -0.3f*_distance;//比例尺

  6.         osg::Matrix rotation_matrix;//旋转矩阵
  7.         rotation_matrix.makeRotate(_rotation);

  8.         osg::Vec3 dv(dx*scale,dy*scale,0.0f);//平移向量

  9.         
  10.                 {//碰撞检测
  11.                 osg::Vec3 axis;
  12.                 double angle;
  13.                 _rotation.getRotate(angle,axis);
  14.                 axis.normalize();
  15.                 osg::Vec3d eye;
  16.                 eye=_center-axis*_distance;
  17.                
  18.                 osg::Vec3 startp=eye;
  19.                 osg::Vec3 endp=eye+dv*rotation_matrix;
  20.         //线段测试内容
  21.                 osgUtil::IntersectionVisitor iv;
  22.                 osgUtil::LineSegmentIntersector* lineTest = new osgUtil::LineSegmentIntersector(startp,endp);
  23.                 iv.setIntersector(lineTest);

  24.                 _node->accept(iv);
  25.                 if (lineTest->containsIntersections())
  26.                         return false;
  27.                
  28.                 }
  29.                 _center += dv*rotation_matrix;//中心位置
  30.         return true;

  31.     }
复制代码

该用户从未签到

发表于 2011-11-23 11:59:39 | 显示全部楼层
center不是camera的位置
osg::Matrixd TrackballManipulator::getMatrix() const
{
    return osg::Matrixd::translate(0.0,0.0,_distance)*osg::Matrixd::rotate(_rotation)*osg::Matrixd::translate(_center);
}
由此函数可以看出,摄影机位置是在_rotation和_center确定的坐标系下的0.0,0.0,_distance位置处

该用户从未签到

 楼主| 发表于 2011-12-19 11:57:47 | 显示全部楼层
这是最新修改的代码,可以实现部分功能,
  1.     else if (buttonMask==GUIEventAdapter::MIDDLE_MOUSE_BUTTON ||
  2.         buttonMask==(GUIEventAdapter::LEFT_MOUSE_BUTTON|GUIEventAdapter::RIGHT_MOUSE_BUTTON))//鼠标中键或者同时按鼠标左键和右键
  3.     {

  4.         // pan model.上下左右移动模型

  5.         float scale = -0.5f*_distance;//比例尺

  6.         osg::Matrix rotation_matrix;//旋转矩阵
  7.                 rotation_matrix.makeRotate(_rotation);

  8.         osg::Vec3 dv(dx*scale,dy*scale,0.0f);//平移向量

  9.                 //碰撞检测
  10.                 osg::Vec3 startp;
  11.                 osg::Vec3 endp;

  12.                 startp=_eye;
  13.                 endp=_eye+dv*rotation_matrix;

  14.                 if (collision(startp,endp))
  15.                         return false;
  16.                 else
  17.                 {
  18.                         _center+=dv*rotation_matrix;
  19.                         _eye = endp;//Camera中心位置
  20.                         return true;
  21.                 }


  22.     }

  23. bool TrackballManipulator_01::collision(osg::Vec3& startp,osg::Vec3& endp)
  24. {
  25.         //线段测试内容
  26.         osgUtil::IntersectionVisitor iv;
  27.         osgUtil::LineSegmentIntersector* lineTest = new osgUtil::LineSegmentIntersector(startp,endp);
  28.         iv.setIntersector(lineTest);

  29.         _node->accept(iv);
  30.         return lineTest->containsIntersections();
  31. }
复制代码

该用户从未签到

发表于 2011-12-20 10:58:43 | 显示全部楼层
记得flysky书里不是有段这样功能的~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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