OSG源代码部分剖析(待续)?????????????????????????????

osg解析系列-[osg::osgViewer] (视景器) 1.osgViewer::View中默认有一个主相机,附属相机可以有0~N个。附属相机存在时,主相机负责视图控制,附属相机群负责渲染;附属相机不存在时,主相机即负责视图控制又负责渲染。 阅读详情

class DrawableDrawCallback : public osg::Drawable::DrawCallback

{

       virtual voiddrawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable)const

       {

           std::cout<<"draw call back - pre drawImplementation"<<drawable<<std::endl;

           drawable->drawImplementation(renderInfo);

           std::cout<<"draw call back - post drawImplementation"<<drawable<<std::endl;

       }

};

 

struct DrawableUpdateCallback :public osg::Drawable::UpdateCallback

{

   virtual voidupdate(osg::NodeVisitor*, osg::Drawable* drawable)

   {

       std::cout<<"Drawable update callback "<<drawable<<std::endl;

   }

};

struct DrawableCullCallback : public osg::Drawable::CullCallback

{

   /** do customized cull code.*/

   virtual boolcull(osg::NodeVisitor*, osg::Drawable* drawable, osg::State*/*state*/) const

   {

       std::cout<<"Drawable cull callback "<<drawable<<std::endl;

       return false;

   }

};

osg::Drawable类中:

structEventCallback : public virtual osg::Object

       {

           EventCallback() {}

           EventCallback(const EventCallback&,const CopyOp&) {}

           META_Object(osg,EventCallback);

           virtual void event(osg::NodeVisitor*, osg::Drawable*) {}

       };

――――――――

osg::Drawable::DrawCallback、osg::Drawable::UpdateCallback、osg::Drawable::EventCallback、osg::Drawable::CullCallback、osg::NodeCallback都继承自osg::Object:

struct DrawCallback : public virtual osg::Object{}

struct UpdateCallback : public virtual osg::Object{}

struct EventCallback : public virtual osg::Object{}

struct CullCallback : public virtual osg::Object

class OSG_EXPORT NodeCallback : public virtual Object{}

――――――――――――――――――――

class CameraUpdateCallback : public osg::NodeCallback

{

   virtual voidoperator()(osg::Node* node, osg::NodeVisitor* nv)

   {

       std::cout<<"Camera update callback - pre traverse"<<node<<std::endl;

       traverse(node,nv);

       std::cout<<"Camera update callback - post traverse"<<node<<std::endl;

   }

};

――――――――――――――――――――――――――

Group->setEventCallback(osg::NodeCallback);或者

osgViewer::viewer->addEventhandler(osgGA::GUIEventHandler)可以设置用户事件回调(如用户鼠标、键盘操作)。

GUIEventHandler继承自NodeCallback和Drawable::EventCallback:

class OSGGA_EXPORT GUIEventHandler : public osg::NodeCallback, public osg::Drawable::EventCallback

 

―――――――――――

osgViewer::view:

class OSGVIEWER_EXPORT View : public osg::View, public osgGA::GUIActionAdapter

 

osgViewer::viewer:

void Viewer::constructorInit()

{

   _eventVisitor = new osgGA::EventVisitor;

_eventVisitor->setActionAdapter(this);

}

 

void Viewer::eventTraversal()

{

……

for(osgGA::EventQueue::Events::iterator itr = events.begin();

           itr != events.end();

           ++itr)

       {

           osgGA::GUIEventAdapter* event = itr->get();

 

           _eventVisitor->reset();

           _eventVisitor->addEvent( event );

 

           getSceneData()->accept(*_eventVisitor);

}

 

virtualvoid operator()(osg::Node* node, osg::NodeVisitor* nv)

   {

     。。。。。。

       {

           osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);

           if (ev && ev->getActionAdapter() && !ev->getEvents().empty())

           {

               for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();

                   itr != ev->getEvents().end();

                   ++itr)

               {

                   handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()), node, nv);

               }

           }

       }           

       traverse(node, nv);

   }


 

osg::NodeCallback最终调用的是operator()。而的核心函数是handle(),可以获取当前viewer:

bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)

   {

       osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

}

――――――

void GUIEventHandler::operator()(osg::Node* node, osg::NodeVisitor* nv)

{

   osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);

   if (ev && ev->getActionAdapter() && !ev->getEvents().empty())

   {

       for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();

           itr != ev->getEvents().end();

           ++itr)

       {

           handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()), node, nv);

       }

   }

   if (node->getNumChildrenRequiringEventTraversal()>0)traverse(node,nv);

}

――――――――――――

GUIEventHandler::       inline bool handleWithCheckAgainstIgnoreHandledEventsMask(const GUIEventAdapter& ea,GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv)

       {

           if (!ea.getHandled() ||

               (ea.getEventType() & _ignoreHandledEventsMask)==0)

           {

               bool handled = handle(ea,aa,object,nv);

               if (handled) ea.setHandled(true);

               return handled;

           }

           else

           {

               return false;

           }

       }

【OpenSceneGraph】UpdateCallback Example 实现OpenSceneGraph中的更新回调操作 阅读详情

