查看: 3446|回复: 20

PlaceNode 拣选问题

[复制链接]

该用户从未签到

发表于 2013-5-29 14:46:36 | 显示全部楼层 |阅读模式
OE PlaceNode加到LOD下面就拣选不到了,谁有什么解决办法吗?

该用户从未签到

发表于 2013-6-10 10:31:39 | 显示全部楼层
在其他节点下可以拣选到吗?

该用户从未签到

发表于 2013-7-11 14:44:22 | 显示全部楼层
我也遇到同样的问题,不知道你的解决没有

该用户从未签到

 楼主| 发表于 2013-7-11 16:39:15 | 显示全部楼层
ysw 发表于 2013-7-11 14:44
我也遇到同样的问题,不知道你的解决没有

需要更改节选里aplay(LOD)部分

该用户从未签到

发表于 2013-7-11 16:49:23 | 显示全部楼层
我是新手级菜鸟,能不能说的明白些,非常感谢

该用户从未签到

 楼主| 发表于 2013-7-11 17:49:40 | 显示全部楼层
ysw 发表于 2013-7-11 16:49
我是新手级菜鸟,能不能说的明白些,非常感谢

重写 IntersectionVisitor 的 lod
可参考里面apply(PageLOD)

该用户从未签到

发表于 2013-7-11 17:53:52 | 显示全部楼层
好的,谢谢,以后有啥问题望多指导啊

该用户从未签到

发表于 2013-7-13 14:17:06 | 显示全部楼层
我想问他一下,如果重写好了IntersectionVisitor 改写了apply部分,但是怎么让我的方法起作用,我写好的类,应该交给那个类

该用户从未签到

发表于 2013-7-13 14:23:31 | 显示全部楼层
我重写好了是不是 把重写好的射线求交的方法用accept 交个lod节点

该用户从未签到

发表于 2013-7-15 15:02:02 | 显示全部楼层
上面的方法我试了,但是我发现,如果场景树中有lod节点存在,不论鼠标点击到lod下面的数据,还是没有点击到lod下面的数据,那个intersectionVisitor关于lod那个部分总是有响应,这样的话,你怎么区分点中物体还是没有点中物体呢。例如lod下面放置个图标,点击球面的任何位置,都有这个节点信息。

该用户从未签到

 楼主| 发表于 2013-7-16 13:15:28 | 显示全部楼层
ysw 发表于 2013-7-15 15:02
上面的方法我试了,但是我发现,如果场景树中有lod节点存在,不论鼠标点击到lod下面的数据,还是没有点击到 ...

当然有响应啦,要不然你改它还有什么意义啊?可仿照下面的pagelod,主要是最后要把你想得到的accept

该用户从未签到

 楼主| 发表于 2013-7-16 13:33:29 | 显示全部楼层
ysw 发表于 2013-7-15 15:02
上面的方法我试了,但是我发现,如果场景树中有lod节点存在,不论鼠标点击到lod下面的数据,还是没有点击到 ...

我理解错了,你把你该的发上来看一下吧

该用户从未签到

发表于 2013-7-16 17:10:45 | 显示全部楼层
bigboy 发表于 2013-7-16 13:33
我理解错了,你把你该的发上来看一下吧

#include<osgosgUtil/IntersectVisitor>

class MyIntersectionVisitor:public IntersectionVisitor
{
        MyIntersectionVisitor();
   
       ~MyIntersectionVisitor();

       virtual void apply(osg:OD& lod);

}

void MyIntersectionVisitor::apply(osg::LOD& lod)
{
      if (!enter(lod)) return;

    traverse(lod);

    leave();
}


我的场景树中是 lod下面挂了一个placeNode 节点,当placeNode 的显示范围只有设置大于0
例如 lod.addchild(placeNode.get(),1,50000);
只要第一个数字设置的不为0,点选的时候就没有placeNode这个节点返回去。

我只是简单继承了他的IntersectionVisitor,然后用camera accept 这个MyIntersectionVisitor
我在apply函数中打了一个断点,我发现,在地球场景中只要有palceNode这个图标显示。无论鼠标是否点击到这个图标,都能跳动断点处。
这样就形成了一个问题,就是我只想在鼠标点中图标是,才调到断点处,这样我才能用这个visitor截取我所需要的信息,但是如果无论我点击地球的那个地方
这个函数都有反应的话,那这个函数获取的信息对我就没啥用了,我没法判断我是否选中物体

该用户从未签到

 楼主| 发表于 2013-7-16 22:51:26 | 显示全部楼层
ysw 发表于 2013-7-16 17:10
#include

class MyIntersectionVisitor:public IntersectionVisitor

将traverse(lod)改掉,可仿照apply(PagedLOD),选取时自己做判断在nodepath里找到你需要的节点(PlaceNode)。你点击到空球上是应该也会进apply(PagedLOD)吧?

该用户从未签到

发表于 2013-7-17 09:55:08 | 显示全部楼层
我点击控球的时候我发现函数也会进apply里面,而且里面有placeNode这个节点信息,这样我如果改写traverse,每次无论点点击控球和点击placeNode,都进去apply,而且lod都有placeNode这个节点信息,我怎么区分返回过来的信息是点中图标的还是点击空球返回的信息

该用户从未签到

 楼主| 发表于 2013-7-17 15:02:36 | 显示全部楼层
if (!enter(lod)) return

该用户从未签到

发表于 2013-7-18 10:48:44 | 显示全部楼层
好的,我试试,谢谢啊

该用户从未签到

发表于 2013-7-18 10:59:04 | 显示全部楼层
void MyIntersectionVisitor::apply(osg:OD& lod)
{
      if (!enter(lod)) return;

    traverse(lod);

    leave();
}

他的关于aplly上的源码都是这样写的,我把后面的traverse(lod)去掉也试了,还是没效果

该用户从未签到

 楼主| 发表于 2013-7-18 11:45:44 | 显示全部楼层
ysw 发表于 2013-7-18 10:59
void MyIntersectionVisitor::apply(osg:OD& lod)
{
      if (!enter(lod)) return;

你调试一下,看lod是不是你点击的lod,如果不是, if (!enter(lod)) return。就直接退出了。如果是才会继续下面的,然后才是你要做的事。

该用户从未签到

发表于 2013-7-18 12:09:04 | 显示全部楼层
我试了一下,如果地球场景中有这个图标显示,我无论点击图标还是点击球面任何一个地方,这个函数返回的lod都是我添加的图标节点所在的lod.我给lod设置了一个名字标示,这个确定是图标lod

该用户从未签到

 楼主| 发表于 2013-7-18 13:30:29 | 显示全部楼层
ysw 发表于 2013-7-18 12:09
我试了一下,如果地球场景中有这个图标显示,我无论点击图标还是点击球面任何一个地方,这个函数返回的lod都 ...

那当然啦,它是在遍历嘛,然后你看enter(lod)的返回值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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