查看: 2936|回复: 6

求教-如何拾取osg::Drawable的对象

[复制链接]

该用户从未签到

发表于 2011-7-23 23:29:32 | 显示全部楼层 |阅读模式
问题:为什么用osg:rawable画茶壶,拾取不到? 请各位高手教我!

情况如下:
class Teapot : public osg::Drawable
{
        virtual void drawImplementation(osg::RenderInfo&) const
        {
           //openGL代码画茶壶
            teapot(14,GL_FILL);
        }

}

我用这个类借助opengl函数画了个茶壶,
在 main()
{
      osg::ref_ptr< Teapot > teapot=new  Teapot ();     //创建茶壶 osg::Drawable对象
      osg::ref_ptr<CMyGeode> geode = new CMyGeode();  //创建个叶子节点

      geode->addDrawable( teapot );
      root->addChild(geode);
      viewer.setSceneData( root );


}
然后是osg教程上class PickHandler那个拾取对象的类

这样茶壶是显示出来了,但却拾取不到,
if (view->computeIntersections(x, y, intersections))  //这个if根本进不去
{
}

所以想问:为什么?是不是用了osg::Drawable画茶壶,才拾取不到的?
如果直接是个geode读个牛进来,是可以拾取并加白边显示

该用户从未签到

发表于 2011-7-25 10:39:06 | 显示全部楼层
自定义Drawable需要实现Drawable::accept(PrimitiveFunctor&)等接口,才能支持OSG内部的求交、拣选等算法

该用户从未签到

发表于 2011-7-25 10:42:43 | 显示全部楼层
Teapot 的是做了一个如何在osg中嵌入OpenGL的示例,teapot 函数里面可以看到。
直接调用OpenGL API进行渲染的物体应该是无法用 osg 的 intersection 进行拾取操作的
并不是说osg::drawable 画茶壶才拾取不到的,
geode读一个牛进来其实内部也是进行了很多的 geode->adddrawable 等等一系列的操作
打开 cow.osg 或者 cow.osgt 可以看到 里面有 类似 “Drawables ”这样的描述

该用户从未签到

 楼主| 发表于 2011-7-25 13:28:55 | 显示全部楼层
谢谢各位高手指点方向,如拨云见雾,让我知道下一步怎么做,要研究研究Drawable::accept(PrimitiveFunctor&)接口

该用户从未签到

发表于 2011-7-25 23:29:11 | 显示全部楼层
要研究研究Drawable::accept(PrimitiveFunctor&)接口
可以这么做,总之您需要让osg的求交器能够从您的类中获取点和图元信息

该用户从未签到

发表于 2012-11-26 16:21:45 | 显示全部楼层
liukaiosg 发表于 2011-7-25 13:28
谢谢各位高手指点方向,如拨云见雾,让我知道下一步怎么做,要研究研究Drawable::accept(PrimitiveFunctor& ...

你好,请问你这个问题解决了吗?能否分享一下是如何实现的,最好能贴一下你实现的代码,谢谢

该用户从未签到

发表于 2012-11-27 08:10:49 | 显示全部楼层
smengq 发表于 2012-11-26 16:21
你好,请问你这个问题解决了吗?能否分享一下是如何实现的,最好能贴一下你实现的代码,谢谢

osg::ShapeDrawable 就是最好的实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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