osg::Drawable类通过setDrawCallback函数设置回调函数的说明

这篇具有很好参考价值的文章主要介绍了osg::Drawable类通过setDrawCallback函数设置回调函数的说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       osg::Drawable类可以通过该类的setDrawCallback函数设置回调函数类对象。被设置的回调类对象必须从osg::Drawable::DrawCallback类派生,并重写drawImplementation函数,以实现自己特定的需求。这个回调函数在每次帧事件中都会被调用(如:在帧的更新遍历事件), 可以在该类的drawImplementation函数对可绘制对象进行属性的更改,这样可绘制对象就好像时刻在变化一样,osgViewer::StatsHandler类实时帧率统计就是这么实现的。osg::Drawable::DrawCallback类定义如下:

struct DrawCallback : public virtual osg::Object
{
   DrawCallback() {}
   DrawCallback(const DrawCallback& org,const CopyOp& copyop):
                Object(org, copyop) {}

   META_Object(osg,DrawCallback);

  /** do customized draw code.*/
   virtual void drawImplementation(osg::RenderInfo& /*renderInfo*/,const osg::Drawable* /*drawable*/) const {}
};

        这个类中最重要的就是虚函数drawImplementation,该函数参数说明如下:

  1. 第1个参数是类型为osg::RenderInfo的引用。osg::RenderInfo是渲染信息类。这个类负责保存和管理与场景绘制息相关的几个重要数据:当前场景的视景器当前场景对应的所有摄像机、以及当前osg::State对象。这些数据将在场景筛选和渲染时为 OSG 系统后台的工作提供重要依据,并从中取出跟踪此图形上下文的当前OpenGL状态的State对象。可以说,需要涉及绘制有关的视景器、场景类、状态类、摄像机类都可以从渲染信息类对象获取到。
  2. 第2个参数就是指向被绘制对象的指针

     下面举例说明,如下代码:

#include<osgViewer/Viewer>
#include<osg/ArgumentParser>
#include<osg/ShapeDrawable>
#include<osgText/Text3D>
#include<osg/Timer>
class CUpdateTextValue : public osg::Drawable::DrawCallback
{
public:
    CUpdateTextValue()
    {
        _lastTimer_t = osg::Timer::instance()->tick();
    }
    virtual void drawImplementation(osg::RenderInfo& renderInfo, const osg::Drawable* drawable) const
    {
        auto pText3D = (osgText::Text3D*)(drawable);

        osg::Timer_t tCurTick = osg::Timer::instance()->tick();
        double delta = osg::Timer::instance()->delta_m(_lastTimer_t, tCurTick);
       
        char szValue[10]{0};
        itoa(_value, szValue, 10);
        if (delta > 20)
        {
            ++_value;
        }
        else
        {
            --_value;
        }

        // 防止越界、溢出
        if (_value >= INT_MAX)
        {
            _value = INT_MAX;
        }
        if (_value <= INT_MIN)
        {
            _value = INT_MIN;
        }

        pText3D->setText(szValue);
        pText3D->drawImplementation(renderInfo);
        _lastTimer_t = tCurTick;
    }
private:

// 注意用mutable修饰符,因为函数是const函数,否则不能对该值修改,下同。
    mutable  osg::Timer_t _lastTimer_t{ 0 };
    mutable  int _value{0};  
};

int main(int argc, char *argv[])
{
    osg::ArgumentParser arg(&argc, argv);
    osgViewer::Viewer viewer(arg);

    auto spRoot = new osg::Group;
    auto pGeode = new osg::Geode;
    
    auto pText3D = new osgText::Text3D;  
    pGeode->addDrawable(pText3D);

    pText3D->setFont("Verdana\\verdana.ttf");
    pText3D->setText(" 0");
    pText3D->setDrawCallback(new CUpdateTextValue);
    pText3D->setUseDisplayList(false); // 这个要最好设置为false,否则对某些可绘制几何体如球体,drawImplementation函数只会调用一次
    spRoot->addChild(pGeode);
    viewer.setSceneData(spRoot);

    return viewer.run();
}

