【OSG】Examples

1. Examples osgbillboard

这个项目很简单,就几个函数,而且很有意思。
osg::Billboard类是一个控制器,不管你怎么旋转漫游场景,它始终都会朝向摄像机。

1.1 运行

osgbillboard运行截图

1.2 调试、阅读代码

看里面代码时,就会接触到osg的核心类了,比如

- osg::Geometry
- osg::Vec3Array
- osg::StateSet
- osg::Group
- osgViewer::Viewer
- 等等

这里面的类又会引用到其他类,慢慢展开,但是大体上都是属于 OSG Core/osg 项目中的内容,也就是osg核心类。


关于OpenThreads

值得提及的是,OSG Core文件夹下第一个项目是OpenThreads,如下图所示:
OpenThreads
这个库比较有名,它是一个多线程库,关于OpenThreads,不难,可以参考我的另外一篇文章:


接下来要了解以下一些类:

  • OSG Core/osg/DeleteHandler
  • OSG Core/osg/Referenced
  • OSG Core/osg/Object
  • OSG Core/osg/ref_ptr
  • OSG Core/osg/Observer
  • OSG Core/osg/Node
  • OSG Core/osg/Drawable
  • OSG Core/osg/Geometry
  • OSG Core/osg/BufferObject
  • OSG Core/osg/BufferData
  • OSG Core/osg/Array
  • 更多的相关内容,可以打开项目下的更多依赖项查看。

关于引用计数:

  • 理解共享指针和对象自带引用计数的区别。std::shared_ptr类似于Qt中的QSharedPointer;而osg::ref_ptr+Referenced类似于QSharedDataPointer+QSharedData。

其他:

有些地方看不懂没关系,最起码要知道某个类在哪个项目中,主要功能是什么。不用着急,见多了用多了,自然就记住并理解了。

2. Examples osgtext

之所以选择这个项目,是因为这个项目一看名字就知道,它是一个在3D场景中绘制文本的示例项目。
文本绘制对我们来说,接触的比较多,应该比较容易理解。

2.1 运行

请添加图片描述
这个项目中包含2D平面的文本显示和3D模式的文本显示,按下几次空格键可以查看3D文本。

多次按下字母’s’,可以查看OSG实时运行参数统计信息。如下图所示:
请添加图片描述

2.2 调试、阅读代码

整个项目大概800行,大概花一两个小时就可以大致过一遍。调试的时候可以尝试注释、修改部分代码,查看修改后的效果,理解被修改的代码起到的作用。

下面是我的阅读总结:

osg::Geode和osg::Geometry区别是:osg::Geode继承自osg::Group,可以包含多个子节点;osg::Geometry和osg::Group都继承自osg::Node,但是osg::Geometry不可以包含子节点,只是一个独立节点。
osg::StateSet:此类封装了OpenGL状态参数,实现对OpenGL参数的集中管理,封装成类,更方便使用。

参数解析器:osg::ArgumentParser arguments(&argc, argv);
模型读写:osgDB::writeNodeFile
创建相机并配置:osg::Camera

osgViewer
它是OSG核心的一部分,位于OSG Core/osgViewer,用来渲染3D场景并处理交互事件。
给视图设置模型:osgViewer::Viewer::setSceneData(),参数为3D场景根节点。

  • osgViewer::addEventHandler:给视图添加事件处理器。
  • osgViewer::StatsHandler:统计数据显示类,也是继承自osgGA::GUIEventHandler,事件驱动统计。按下’s’显示OSG实时运行参数的统计信息,就是由这个类实现的。
    osgViewer::ViewerBase:这个类集成了整个osg渲染过程,需要特别关注。仔细阅读其代码!

osgGA
这个项目位于OSG Core/osgViewer,是OSG核心的一部分。
它实现了事件通知机制,定义了响应3D场景中各种事件的回调接口。大概有25个类,不多,值得花点时间看看。

  • osgGA::EventHandler:事件处理基类,里面有一些遍历的代码,不太好懂。理解它唯一的方法是调试。打上断点,对着当前这个例子调试就完事了!
  • osgGA::GUIEventHandler:是osgGA::EventHandler的子类,通过调试理解。
  • osgGA::StateSetManipulator:是osgGA::GUIEventHandler的子类,通过调试理解。
  • osgGA::EventVisitor:继承自osg::NodeVisitor,也还是包含遍历的代码,通过调试理解。
  • osgGA::StateSetManipulator:此类顾名思义是用于实现用户操作osg::StateSet的,它通过响应用户输入,修改场景或节点的渲染状态,比如按下字母’l’控制场景灯光,按下字母’t’切换纹理,按下字母‘w’切换显示模式。
  • 按照这个套路,其他的自己慢慢摸索!

关于多线程渲染部分的代码要学习一下。
主要需要关注下面两个类。

  • osg::Operation
  • osg::OperationThread

多线程渲染的原理是使用后台线程绘制,然后主线程在帧刷新时同步绘制。

好了,差不多就打住,才看了两个例子,有些类是看不懂的,没必要继续深入了,看下一个例子吧!

posted @ 2022-05-22 11:21  撬动未来的支点  阅读(243)  评论(0编辑  收藏  举报