查看: 2401|回复: 5

array及各位大侠 ,求助firebreath+osg 的pick问题

[复制链接]

该用户从未签到

发表于 2013-7-26 14:12:53 | 显示全部楼层 |阅读模式
本帖最后由 dlhuaan 于 2013-7-26 14:17 编辑

array、各位大侠:

看了你的cookbook中 firebreath+osg 第二个例子,下面是我对该例子的理解:
例子中利用CommandHandler 从“UI(我理解就是firebreath)线程”发送给“osg渲染线程(仅在GUIEventAdapter::FRAME操作 )”指令command。
该command是线程间共享的,会产生读写冲突,所以采用command buffer机制在两个线程中传递command。
---------------------------------------------------------------------------------------------------------------------------------
问题1:
现在我用pick(即computeIntersections),不存在command传递问题,firebreath还是崩溃了,下面是添加在你的例子2源代码中的测试代码:


virtual bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
        {
                if ( ea.getEventType()!=osgGA::GUIEventAdapter::FRAME )
                        return false;

                std::vector<std::string> localCommands;
                {
                        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);
                        localCommands.swap( commands );//清空commands
                 
                }

                osgViewer::View* view1 = static_cast<osgViewer::View *>( &aa );
                if ( view1  )
                {

                                for ( unsigned int i=0; i<localCommands.size(); ++i )
                                {
                                        osgUtil:ineSegmentIntersector::Intersections intersections;
                                        if (view1->computeIntersections(400, 300, intersections))
                                        {
                                        }
                                }
                         
                }

                return false;
        }


        只要一运行view1->computeIntersections(400, 300, intersections),程序就通过不了,

        就算是加上

        {
                                OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex);
                                osgUtil::LineSegmentIntersector::Intersections intersections;
                                        if (view1->computeIntersections(400, 300, intersections))
                                        {
                                        }

        }
也不行,问题出在哪?求思路?
-----------------------------------------------------------------------------------------------
问题2:
firebreath+osg程序,要修改osg中数据,如addchild、removechild等,非得在GUIEventAdapter::FRAME中吗?

论坛里也有别的用户问过类似问题,个人觉得pick问题不解决很约束firebreath+osg的使用。


该用户从未签到

发表于 2013-8-4 17:46:02 | 显示全部楼层
首先我不认为这事情和FireBreath有关,我实时上是基于它写了一个完整的基于OSG的框架的,其中当然包含对各种pick操作的封装。

您不妨试验一下自己的程序在独立窗口中能不能运行。至于修改数据,正如我所给出的,只要能保证线程的安全性,在任何地方都是可以的

该用户从未签到

发表于 2013-9-15 15:48:12 | 显示全部楼层
楼主,请问你的问题解决没?我遇到了一样的问题

该用户从未签到

 楼主| 发表于 2013-9-17 17:10:08 | 显示全部楼层
没有。array 给的方法可能有用,但最近没时间。

该用户从未签到

发表于 2016-3-18 10:46:18 | 显示全部楼层
xuhaiyan8825 发表于 2013-9-15 15:48
楼主,请问你的问题解决没?我遇到了一样的问题

这个问题要怎么解决呀???

该用户从未签到

发表于 2016-3-21 17:47:17 | 显示全部楼层
array 发表于 2013-8-4 17:46
首先我不认为这事情和FireBreath有关,我实时上是基于它写了一个完整的基于OSG的框架的,其中当然包含对各 ...

数组哥,这个问题,问的人比较多,都是怎么解决的呀。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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