相关推荐

[osg]源码分析:osg::Light

一、分析OpenGL中的光源 OpenGL中有两种光源:一般光源和全局环境光(背景光)。这两种光源的设置方法是不同的。 1. 一般光源 使用glLight设置; 2. 全局环境光(不在此详论,见osg::LightMode) 使用glLightMode设置。 void glLight(GLenum light, GLenum pname, TYPE param)

3122

Osg 源代码结构和主要的类

OSG 包含了一系列的开源图形库,主要为图形图像应用程序的开发提供场景管理和图形渲染优化的功能。它使用可移植的ANSI C++编写,并使用已成为工业标准的OpenGL 底层渲染API。因此,OSG 具备跨平台性,可以运行在Windows,Mac OS X 和大多数类型的UNIX 和Linux 操作系统上。大部分的OSG操作可以独立于本地视窗系统。但是OSG 也包含了针对某些视窗系统特有功能的支

GPU全栈博主 8014

【osg】osg开发(01)—基于MinGW编译构建osg软件库

本文基于Mingw32编译套件,来构建osg软件开发库,以便在QtCreator中使用MinGW来进行osg项目开发。本文记录整个osg源码编译的过程。(1-1)获取OSG: https://github.com/openscenegraph/OpenSceneGraph/tree/OpenSceneGraph-3.6.5(1-2)获取第三方库 OSG三维引擎需要其他的一些图形用户界面库的支持,所以需要第三方库,由于osg的第三方库默认支持MSVC编译套件,我们的编译套件是MinGW,所以需要一个支持Min

iriczhao的博客 1762

osg之源码跟踪-----Viewer::eventTraversal

1、概述 此函数是事件遍历函数,主要做以下几件事: a、把设备+窗口的事件收集起来 b、从SceneData开始遍历,给每个节点事件回调。getSceneData()->accept(*_eventVisitor); c、以每个从属相机为根遍历事件回调。 d、调用主相机以及从属相机事件回调(不递归) e、遍历调用Viewer加的事件回调 f、调用相机操作器回调 g、设置相应状...

dancing_night的专栏 640

OSG核心源码解析_osg_OSG核心源码解析_

OSG核心源码解析,对核心源码进行详细解析与说明

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 554

3D进阶之OSG:最基本的显示osgviewer

项目全部源码我还在整理,所以请暂时不要问源码的问题。 原来的培训教程在这里, OSG新版教学视频(2021)— 内容篇_哔哩哔哩_bilibili 但因为我使用VS2019, 不再使用VS2010这么老的版本,所以目前还在修改整理阶段。 这是我们实现的第一个程序序,很简单,全部源码如下, #include <CommonLib/Common/Common.h> #include <osgGA/StateSetManipulator> #include <osgVie

tanmx219的博客 5912

Pentaho安装与配置

Pentaho安装与配置前言一、下载二、配置1.JDK环境2.添加mysql-jdbc驱动三、启动 前言 Pentaho Data Integration (PDI):前身是Kettle。Pentaho提供了提取、转换和加载(ETL)功能,该功能使用统一且与最终用户和物联网技术相关且可访问的格式简化了捕获、清理和存储数据的过程。 功能:提供报表的制作、分析、仪表板、数据集成、数据采集、商业智能平台等强大功能。 一、下载 官网地址:http://www.pentaho.com/ 不过已经访问不到了

小太阳DENGJIE的博客 3613

使用osgQt源码方式实现osgViewer嵌入Qt窗体

1. 下载osgQt源码 GitHub - openscenegraph/osgQt 说明:本示例的osgQt版本下载后的src文件夹下文件列表如下 include路径下文件列表如下: 2. 把osgQt源码文件添加到Qt项目中 说明:本示例不单独编译osgQt源码,但是把全部osgQt源码以动态库的方式引入项目 ...

xuiiao的博客 2569

生信实战:用bcftools玩转VCF文件处理(从压缩到注释全流程)

本文详细介绍了使用bcftools处理VCF文件的全流程实战指南。从数据准备、压缩索引、信息提取、质量统计到核心的变异过滤与功能注释,手把手教你高效管理基因组变异数据。重点阐述了如何利用bcftools进行VCF文件注释,整合外部数据库信息,为变异位点添加关键的生物学标签,是生物信息学数据分析的必备技能。

rgv23456789的博客 342

跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88

PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性

Lucas1211的博客 9535

OSG:从源码看Viewer::run() 一

刚刚入门OSG不久,一直弄不清楚它到底是如何显示一副图片的,简单从源码看下。注:所用OSG的版本为3.4 release版! 1、前言 在OSG程序中,简单展示一副图片用: osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; osg::...

weixin_33962923的博客 961

Open3D (C++) 泊松重建【2025最新版】

使用C++版本的Open3D实现点云的泊松重建

点云侠的博客 3077

2020规划调整,以自研引擎和osg/osgearth源码分析为主

