【OSG】Examples

推荐内容

关于示例项目解析的内容推荐:

  • OSG3.4内置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,不难,可以参考我的另外一篇文章:

  • 【开源库学习】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。

其他:

  • The safe bool idiom in C++

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】页(page),用户控件(userControl),窗口(window)区别

欢迎加入BIM行业开发交流1群 群号:711844216 背景 大家在vs中新建wpf项目后,会发现在添加新建项时会出现下列三个选项 它们有什么区别呢? 区别: 页:通常用于网页窗口:通常一个桌面app只有一个主窗口用户控件&#…

OpenGL基本运行模型

OpenGL是一种三维技术规范。 我们知道三维渲染场景需要实时计算大量数据。 这里我根据自己的经验总结出一句话: 计算机中,对性能要求高的功能模块,其运行原理必然是简单易行的! 有理由断言:OpenGL没那么难。 OpenGL工…

【转】浅谈TDD、BDD、ATDD、DDD的区别

四个开发模式意思: TDD:测试驱动开发(Test-Driven Development)BDD:行为驱动开发(Behavior Driven Development)ATDD:验收测试驱动开发(Acceptance Test Driven Development&#x…

【OSG】OSG运行模型

关于运行模型 OSG中的类很多,只看OSG代码,很难把各个类串联起来。 我们知道面向对象程序的运行模型是:对象对象间协作。 单纯看代码,多数情形下,只能了解程序中有哪些对象,而不知道它们是如何协作的&…

用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别

数据治理 (Data Governance) [1]作为一种数据管理的重要一环,主要目的在于保证数据在整个生命周期内的高质量性。数据治理的核心包括:数据的可用性 (Availability),易用性 (Usability),一致性 (Consistency),完整性 (I…

【转】C# Stream篇(—) -- Stream基类

目录: 什么是Stream? 什么是字节序列? Stream的构造函数 Stream的重要属性及方法 Stream的示例 Stream异步读写 Stream 和其子类的类图 本章总结 什么是Stream? MSDN 中的解释太简洁了: 提供字节序列的一般视图 (我可不想这么理解…

【已解决】解决Win7安装VS2013/VS2015结束时报错“无法建立到信任根颁发机构的证书链”的问题

问题描述 最近在Win7虚拟机上上安装VS,等待许久之后,提示安装完成。但是完成界面报错: “无法建立到信任根颁发机构的证书链”。 而且错误还不少,如下图所示: 根据我的个人经验,证书问题并没有影响日常开…

【转】C# Stream篇(二)TextReader 和StreamReader

目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简单介绍下Encoding 编码 StreamReader 的定义及作用 StreamReader 类的常用方法属性 StreamReader示例 本章总结 为什么要介绍 TextReade…

【数据结构】能看懂的红黑树

1 总体逻辑 1.2 二叉树 二叉树中&#xff0c;一个根节点最多有两个子节点。 1.3 二叉排序树 Binary Search Tree 二叉排序树是一个排好序的二叉树。且水平方向来看&#xff0c;总有 左节点 < 右节点 简单记忆其规律&#xff0c;可以在脑海中想象一个大大的小于号&#x…

【转】!C#中的Stream相关

计算机文件基本上分为二种&#xff1a;二进制文件和 ASCII&#xff08;也称纯文本文件&#xff09;。图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件&#xff0c;由一些字符的…

【转】!!c#文件系统操作类继承关系图

自己总结的&#xff0c;给大家参考一下&#xff0c;

php elasticsearch 获取索引所有文档_Elasticsearch客户端主要方法的使用规则

安装1.在 composer.json 文件中引入 elasticsearch-php&#xff1a;{ "require": { "elasticsearch/elasticsearch": "~6.0" }}2.用 composer 安装客户端&#xff1a;curl -s http://getcomposer.org/installer | phpphp composer.…

【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

转自&#xff1a;https://monday.blog.csdn.net/article/details/51122637 一&#xff1a;使用场景&#xff1a; 假如你的项目&#xff08;这里指的是手机客户端项目&#xff09;的某个版本&#xff08;例如1.0版本&#xff09;已经完成开发、测试并已经上线了&#xff0c;接…

【转】人工智能教程-前言

前言 大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#xff0c;人工智能时代就要来临了&#xff0c;科幻电影中的场景将成为现实&#xff0c;未来已来&#xff01; 我很庆幸。十四年前就认定了人工智能专业&…

【转】人工智能-1.1.1 什么是神经网络

1.1.1 什么是神经网络 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这个无需解释太多&#xff0c;因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能&#xff1f; 从1956年夏季首次提出“人工智能…

【转】人工智能-1.2.2 神经网络是如何进行预测的

上一篇文章中我们已经知道了如何将数据输入到神经网络中。那么神经网络是如何根据这些数据进行预测的呢&#xff1f;我们将一张图片输入到神经网络中&#xff0c;神经网络是如何预测这张图中是否有猫的呢&#xff1f;&#xff1f; 这个预测的过程其实只是基于一个简单的公式&a…

js 根据公历日期 算出农历_一招教会你公历换算成农历,要不要试试看

古代的历法是干支纪年&#xff0c;俗称农历或阴历&#xff0c;现在我们都统一采用公历的阿拉伯数字纪年。因此&#xff0c;就存在着一个历法的换算问题。当然&#xff0c;我们可以查历书就直接知道了&#xff0c;但是这个方法并不一定方便。现在告诉大家一个简单的口诀&#xf…

【转】Power Platform(简介)

Power Platform 系统通过允许用户执行以下三个关键操作来帮助他们推动业务发展&#xff1a;使用 Power BI 从数据中获得见解&#xff0c;通过使用 PowerApps 构建的应用程序来推动智能业务流程&#xff0c;以及使用 Power Automate 自动执行这些流程。 这些解决方案彼此配合协作…

【转】人工智能-1.2.1 如何将数据输入到神经网络中

1.2.1 如何将数据输入到神经网络中 通过对前面文章的学习&#xff0c;我们已经知道神经网络可以实现真正的人工智能。本小节我会进行详细地讲解&#xff0c;让大家彻底地弄懂神经网络。在仅仅只学完一篇文章后&#xff0c;你肯定依然感觉朦胧&#xff0c;这是正常的&#xff0…