查看: 4730|回复: 13

关于pick的一个问题

[复制链接]

该用户从未签到

发表于 2008-4-28 11:00:37 | 显示全部楼层 |阅读模式
osgpick的例子中
if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))成立的话,程序就pick了一个node
而若else if (hitr->drawable.valid())成立的话,程序就pick了一个drawable
osg:rawable是一个纯虚类,我想知道当程序pick了一个drawable时,这个drawable是什么?
我想实现对包含该drawable的node的颜色进行更新,应该怎么做呢?(使用 Node *  getParent (unsigned int i) 吗?这里面的i表示什么意思?)
我使用hitr->drawable->getParent(0)->getName(),似乎并不能得到drawable父节点的名字,这是怎么回事?

[ 本帖最后由 soda 于 2008-4-28 11:10 编辑 ]

该用户从未签到

 楼主| 发表于 2008-4-28 17:14:09 | 显示全部楼层
版主今天都不在?

该用户从未签到

发表于 2008-4-28 22:11:20 | 显示全部楼层
drawable是一个纯虚类,不可以实例化一个对象。
但是可以以指针的形式来指向其派生类。

该用户从未签到

发表于 2008-4-28 22:23:04 | 显示全部楼层
原帖由 soda 于 2008-4-28 11:00 发表
osgpick的例子中
if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))成立的话,程序就pick了一个node
而若else if (hitr->drawable.valid())成立的话,程序就pick了一个drawable
osg: ...


要知道是什么类型的Drawable,可以使用className()函数,它会直接返回准确的类名称
使用hitr->drawable->getParent(0)->getName()不能得到Geode节点名字的话,要注意您是否给这个节点起了名字?OSG的节点组织结构中,父节点可以有不止一个,Drawable的容器Geode也可以有不止一个,因此我们可以使用getParent(i)来获得指定的某个Geode节点。

至于版主没有及时回答您问题~~非常抱歉,有的时候可能大家的工作比较忙,毕竟我们不是全职在做论坛的维护,所以周日研讨会上有关成立OSG协会的议题我个人还是非常支持的,毕竟可以由专业的团队来替代我们这些业余人士 。同样也非常欢迎时间相对充裕的朋友一同承担起繁荣论坛的职责~~

该用户从未签到

发表于 2008-4-28 22:23:15 | 显示全部楼层
我将osgpick中的代码作了以下修改
            if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))
            {
                // the geodes are identified by name.
                os<<"Object \""<<hitr->nodePath.back()->getName()<<"\""<<std::endl;
            }
            else if (hitr->drawable.valid())
            {
                os<<"drawable \""<<hitr->drawable->className()<<"\""<<std::endl;
            }

结果我在场景中点来点去,显示的都是"Object..........."
所以我想你的
hitr->drawable->getParent(0)->getName()
这句话没有机会被执行,所以看起来不能显示drawable父节点的名字。

该用户从未签到

 楼主| 发表于 2008-4-29 00:13:47 | 显示全部楼层
十分感谢王锐兄和wontor的回复。
呵呵,其实我们这些初学OSG的才是给版主们添了不少麻烦了
回上面wontor兄,我确定自己的程序是执行到了hitr->drawable->getParent(0)->getName()
也许是geode没有名字的原因吧,白天我再看看

该用户从未签到

 楼主| 发表于 2008-4-29 09:46:43 | 显示全部楼层
王锐兄说得不错,我没有给Geode命过名,所以不能得到它的名字。
现在我又对选定的Geometry进行了颜色的更新回调,使用dirtyDisplayList后颜色改变的功能可以实现。
那么如果我选中的一个节点是Node而并不是geometry(比如该node存储着从硬盘上载入的模型),那么应该怎么处理呢?

[ 本帖最后由 soda 于 2008-4-29 09:49 编辑 ]

该用户从未签到

发表于 2008-4-29 12:19:56 | 显示全部楼层
原帖由 soda 于 2008-4-29 09:46 发表
王锐兄说得不错,我没有给Geode命过名,所以不能得到它的名字。
现在我又对选定的Geometry进行了颜色的更新回调,使用dirtyDisplayList后颜色改变的功能可以实现。
那么如果我选中的一个节点是Node而并不是geometr ...


能够直接改变顶点颜色的只有Drawable对象,可以尝试找到节点包含的Drawable对象并改变它的属性~~也可以尝试通过修改节点的渲染属性,例如纹理,光照材质,颜色矩阵等,给这个节点赋予色彩的变化

该用户从未签到

 楼主| 发表于 2008-4-29 12:28:33 | 显示全部楼层
受教了,十分感谢~~~

该用户从未签到

发表于 2011-6-8 09:52:13 | 显示全部楼层
回复 6# soda


    请问拾取的时候如何进行颜色的更新回调的。

该用户从未签到

发表于 2011-6-8 10:53:23 | 显示全部楼层
借贵宝地 问个也是pick的问题。。。
我在osgpick的例子中加了个
  1. geom->addPrimitiveSet(         new osg::DrawArrays( osg::PrimitiveSet::LINES, 0, ptVec3Array->size() ) );
复制代码
画了条线,但是怎么点都没有显示。。。是LINES的原因吗?

该用户从未签到

发表于 2011-6-10 09:07:47 | 显示全部楼层
木有人回答,昨天论坛崩溃了。。。

该用户从未签到

发表于 2011-6-10 13:09:52 | 显示全部楼层
您没有给出足够的信息,我判断不了什么

该用户从未签到

发表于 2011-6-10 14:35:39 | 显示全部楼层
线的选中算法可以自己去写一个,这种方法已经很多了,如果线比较细了,用节点求交的方式去判断选中,精度会出问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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