查看: 2175|回复: 8

直线求交

[复制链接]

该用户从未签到

发表于 2012-5-11 19:23:46 | 显示全部楼层 |阅读模式
本帖最后由 garyliyong 于 2012-5-11 20:00 编辑

之前说过osg操纵器,在操纵器(加载一个camera下)和实体重叠的时候,有时候会选不中操纵器,后来我将直线 求交改成多面体求交,有时候还是会出现选不中的时候,这几天静下心来,好好调试了一下代码,发现直线求交后,交点排序有点问题,操纵器默认是以第一个节点路径进行判断,当前有没有选中操纵器,我查看了所有的nodepath后,发现操纵器nodepath有时候会不再第一个,这样就不能拖拽操纵器,其实是有的,我遍历所有的nodepath后,就不会有这个问题了;但是在选择的时候还是会有这个问题,有的时候会选到后面的节点,不知道选择交点里面的排序是如何排的?怎么改进才行?

该用户从未签到

发表于 2012-5-11 20:34:33 | 显示全部楼层

可以考虑从节点命名方面来解决~~~~

该用户从未签到

 楼主| 发表于 2012-5-12 07:25:12 | 显示全部楼层
本帖最后由 garyliyong 于 2012-5-12 07:27 编辑
FlySky 发表于 2012-5-11 20:34
可以考虑从节点命名方面来解决~~~~


请问一下,如何通过节点命名来解决这个问题?因为事先用户并不知道节点的名字,就是想通过pick之后获得节点的名称,然后根据节点的名称,获取几何实体(自己定义的实体类)的相关属性。我觉得可能是直线求交算法中,所有的交点排序有时会有点问题,操纵器就是明显的例子。在大量实体的情况下进行选择,有时候会选中后面的实体

该用户从未签到

发表于 2012-5-12 09:24:23 | 显示全部楼层
求交之后只取出第一个结果,再从这个结果里获得节点的属性,不行吗?
一般选取的只是要第一个嘛

该用户从未签到

 楼主| 发表于 2012-5-12 11:29:39 | 显示全部楼层
x_wp 发表于 2012-5-12 09:24
求交之后只取出第一个结果,再从这个结果里获得节点的属性,不行吗?
一般选取的只是要第一个嘛

我当然是希望得到第一个,关键是求交返回的第一个,不是场景中的最前面的一个,比如说有两个实体,一个是圆锥,一个是一维操纵器,操纵器(有一个相机保证操纵器永远在圆锥体的前面)在圆锥体的前面,我选择操纵器的时候,两个都已经交到了,但是第一个节点列表却是圆锥,所以选择操纵器失败,而第二个选择列表里包含操纵器

该用户从未签到

发表于 2012-5-12 11:38:59 | 显示全部楼层

你自己对场景合理的管理,首先就确定节点求交的顺序,不就ok了,这个总而言之是对场景的综合管理的问题,跟算法没啥关系~~~~

该用户从未签到

发表于 2012-5-12 20:55:01 | 显示全部楼层
对于求交获得的每个osgUtil::Hit都包含一个交点,根据这些交点,找到离视点最近的osgUtil::Hit应该就是你希望的结果。

该用户从未签到

发表于 2012-5-14 10:03:21 | 显示全部楼层
osgUtil::Hit已经早就过时了,请使用IntersectionVisitor和LinesegmentIntersector

该用户从未签到

 楼主| 发表于 2012-5-14 13:07:01 | 显示全部楼层
array 发表于 2012-5-14 10:03
osgUtil::Hit已经早就过时了,请使用IntersectionVisitor和LinesegmentIntersector

我就是用的这两个线段求交来计算的,在pick的时候有时会选到后面的,算法我也详细看过了,对于同一物体它会按照计算的r值进行排序,但两个实体重叠的时候,排序就是按照求交访问器遍历的顺序排序的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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