查看: 2763|回复: 14

osg中怎么实现线段的拣选?

[复制链接]

该用户从未签到

发表于 2009-12-30 21:38:58 | 显示全部楼层 |阅读模式
在osg中用PrimitiveSet:INES画出几条线段,怎么通过鼠标点击获得离点击点最近的那条线段。

该用户从未签到

 楼主| 发表于 2009-12-30 21:39:48 | 显示全部楼层
请教各位大侠

该用户从未签到

 楼主| 发表于 2009-12-30 21:42:57 | 显示全部楼层
我看到osg源代码中没有实现对一个简单图元的拣选,可能是它还没写吧

该用户从未签到

 楼主| 发表于 2009-12-30 21:56:22 | 显示全部楼层
array在不在的

该用户从未签到

发表于 2009-12-30 23:24:30 | 显示全部楼层
事实上线段的拾取需要您自己写代码来完成,这并不困难~~派生一个自己的LinesegmentIntersection就可以了

该用户从未签到

发表于 2009-12-31 10:11:03 | 显示全部楼层
osgManipulator里用了一个方法,在线段外面套一个不绘制的圆柱,线用于绘制,圆柱用于拾取
不算是好办法,只是在一些特殊情况下的取巧的思路吧

该用户从未签到

发表于 2009-12-31 10:23:24 | 显示全部楼层
的确不是好办法。其实线段的拾取我这里已经实现了,这里给出几点提示:
1、使用osg::TemplatePrimitiveFunctor来遍历几何体中所有存在的线段
2、一般我们不可能直接正好选取到某个线段,因此需要计算求交射线和线段的公垂线距离,并找出最小的,这有现成的公式可循
3、视点与线段的距离远近,会影响选取这条线段的精度,这个时候可以使用computePixelSizeVector计算出空间距离与屏幕像素的比例,并加以运用

该用户从未签到

 楼主| 发表于 2009-12-31 13:02:07 | 显示全部楼层
osg::TemplatePrimitiveFunctor 没有这个函数?

该用户从未签到

 楼主| 发表于 2009-12-31 13:03:39 | 显示全部楼层
感觉osg中的拣选算法效率比较低啊  是硬遍历的吧

该用户从未签到

 楼主| 发表于 2009-12-31 13:07:42 | 显示全部楼层
线段拣选算法已经写了  我能想到的最快的了  是AABB_tree   不过AABB_tree的数据是静态的  我需要动态添加线段的话就要重建树,线段达到4W的时候重建树要10几秒,难以忍受啊。 请教一下有没有更好点的算法,谢谢!

该用户从未签到

 楼主| 发表于 2009-12-31 13:09:51 | 显示全部楼层
不好意思  找到TemplatePrimitiveFunctor了  呵呵  我看看有帮助没?  先谢谢了

该用户从未签到

发表于 2009-12-31 15:01:08 | 显示全部楼层
线段还麻烦了~~

该用户从未签到

发表于 2009-12-31 15:07:24 | 显示全部楼层
TemplatePrimitiveFunctor当然是有的,并且十分实用

osg中的拣选算法效率比较低?我倒不这么认为,遍历BVH树和并对节点的AABB盒进行粗裁减,然后再作具体运算,这样效率相当不错了;再加上KdTree的支持,就足够适应大部分场合的运算速度要求了。

此外看您的回帖,我认为您并没有把自己的问题解释清楚,或者您擅自将问题简化并略去了一些关键的需求或实现步骤,因而造成了讨论者的混乱

该用户从未签到

 楼主| 发表于 2009-12-31 15:20:22 | 显示全部楼层
osg中的拣选还仔细看   请问如果去拣选一个模型 是不是模型上的三角形都要去做一次BoundingBox判断?

该用户从未签到

发表于 2009-12-31 16:15:15 | 显示全部楼层
如果这个模型的包围盒与射线存在交点,那么所有的三角形都会直接运算;三角形是没有BoundingBox的。BVH树的场景结构会保证绝大部分场景中的模型都不会参与计算,因此效率会很高
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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