随着公司转入webgl,我要求调整到osg/osgearth工具,因为是c++方面的,特别是osg/osgearth源码可以深入下,以前光把视频教程看过,说白了就是简单二次应用,并没有深入下去,所以,趁此机会多读读osg/osgearth源码,根据工作和学习安排一半一半,正好就把一半时间搞osg/osgEarth 在此期间,有家ue4公司找我,我拒掉了,因为ue4的使用可以自学,深入下去还是要在...

coder 1520

C# + NAudio:构建支持实时音频处理的语音聊天应用(含回声消除)

本文介绍了如何利用C#和NAudio库开发实时语音聊天应用,重点实现回声消除功能。首先概述了NAudio库在音频处理中的作用,包括音频录制、播放和实时处理能力。然后详细讲解了构建基础语音聊天应用的过程,包括麦克风录制和扬声器播放的实现。接着深入探讨了回声消除的原理和实现方法,提出通过比较麦克风输入和扬声器输出的音频信号来消除回声,并给出了核心代码示例。最后,文章还讨论了性能优化方向,如多线程处理和网络传输扩展。该方案为开发高质量实时语音应用提供了实用参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1012

STM32实现等精度测频

上一章介绍了利用STM32的TIM的捕获功能实现频率测量的方法,但测量误差受被测信号频率的影响,不适合测量频率变化较大的。本章将介绍等精度测频的方法以及STM32的实现。STM3...

zhang062061的专栏 3457

osg绘制回调

上一篇文章讲解了如何绘制一个几何图形,那么在绘制的时候如何控制绘制的过程呢? 还是使用到了回调 osg::Drawable::UpdateCallback 定义回调类: #pragma once #include &lt;osg/Drawable&gt; class GeoCallBack : public osg::Drawable::UpdateCallback { public: Geo...

wb175208的专栏 860

计算机视觉学习路线图:从入门到专家

计算机视觉学习路线图:从入门到专家​ ,人工智能,计算机视觉,大模型,AI,计算机视觉学习路线图从七方面展开。先强调数学基础,含线性代数、概率统计和微积分;接着介绍 Python、OpenCV 等编程语言与工具;涵盖边缘检测、特征提取等经典算法;阐述深度学习中 CNN 结构、经典模型及实现;涉及目标检测、图像分割等高级专题;包含图像分类、目标检测和人脸识别等项目实战;最后提及科研进阶的论文阅读、项目参与和论文发表,助学习者从入门到专家。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

1、OSG源码编译[Windows10+Ubuntu]

在Windows平台和Ubuntu系统中编译OSG

qq_44918555的博客 1499

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【OSG原理与源码分析】OSG多线程模块:OpenThreads之C++跨平台多线程编程库那点事

简介本文将介绍跨平台多线程库的设计方案,还将介绍开源三维图形框架OSG(Open Scene Graph)中的跨平台多线程库OpenThreads的初步理解的一些基础知识。

cgprofessional的博客 833

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

osg源码编译

第一步 cmake编译源码 电脑环境:win10教育版+vs2017+osg3.6.4 osg中文官网: osg国外官网: 资源版本: cmake-3.15.0-rc1-win64-x64 OpenSceneGraph-3.6.4 OpenSceneGraph-Data-3.0.0 3rdParty_x64 使用cmake编译源码:把OpenSceneGraph-3.6.4下面的CMakeLists.txt文件,拖动到编辑框内以获取源码路径 修改输出存放路径,自动匹配vs版本(x6

weixin_45551020的博客 1673

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OpenSceneGraph源码分析:osgViewer模块

The osgViewer library provides high level viewer functionality designed to make it easier to write a range of different types of viewers, from viewers embedded in existing windows via SimpleViewer, through to highly scalable and flexible View

国产CAx(CAD/CAE/CAM)软件研发 490

osg的NodeCallback回调使用方法

osg的NodeCallback回调使用方法 #include #include #include   #include   #include   #include   //从osg::NodeCallBack继承一个新类,实现simpleCallBack的回调 class simpleCallBack:public osg::NodeCallback {

thanklife的专栏 3704

OSG源码解读 —— OpenThreads库

HandleHolder 类: 这个类封装了HANDLE 句柄。实现了一些对句柄的操作的函数,比如赋值、获取、关闭句柄等等。 Mutex类: 使用的是临界区进行资源的管理。 使用了Win32MutexPrivateData (在Windows系统中)这个类对临界区 CRITICAL_SECTION 进行封装,然后在Mutex 这个类中保存了一个Win32MutexPrivateData

1534

Windows系统下OSG3.6.5和OSGEarth3.1源码编译动态库网盘资源下载

OSG3.6.5和OSGEarth3.1动态库下载及其配置

qq_44918555的博客 1019

osg--动画

回调 osg::Node setUpdateCallback() 参数为osg::NodeCallback operator()重载 addUpdateCallback() setEventCallback() 参数为osg::NodeCallback operator()重载 setCullCallback() 参数为osg::NodeCallback opera...

蓝蓝的天 642
上一篇: 雷锋
下一篇: OSG显示图片的几种方法???????????????????????
tmljs1988
博客等级 码龄19年 134粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值