查看: 1208|回复: 17

pick点击模型问题;求好心人帮帮忙

[复制链接]

该用户从未签到

发表于 2013-12-26 17:40:47 | 显示全部楼层 |阅读模式
我现在呢,想通过点击模型,然后输出 点击模型的 模型名字...   
    如图:     不知道为什么是这样子?
   难道我的遍历只是搜索当前点击下去的节点的子节点,而被点击节点的父节点以及这个 父节点的其他子节点都没有遍历吗?
      
  求解,,,╮(╯▽╰)╭..坐等解答,谢谢各位..求帮助啊啊啊啊~!

代码,遍历节点,是否点击到了.

代码,遍历节点,是否点击到了.

点击模型后的输出..╮(╯▽╰)╭...

点击模型后的输出..╮(╯▽╰)╭...

该用户从未签到

发表于 2013-12-26 17:53:11 | 显示全部楼层
至少你应该给出你的树结构。不然你的结果不能提供任何辅助作用。

该用户从未签到

 楼主| 发表于 2013-12-26 18:11:00 | 显示全部楼层
justwww 发表于 2013-12-26 17:53
至少你应该给出你的树结构。不然你的结果不能提供任何辅助作用。

图已发,麻烦帮忙看下;~!

11111

11111

该用户从未签到

发表于 2013-12-27 17:15:31 | 显示全部楼层
点击 求交后 可以获取节点信息……
你代码不是遍历所有求教模型然后打印输出了吗

该用户从未签到

发表于 2013-12-27 17:26:44 | 显示全部楼层
nd->getName () 就是string 类型,后面还加个data()这是干什么?
请参看:OSG object类的getName ()方法返回类型

该用户从未签到

 楼主| 发表于 2013-12-27 20:37:46 | 显示全部楼层
VR_user_happy 发表于 2013-12-27 17:26
nd->getName () 就是string 类型,后面还加个data()这是干什么?
请参看:OSG object类的getName ()方法返 ...

麻烦帮忙看下,
   我通过 setname("箱子1");改变了我的模型名字;但是  Box001;和 box001 geode  是什么?其他节点还是?
   以及,为什么会输出两次呢?  是我点击速度慢,而程序一直在扫描吗?
  如何做到 只输出一个 名字呢。。 比如 点击下,就输出箱子1,把   Box001;和 box001 geode屏蔽掉
QQ图片20131227203208.jpg
QQ图片20131227203240.jpg

该用户从未签到

 楼主| 发表于 2013-12-27 20:38:09 | 显示全部楼层
亦舒雪 发表于 2013-12-27 17:15
点击 求交后 可以获取节点信息……
你代码不是遍历所有求教模型然后打印输出了吗

烦请看下七楼。。

该用户从未签到

发表于 2013-12-27 21:09:26 | 显示全部楼层
他是遍历每个节点,你点击了几次就变量几遍
如你前面的所写
加个IF判断呀,再把那个带data去掉!
   if (nd->getName()=="sssss")
        qDebug()<< nd->getName();
SSS为模型名称,其他的打印都不要;

该用户从未签到

 楼主| 发表于 2013-12-27 22:42:26 | 显示全部楼层
VR_user_happy 发表于 2013-12-27 21:09
他是遍历每个节点,你点击了几次就变量几遍
如你前面的所写
加个IF判断呀,再把那个带data去掉!

....我也很想这样啊,可是  有没有不用if的办法?
  如果 有1000个节点呢?  那么if1000次? 这样太耗时间了。求解。。。

该用户从未签到

 楼主| 发表于 2013-12-27 22:44:56 | 显示全部楼层
VR_user_happy 发表于 2013-12-27 21:09
他是遍历每个节点,你点击了几次就变量几遍
如你前面的所写
加个IF判断呀,再把那个带data去掉!

去掉 <<  就会显示 没有与这些操作符匹配的 “<<”  这事我也很纳闷啊!

该用户从未签到

 楼主| 发表于 2013-12-27 22:49:01 | 显示全部楼层
VR_user_happy 发表于 2013-12-27 21:09
他是遍历每个节点,你点击了几次就变量几遍
如你前面的所写
加个IF判断呀,再把那个带data去掉!

