查看: 3958|回复: 7

请教关于DrawCallback

[复制链接]

该用户从未签到

发表于 2008-4-17 10:08:16 | 显示全部楼层 |阅读模式
我想利用OPENGL画一条轨迹,这个轨迹是动态变化的,时间越长,轨迹数组里的点就越多。
画就很简单了,利用glBegin(GL_LINE_STRIP)画出数组里的所有数据就可以了。

想利用OPENGL语句画的话,可以利用drawable类的drawImplementation()函数
或者利用DrawCallback回调函数,但是在这两个里面好像都不能满足上面的要求,
我用代码测试了一下,好像DrawCallback回调函数只调用了一次。

请教,我该如何做才能实现动态的画轨迹,谢谢。

该用户从未签到

 楼主| 发表于 2008-4-17 15:48:34 | 显示全部楼层
我测试了例子osgteapot中的drawImplementation与例子osgcallback中的DrawableDrawCallback中的drawImplementation,两个函数在程序运行过程中只被调用了一次。
所以这两个方法并不能满足动态的修改轨迹的要求。
请大侠出手相助,给个建议阿。
谢谢。

该用户从未签到

 楼主| 发表于 2008-4-17 18:22:36 | 显示全部楼层
以下代码摘自Drawable.cpp:

   globj = generateDisplayList(contextID, getGLObjectSizeHint());
    glNewList( globj, GL_COMPILE );

    if (_drawCallback.valid())
        _drawCallback->drawImplementation(renderInfo,this);
    else
        drawImplementation(renderInfo);

    glEndList();

可以看到不管是Drawable本身的drawImplementation,还是drawCallback的drawImplementation都是被编译进显示列表中了,也就说只会被调用一次。

该用户从未签到

发表于 2008-4-17 18:45:57 | 显示全部楼层
一定要关闭显示列表的话,可以使用osg:: Drawable:: setUseDisplayList函数。这样OSG会采用直接绘制的方式,不过个人认为这样无异于杀鸡取卵~~

如果要绘制动态增加的轨迹线的话,个人觉得使用Geometry类是可以完成要求的,注意要在setEventCallback中完成添加点的工作(可以直接修改控制顶点数据的Vec3Array指针的内容,很方便)
此外如果显卡支持的话,还建议osg:: Drawable:: setUseVertexBufferObjects,设置使用VBO提高渲染性能

该用户从未签到

 楼主| 发表于 2008-4-17 18:53:32 | 显示全部楼层
问题终于解决了,对drawable对象调用setSupportsDisplayList(false),让它不生成displaylist,则drawCallback的drawImplementation会被不停的调用。

该用户从未签到

 楼主| 发表于 2008-4-17 19:03:06 | 显示全部楼层
谢谢。

[ 本帖最后由 wontor 于 2008-4-17 20:46 编辑 ]

该用户从未签到

发表于 2008-4-18 00:32:07 | 显示全部楼层
原帖由 wontor 于 2008-4-17 18:53 发表
问题终于解决了,对drawable对象调用setSupportsDisplayList(false),让它不生成displaylist,则drawCallback的drawImplementation会被不停的调用。


呵呵,不过我个人觉得关闭显示列表并不是一个好方法,随着轨迹点的增加,速度的减慢会越来越难以忍受的。
建议还是使用Geometry类,以及试一试VBO

该用户从未签到

 楼主| 发表于 2008-4-18 09:11:46 | 显示全部楼层
原帖由 array 于 2008-4-18 00:32 发表


呵呵,不过我个人觉得关闭显示列表并不是一个好方法,随着轨迹点的增加,速度的减慢会越来越难以忍受的。
建议还是使用Geometry类,以及试一试VBO


首先感谢你的帮助,但是我在geometry中的EventCallback中做了以下的事情:
class drawableEventCallback : public osg:rawable::EventCallback
{
    virtual void event(osg::NodeVisitor* nv, osg::Drawable* drawable)
    {
                osg::Vec3Array* vertices = (osg::Vec3Array*)(drawable->asGeometry()->getVertexArray());
                static int i=0;
        vertices->push_back(osg::Vec3(i*0.001f,i*0.001f,1.259541));
                i++;
        std::cout<<"i = "<<i<<std::endl;
                drawable->asGeometry()->setVertexArray(vertices);
        std::cout<<"num = "<<vertices->size()<<std::endl;
    }
};

也进行了如下设置:
setUseVertexBufferObjects(true);
结果显示vertices的size()的确在增加,但显示的结果并没有发生变化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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