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个参数是类型为osg::RenderInfo的引用。osg::RenderInfo是渲染信息类。这个类负责保存和管理与场景绘制息相关的几个重要数据:当前场景的视景器、当前场景对应的所有摄像机、以及当前osg::State对象。这些数据将在场景筛选和渲染时为 OSG 系统后台的工作提供重要依据,并从中取出跟踪此图形上下文的当前OpenGL状态的State对象。可以说,需要涉及绘制有关的视景器、场景类、状态类、摄像机类都可以从渲染信息类对象获取到。
-
第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);spRoot->addChild(pGeode);viewer.setSceneData(spRoot);return viewer.run();
}
上面的例子,绘制一个三维字符串,最开始时候,字符串是“0”,然后调用三维字符对象的setDrawCallback方法,安装一个CUpdateTextValue绘制回调类对象,在回调类中的drawImplementation函数,根据两帧之间的时间间隔是否大于20ms,从而绘制不同值,效果如下:

说明:
本例因为较简单,第1个参数即渲染信息对象没用上,现实中的业务比较复杂,会涉及到场景、视景器、相机等对象,这些都可以通过第1个参数表示的渲染信息对象获取到。本例用到字体,需要编译freetype到osg,作为osg的插件,否则字符串不会显示。请从
FreeType Downloads
下载freetype。关于如何编译字体作为osg的插件,请参照
osg第三方插件的编译方法(以jpeg插件来讲解) 博文。
相关文章:
osg::Drawable类通过setDrawCallback函数设置回调函数的说明
osg::Drawable类可以通过该类的setDrawCallback函数设置回调函数类对象。被设置的回调类对象必须从osg::Drawable::DrawCallback类派生,并重写drawImplementation函数,以实现自己特定的需求。这个回调函数在每次帧事件中都会被调用(如:在帧的…...
Python基础合集 练习17(类与对象)
class Dog: pass papiDog() print(papi) print(type(papi)) 构建方法 创建类过后可以定义一个特殊的方法。在python中构建方法是__init__(),init()必须包含一个self参数 class pig(): #def__init__(self) -> None: print(‘你好’) pipgpig() 属性和方法 cl…...
再多猜一次就爆炸(小黑子误入)
目录 猜数字游戏 游戏设计思路 1.电脑随机生成一个数 2.猜数字 3.输入我是ikun,泰裤辣! 否则电脑将在一分钟后关机 游戏运行效果 源码 代码分析 代码实现关键语句 strcmp() rand()与srand() 时间戳time() 寄语 猜数字游戏 游戏设计思路 1.电脑随机生…...
图像超分辨率简单介绍
文章目录 图像超分辨率简单介绍什么是图像超分辨率?常见的图像超分辨率算法插值算法基于边缘的图像重建算法局部线性嵌入(LLE)拉普拉斯正则化 基于深度学习的超分辨率算法超分辨率CNN超分辨率GAN 步骤1. 收集数据2. 选择算法3. 训练模型4. 测…...
【Liunx】进程的程序替换——自定义编写极简版shell
目录 进程程序替换[1~5]1.程序替换的接口(加载器)2.什么是程序替换?3.进程替换的原理4.引入多进程5.系列程序替换接口的详细解析(重点!) 自定义编写一个极简版shell[6~8]6.完成命令行提示符7.获取输入的命令…...
c++标准模板(STL)(std::array)(三)
定义于头文件 <array> template< class T, std::size_t N > struct array;(C11 起 std::array 是封装固定大小数组的容器。 此容器是一个聚合类型,其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组…...
c#笔记-创建一个项目
创建一个项目 创建控制台程序 在你安装完成Visual Studio后打开它,你会的到一个启动窗口 点击创建新项目,选择右上角c#的没有Framework的控制台应用。 项目名称,位置自己随意。 目标框架选择NET7.0。 项目创建完成后应该你的界面应该类似…...
Photoshop如何使用图像调色之实例演示?
文章目录 0.引言1.将一张偏冷调的图像调整成暖调2.将图像调整成不同季节色彩倾向3.变换花朵的颜色4.创建人像轮廓风景5.修饰蓝天白云6.调换花草颜色 0.引言 因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其配…...
IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。
IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。 问题背景: 在IDEA中,使用Git提交代码到远程仓库时,结果弹出一个警告窗口 问题原因: …...
ArduPilot之开源代码LibrarySketches设计
ArduPilot之开源代码Library&Sketches设计 1. 简介1.1 Core libraries1.2 Sensor libraries1.3 Other libraries 2. 源由3. Library Sketches设计3.1 设计框架3.2 Example Sketches3.3 AP_Common Sketches3.3.1 配置sitl环境3.3.2 编译AP_Common3.3.3 运行AP_Common3.3.4 代…...
第一章:概述
1,因特网概述 1.网络、互联网和英特网 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。 多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)。因此,互联网是“网络的网络…...
MySQL --- DDL图形化工具表结构操作
一. 图形化工具 1. 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句,在我们编写这些SQL时,都是在命令行当中完成的。大家在练习的时候应该也感受到了,在命令行当中来敲这些SQL语句很不方便,主要的原因有以下 3 点:…...
归一化处理(2023寒假每日一题 14)
在机器学习中,对数据进行归一化处理是一种常用的技术。 将数据从各种各样分布调整为平均值为 0 0 0、方差为 1 1 1 的标准分布,在很多情况下都可以有效地加速模型的训练。 这里假定需要处理的数据为 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1,a_2,⋯…...
无公网IP,外网远程连接MySQL数据库
哈喽~大家好,这篇来看看无公网IP,外网远程连接MySQL数据库。 文章目录 前言1. 检查mysql安装状态2. 安装配置cpolar内网穿透3. 创建tcp隧道,映射3306端口4. 公网远程连接4.1 图形化界面4.2 使用命令行远程连接 5. 配置固定tcp端口地址5.1 保留…...
OJ刷题 第十四篇(递归较多)
23204 - 进制转换 时间限制 : 1 秒 内存限制 : 128 MB 将一个10进制数x(1 < x < 100,000,000)转换成m进制数(2< m < 16) 。分别用 ABCDEF表示10以上的数字。 输入 x m (1 < x < 100,000,000, 2< m < 16) 输出 m进制数 样例 输入 31 16 输出 1F 答…...
FileZilla读取目录列表失败(vsftpd被动模式passive mode部署不正确)
文章目录 现象问题原因解决方法临时解决(将默认连接方式改成主动模式)从根本解决(正确部署vsftpd的被动模式) 现象 用FileZilla快速连接vsftpd服务器时,提示读取目录列表失败 问题原因 是我vsftpd服务端的被动模式没…...
【Java面试八股文】数据库篇
导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式牛客面试题 目录 请你说说MySQL索引,以及它们的好处和坏处 请你说说MySQL的索引是什么结构,为什么不用哈希表 请你说说数据库索引的底…...
Android Glide加载图片、网络监听、设置资源监听
再搞事情之前首先创建一个项目,就命名为GlideDemo吧。 一、项目配置 创建好之后,在app模块下build.gradle的dependencies闭包中添加如下依赖: //glide//glideimplementation com.github.bumptech.glide:glide:4.11.0annotationProcess…...
等保定级报告模版
等保定级怎么做_luozhonghua2000的博客-CSDN博客 上篇给大家说清楚了,等保定级怎么做,但在日常工作中,需要向上级或甲方输出定级报告,这篇我降弄个模版供大家参考。 信息系统安全等级保护定级报告 XX 平台系统描述 (一) 2023年5月,XX 正式上线,XX 隶属于深圳 XX 科技…...
计算机组成原理4.2.2汉明码
编码的最小距离 奇校验和偶校验 看1的个数是奇数 还是偶数 汉明码 汉明码的配置 根据不等式,确定增添几位,根据指数放置增添位 汉明码的检错 分不同检测小组 分组规则:哪位为’1‘就是哪组元素。 1号位为‘1’的都是第一组元素&#…...
期刊名称智能缩写工具Journal Abbrev:解放科研文献管理自动化
1. 项目概述与核心价值 如果你是一名科研工作者、学术编辑,或者经常需要处理参考文献,那么“期刊名称缩写”这件事,绝对是你学术生涯中一个不大不小、但又极其磨人的痛点。想象一下,你正在撰写一篇论文,需要引用几十篇…...
AI协同编程:从代码生成到项目级开发的智能辅助实践
1. 项目概述:当AI成为你的技术合伙人最近在GitHub上看到一个挺有意思的项目,叫“ai-cofounder”。光看名字就挺吸引人,AI联合创始人?这听起来像是科幻电影里的情节。但点进去仔细研究后,我发现,这其实是一个…...
AI求职分身实战:基于WebSocket Hook与Spring Boot的自动化招聘系统
1. 项目概述:当AI成为你的求职分身最近在折腾一个挺有意思的开源项目,叫“AI工作猎手”。简单来说,它就是一个能帮你自动和Boss直聘上的HR聊天的工具。你可能会想,这不就是个自动回复机器人吗?没错,但它的核…...
Deep Agent全解析:为什么普通Agent只能“浅尝辄止”,而Deep Agent能真正干复杂活?
一、先说结论:Deep Agent到底是什么?Deep Agent,直译叫“深度智能体”,你可以把它理解成:不是只会调用一个工具、回答一个问题的普通Agent,而是能围绕一个复杂目标,自己拆任务、查资料、调用工具…...
腾耀文旅集团:十三年深耕企业游学赋能,非标靠谱,性价比高,值得推荐
近日,在企业商务游学与高端会务服务领域,**腾耀文旅集团(腾耀旅行)**凭借十三年专业积淀与一站式定制服务能力,成为保险、直销、美业、大健康、金融、区块链等多行业企业的优选合作方。作为专注企业游学赋能、精品出游…...
GE Eager Style Graph Builder类关系文档
Eager Style Graph Builder 类关系文档 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供…...
Rewardful vs PartnerShare:2026 联盟营销管理追踪软件对比指南
选择合适的联盟营销管理系统,能让SaaS企业在2026年的增长竞争中事半功倍。Rewardful和PartnerShare分别是海外与国内市场备受关注的两款工具,本文将从功能、定价、支付集成等维度进行全方位对比,帮你快速做出最适合业务阶段的选择。一、什么是…...
lvgl_v8之基于arc实现一个交易成功动画
static lv_obj_t* widget_check_line; static lv_point_t widget_check_points[3]; static const lv_point_t widget_check_full_points[...
AI赋能非洲医疗:疾病预测模型落地实战与挑战解析
1. 项目概述:当AI遇见非洲医疗的十字路口“AI赋能非洲医疗”,这个标题背后,远不止是一个技术应用的故事,它更像是一场在资源、文化与技术之间寻找平衡点的深刻实践。作为一名长期关注技术落地与全球健康议题的从业者,我…...
超级个体崛起:一人公司(One-Person Company)的技术栈——软件测试从业者的全能武器库
在AI重构生产关系的2026年,“一人公司”已从概念变为触手可及的商业现实。对于深谙质量保障、逻辑严谨且具备工程化思维的软件测试从业者而言,这不仅是职业发展的备选路径,更是一次将“技术债”转化为“数字资产”的价值跃迁。当“单人成军”…...