你看,我这样写 的确是可以的,。。。
  但是如果有1000个模型,,
我写1000个if?
123456.jpg
1234567.jpg

该用户从未签到

发表于 2013-12-28 13:47:25 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-12-28 13:48 编辑

这与你的场景组织有关,你要知道它再那一级下,就不用比较每个名称.
比方说
root->setName("root")
root->addChild(osgDB::readNodeFile("Box1"));
root->addChild(osgDB::readNodeFile("Box2"));

再输出时只需要验证它的父节点名称就可以了
if(nd->getParent(0)->getName=="root")
qDebug << nd->getName();

该用户从未签到

 楼主| 发表于 2013-12-28 16:26:26 | 显示全部楼层
VR_user_happy 发表于 2013-12-28 13:47
这与你的场景组织有关,你要知道它再那一级下,就不用比较每个名称.
比方说
root->setName("root")

哪一级?
   那么我怎么区分这个哪一级呢?
   能不能指点下,告诉我这个节点的组成方式,以及我的 qDebug()<< nd->getname();  输出的 除了模型的名字为什么还有其他节点信息?
  是不是一切都是从computeIntersections(_x,_y,intersections);  这个函数有关? 毕竟我的迭代器访问的是nodepath():的信息,然而这个东西怎么回事?
     其他的东西到底哪里来的呢?
  可不可以告诉我下,这方面的不足我该去看哪些书籍?或者 书籍的那一章节?

该用户从未签到

 楼主| 发表于 2013-12-28 17:29:16 | 显示全部楼层
VR_user_happy 发表于 2013-12-28 13:47
这与你的场景组织有关,你要知道它再那一级下,就不用比较每个名称.
比方说
root->setName("root")

osgUtil:ineSegmentIntersector::Intersections intersections;
请问,这个到底是什么东西呢?
根据程序,这是一个 容器,然后这个容器里面还有一个容器,这到底存储的是什么?
  能解答下吗?
    因为我的遍历分两层->为什么会分两层?  请问下?
   这个代码大部分都是书上的,自己只是更改了一些;

该用户从未签到

 楼主| 发表于 2013-12-28 17:48:23 | 显示全部楼层
VR_user_happy 发表于 2013-12-28 13:47
这与你的场景组织有关,你要知道它再那一级下,就不用比较每个名称.
比方说
root->setName("root")

其实,我最根本上想问的是~!

void pickModel(float _x, float _y)
        {
                osgUtil:ineSegmentIntersector::Intersections intersections;
                if(m_Viewer-> computeIntersections(_x,_y,intersections))
                {            
                        auto _iter = intersections.begin();
                        while(_iter != intersections.end())
                        {      
                                auto _nodeIter = _iter->nodePath.begin();
                                while(_nodeIter != _iter->nodePath.end())
                                {
                                osg::Node *nd =*_nodeIter;

                                          qDebug() <<         nd->getName().data();
                               
                                  _nodeIter++;
                                }
                                    _iter++;                               
                        }
                }


这算代码里, 为什么还要有一个 nodepath?  如果说 我们的 intersections 是一个容器,存储了,我点下去的 三维坐标系,三个点, X,Y,Z方向. 那么 我们的迭代器在传入 x,y后可以  遍历Z,这个Z是深度. 那么  nodepath到底是什么?]

麻烦能告知下吗?
  好人一生平安,谢谢~!

该用户从未签到

发表于 2013-12-28 17:55:55 | 显示全部楼层
就是你的所选中模型向上层次的目录树层次!
你不妨把场景中的每个NODE都设定一个名词,然后再打印出来看,就知道它到底是个什么东东了!
还有你还是看看关于OSG场景节点组织基本概念再来体验这些!(在网上搜一下吧)

该用户从未签到

 楼主| 发表于 2013-12-28 21:43:42 | 显示全部楼层
VR_user_happy 发表于 2013-12-28 17:55
就是你的所选中模型向上层次的目录树层次!
你不妨把场景中的每个NODE都设定一个名词,然后再打印出来看, ...

好的,谢谢;
但是为什么会输出两次呢?
  是不是因为有一个 叶节点 和两个子节点相关联在一起?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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