查看: 1611|回复: 3

用PolytopeIntersector实现线框加点有误差

[复制链接]

该用户从未签到

发表于 2013-7-16 08:48:40 | 显示全部楼层 |阅读模式
现在为实现线框的编辑,使用PolytopeIntersector找出鼠标点击射线与线框的交点,再用矩阵变换变为本地坐标,但是点添加上去明显有误差。本人新手,求高人指点!
  1. osg::ref_ptr<osgUtil::PolytopeIntersector> OsgIntersectorEventHandler::getPolytopeIntersector(
  2.     const osgGA::GUIEventAdapter& aEventAdapter,
  3.     const double& aWidth,
  4.     const double& aHeight)
  5. {
  6.     double centerX = aEventAdapter.getXnormalized();
  7.     double centerY = aEventAdapter.getYnormalized();
  8.     osg::ref_ptr<osgUtil::PolytopeIntersector> picker(
  9.         new osgUtil::PolytopeIntersector(
  10.                 osgUtil::Intersector::PROJECTION,
  11.                 centerX - aWidth,
  12.                 centerY - aHeight,
  13.                 centerX + aWidth,
  14.                 centerY + aHeight)
  15.     );
  16.     return picker;
  17. }

  18. void IntersectionEditEventHandler::handleIntersector(
  19.     const osgGA::GUIEventAdapter& aEventAdapter,
  20.     const bool& aMouseDown)
  21. {
  22.     osg::ref_ptr<osgUtil::PolytopeIntersector> picker = getPolytopeIntersector(aEventAdapter, 0.001, 0.001);
  23.     osgUtil::IntersectionVisitor intersectionVisitor(picker);
  24.     _viewer->getCamera()->accept(intersectionVisitor);
  25.     bool isNearFrame = false;
  26.     if (picker->containsIntersections())
  27.     {
  28.         BOOST_FOREACH(const osgUtil::PolytopeIntersector::Intersection & intersection, picker->getIntersections())
  29.         {
  30.             osg::NodePath nodes = intersection.nodePath;
  31.             BOOST_FOREACH(osg::Node * node, nodes)
  32.             {
  33.                 if (node->getName() == "IntersectionFrame")
  34.                 {
  35.                     isNearFrame = true;
  36.                     if (aMouseDown)
  37.                     {
  38.                         osg::Vec3 intersectionPoint =
  39.                             intersection.matrix->preMult(intersection.localIntersectionPoint);
  40.                         AddVertexToIntersection(intersectionPoint);
  41.                         break;
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.     }
  47.     IsNearFrame(isNearFrame);
  48. }
复制代码
原线框:
2013-7-16 8-46-26.png
加点后:
2013-7-16 8-47-49.png
2013-7-16 8-46-26.png

该用户从未签到

发表于 2013-7-16 10:23:42 | 显示全部楼层
您期望的效果是什么?您是否对结果队列中的数据选取有误

该用户从未签到

 楼主| 发表于 2013-7-16 10:39:00 | 显示全部楼层
我想在线上加点,现在鼠标移动在线上的时候会变光标,点击了之后加点,结果就出现了加点偏移,按理说求交器的交点中心应该在线上。

该用户从未签到

 楼主| 发表于 2013-7-16 11:34:27 | 显示全部楼层
找到了解决方法,在做矩阵变换的时候intersection.matrix->preMult用的localIntersectionPoint是vec3类型,所以有精度损失,转成vec3D即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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