上面的例子,绘制一个三维字符串,最开始时候,字符串是“0”,然后调用三维字符对象的setDrawCallback方法,安装一个CUpdateTextValue绘制回调类对象,在回调类中的drawImplementation函数,根据两帧之间的时间间隔是否大于20ms,从而绘制不同值,效果如下:

osg::Drawable类通过setDrawCallback函数设置回调函数的说明

 说明:

 setUseDisplayList(false); // 这个要最好设置为false,否则对某些可绘制几何体如球体,drawImplementation函数只会调用一次。

      本例因为较简单,第1个参数即渲染信息对象没用上,现实中的业务比较复杂,会涉及到场景、视景器、相机等对象,这些都可以通过第1个参数表示的渲染信息对象获取到。本例用到字体,需要编译freetype到osg,作为osg的插件,否则字符串不会显示。请从

                                    FreeType Downloads

下载freetype。关于如何编译字体作为osg的插件,请参照

osg第三方插件的编译方法(以jpeg插件来讲解)      博文。文章来源地址https://www.toymoban.com/news/detail-433552.html

到了这里,关于osg::Drawable类通过setDrawCallback函数设置回调函数的说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++回调函数 匿名函数,类中的方法做为回调函数

    C++中的回调函数和匿名函数都是函数指针或函数对象的使用形式。下面分别介绍它们的使用方法。 回调函数是一种函数指针,它允许将函数作为参数传递给另一个函数,并在需要时调用它。这种技术通常用于事件处理、异步处理和状态机等应用中。 下面是一个简单的示例,

    2024年02月01日
    浏览(45)
  • C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

    本文主要介绍回调函数的使用,包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:C/C++精进之路 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致

    2024年02月03日
    浏览(39)
  • 理解函数指针和回调函数

    指向函数的指针。比如: 理解函数指针的伪代码 比如,B把自己函数cbkFunc()的地址告诉A,A在运行过程中执行cbkFunc()。则 回调函数:指B的函数cbkFunc(); 注册回调函数:指B把函数cbkFunc()的地址告诉A; 回调:指A在运行过程中执行cbkFunc()。 无头文件.h 为了方便模块A和B写在了一

    2023年04月20日
    浏览(37)
  • 函数指针和回调函数 以及指针函数

    函数指针(Function Pointer): 定义: 函数指针是指向函数的指针,它存储了函数的地址。函数的二制制代码存放在内存四区中的代码段,函数的地址它在内存中的开始地址。如果把函数的地址作为参数,就可以在函数中灵活的调用其它函数。 用途: 函数指针可以用来在运行

    2024年01月21日
    浏览(59)
  • 物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)

    1 代码的流程分析 2 代码的实现 库函数HAL_Init(void)分析: HAL_Delay()系统延时的步骤: 它的实现步骤如下: 1.用变量获得系统时钟源计数器的值 2.获得要延迟时间的参数值 3.比较两者大小,若时钟计数器的值大于要实现延迟的值,就会困在循环里;反之,跳出循环,延时完成。

    2024年02月14日
    浏览(49)
  • 回调函数的简单用例

    ①用MsgInterface_t定义一个结构体s_Lin_MsgInterface,包含两个回调函数成员: ②确定结构体下的回调函数成员的参数: ③传入实参,确定结构体下的回调函数成员的函数名: ④最终回调函数执行的对应函数如下:

    2024年02月14日
    浏览(29)
  • JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念。并且不少。javascript 好比:html 回调函数你们都会用,只是Jquery封装了以后,不能让你们明白回调函数的真正使用。 JS Api 里这样解释:A callback is a function that is passed as an argument to another function and is executed after its parent funct

    2024年02月09日
    浏览(37)
  • 什么是函数回调

    函数回调是一种编程概念,它描述的是这样一个过程:一个函数(称为回调函数)作为参数传递给另一个函数(称为调用函数),当满足一定条件或者在某个特定时刻,调用函数会调用传递过来的回调函数。这种机制允许程序员在编写代码时,能够在不同的上下文中重用函数,

    2024年03月13日
    浏览(39)
  • Java基础:回调函数

    因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和我一样理解能力稍差的人一点帮助. 回调函数的作用其实就是将 需要

    2024年02月04日
    浏览(35)
  • C#回调函数学习1

    回调函数(Callback Function)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。     此定义来自网上; 看一个例子;这是用委

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包