OpenSceneGraph 快速入门指导 对跨平台开源 场景图形API的 初步介绍 [美]Paul Martz著 王锐钱学雷译
OpenSceneGraph 快速入门指导 对跨平台开源 场景图形 API 的 初步介绍 [美] Paul Martz 著 王 锐 钱学雷 译
本书谨献给 每一个场景图形开发技术的初学者
本书谨献给 每一个场景图形开发技术的初学者
目录 目录 译者序.… 前言 vii 致谢 xi 1场景图形与OpenSceneGraph概述… l.1 OpenSceneGraph的历史 …… 1.2OSG的安装 3 1.2.1硬件需求 …… 4 1.2.2 Apple Mac OS X 1.2.3 Fedora Linux 1.2.4 Microsoft Windows 1.2.5检查OSG的安装 6 l.3运行osgviewer ,。。。。+,+。,。。+。4,。,。。。。 1.3.1获取帮助 ……………………………………… 8 1.3.2显示模式 9 1.3.3环境变量 10 1.3.4统计信息显示 1.3.5记录动画 12 1.4编辑OSG程序 13 1.5场景图形初步 15 1.5.1场景图形特性 17
i 目录 目录 译者序………………………………………………………………….. v 前言 ………………………………………………………………….. vii 致谢 ………………………………………………………………….. xi 1 场景图形与 OpenSceneGraph 概述 …………………………… 1 1.1 OpenSceneGraph 的历史 ……………………………………….. 1 1.2 OSG 的安装 …………………………………………………….. 3 1.2.1 硬件需求 ……………………………………………… 4 1.2.2 Apple Mac OS X ……………………………………. 5 1.2.3 Fedora Linux …………………………………………. 5 1.2.4 Microsoft Windows …………………………………... 5 1.2.5 检查 OSG 的安装 …………………………………….. 6 1.3 运行 osgviewer …………………………………………………. 7 1.3.1 获取帮助 ……………………………………………... 8 1.3.2 显示模式 ……………………………………………... 9 1.3.3 环境变量 …………………………………………….. 10 1.3.4 统计信息显示 ……………………………………….. 11 1.3.5 记录动画 …………………………………………….. 12 1.4 编辑 OSG 程序 ………………………………………………... 13 1.5 场景图形初步 …………………………………………………. 15 1.5.1 场景图形特性 ……………………………………….. 17
OpenSceneGraph快速入门指导 1.5.2场景图形渲染方式 ………………………… 19 1.6 OpenSceneGraph概览..... 20 1.6.1设计和体系 21 1.6.2命名习惯 21 1.6.3组件 22 2建立一个场景图形 36 2.1内存管理 。。。。,。。。 。。。 36 2.l.1 Referenced类 39 2.l.2 ref ptr◇模板类 。。 39 2.1.3内存管理示例 40 2.2叶节点(Geode)和几何信息 43 2.2.1 Geometry类概述 48 2.3组节点(Group) 52 2.3.1子接口 53 2.3.2父接口 ……… 55 2.3.3变换节点(Tranform) 56 2.3.4细节层次节点(LOD) 60 2.3.5开关节点(Switch) 63 2.4渲染状态(Rendering State) 64 2.4.1渲染属性(Attribute)和渲染模式(Mode) 66 2.4.2状态继承 68
OpenSceneGraph 快速入门指导 ii 1.5.2 场景图形渲染方式 ………………………………….. 19 1.6 OpenSceneGraph 概览 ………………………………………... 20 1.6.1 设计和体系 …………………………………………. 21 1.6.2 命名习惯 …………………………………………….. 21 1.6.3 组件 ………………………………………………….. 22 2 建立一个场景图形 ……………………………………………... 36 2.1 内存管理 ………………………………………………………... 36 2.1.1 Referenced 类 ……………………………………….... 39 2.1.2 ref_ptr<>模板类 ……………………………………… 39 2.1.3 内存管理示例 ………………………………………… 40 2.2 叶节点(Geode)和几何信息 ………………………………… 43 2.2.1 Geometry 类概述 ……………………………………... 48 2.3 组节点(Group) ………………………………………………. 52 2.3.1 子接口 ………………………………………………… 53 2.3.2 父接口 ………………………………………………… 55 2.3.3 变换节点(Tranform) ………………………………. 56 2.3.4 细节层次节点(LOD) ……………………………… 60 2.3.5 开关节点(Switch) …………………………………. 63 2.4 渲染状态(Rendering State) ………………………………… 64 2.4.1 渲染属性(Attribute)和渲染模式(Mode) …… 66 2.4.2 状态继承 …………………………………………… 68
目录 2.4.3渲染状态设置示例 70 2.4.4纹理映射 76 2.4.5光照 80 2.5文件I/0 87 2.5.1接口 88 2.5.2插件的搜索和注册 90 2.6 NodeKit与osgText 91 2.6.1 osgText组件 92 2.6.2使用osgText 92 2.6.3文字示例代码 97 2.6.4.0sg文件格式 …………………………… 98 3在用户程序中使用OpenSceneGraph 104 3.1渲染 ……… 104 3.l.1 Viewer类 106 3.1.2 Simple Viewer Composite Viewer ………… 109 3.2动态更改 110 3.2.1数据变度 111 3.2.2▣调 ……… 112 3.2.3 NodeVisitor类 118 3.2.4用户选择 ……… 121
iii 目录 2.4.3 渲染状态设置示例 …………………………….…...... 70 2.4.4 纹理映射 ………………………………………..……. 76 2.4.5 光照 …………………………………………..…… 80 2.5 文件 I/O ……………………………………………………… 87 2.5.1 接口 …………………………………………… 88 2.5.2 插件的搜索和注册 …………………………… 90 2.6 NodeKit 与 osgText ………………………………………… 91 2.6.1 osgText 组件 ……………………………………… 92 2.6.2 使用 osgText ……………………………………… 92 2.6.3 文字示例代码 ………………………………….… 97 2.6.4 .osg 文件格式 ……………………………………… 98 3 在用户程序中使用 OpenSceneGraph …………………… 104 3.1 渲染 …………………………………………………………… 104 3.1.1 Viewer 类 ………………………………………..… 106 3.1.2 SimpleViewer 和 CompositeViewer …………….… 109 3.2 动态更改 …………………………………………………… 110 3.2.1 数据变度 ………………………………………….… 111 3.2.2 回调 …………………………………………….…… 112 3.2.3 NodeVisitor 类 …………………………………… 118 3.2.4 用户选择 ………………………………………….… 121
OpenSceneGraph快速入门指导 W 附录:从这里开始… 130 词汇表 132 参考书目 137
OpenSceneGraph 快速入门指导 iv 附录:从这里开始 …………………………………………… 130 词汇表 …………………………………………………………… 132 参考书目 …………………………………………………………. 137
译者序 译者序 OpenSceneGraph图形系统是一个基于工业标准OpenGL的软件接口,它让 程序员能够更加快速、便捷地创建高性能、跨平台的交互式图形程序。本书是 OSG开发小组推荐的OpenSceneGraphx.x版入门级指南。 本书首先介绍了场景图形的概念,OSG的历史和开源组织、它的能力、如 何获取和正确安装OSG,以及一些简单示例程序的运行:然后深入探讨了一些 OSG的内部管理机制和实用技术,包括内存管理、场景图形结构、OSG的状态 属性和模式控制、较复杂的场景图形系统、图形节点的概念和特性、/O接口、 以及文字添加等功能的具体介绍:最后重点探讨了如何将OSG集成到用户程序 中去的各种关键技术,包括场景的渲染、视角的改变、图像节点的选取以及在系 统运行时动态地修改场景图形数据的技术。 本书要求读者有一定的C+语言基础和数学知识,适合所有对OSG编程感 兴趣的读者阅读。 自Sutherland在l965年提出“Ultimate Display”并设计实现了世界上第一 个交互式图形系统后,计算机图形学及人-机交互技术取得了难以想象的进步。 在过去20年当中,随着计算机图形加速技术的快速发展,由计算机实时传输、 处理、可视化亿级比特数据、并为终端用户提供三维交互式场景己经成为现实。 而以虚拟现实为代表的显示技术和图形信息管理技术也取得了很大进步。目前, 全球有数以千计的公司的业务涉及或正在使用三维交互式图形系统,而这些软件 在显示、模拟、仿真、计算机辅助设计、科学数据可视化及分析领域的应用随处 可见。这些应用己成为科研开发、工业生产中的重要工具。 从系统开发人员的角度看,相比工业标准OpenGL或其它的图形库, OpenSceneGraph的优点显而易见。除了开源和平台无关性以外,它封装并提供 了数量众多的提升程序运行时性能的算法、针对包括分页数据库在内的几乎所有 主流数据格式的直接数据接口、以及对脚本语言系统Python和Tcl的支持,特别 的,支持脚本语言系统的意义不仅限于用户可以使用除C+语言以外的工具进行
v 译者序 译者序 OpenSceneGraph 图形系统是一个基于工业标准 OpenGL 的软件接口,它让 程序员能够更加快速、便捷地创建高性能、跨平台的交互式图形程序。本书是 OSG 开发小组推荐的 OpenSceneGraphx.x 版入门级指南。 本书首先介绍了场景图形的概念,OSG 的历史和开源组织、它的能力、如 何获取和正确安装 OSG,以及一些简单示例程序的运行;然后深入探讨了一些 OSG 的内部管理机制和实用技术,包括内存管理、场景图形结构、OSG 的状态 属性和模式控制、较复杂的场景图形系统、图形节点的概念和特性、I/O 接口、 以及文字添加等功能的具体介绍;最后重点探讨了如何将 OSG 集成到用户程序 中去的各种关键技术,包括场景的渲染、视角的改变、图像节点的选取以及在系 统运行时动态地修改场景图形数据的技术。 本书要求读者有一定的 C++语言基础和数学知识,适合所有对 OSG 编程感 兴趣的读者阅读。 自 Sutherland 在 1965 年提出“Ultimate Display”并设计实现了世界上第一 个交互式图形系统后,计算机图形学及人-机交互技术取得了难以想象的进步。 在过去 20 年当中,随着计算机图形加速技术的快速发展,由计算机实时传输、 处理、可视化亿级比特数据、并为终端用户提供三维交互式场景已经成为现实。 而以虚拟现实为代表的显示技术和图形信息管理技术也取得了很大进步。目前, 全球有数以千计的公司的业务涉及或正在使用三维交互式图形系统,而这些软件 在显示、模拟、仿真、计算机辅助设计、科学数据可视化及分析领域的应用随处 可见。这些应用已成为科研开发、工业生产中的重要工具。 从系统开发人员的角度看,相比工业标准 OpenGL 或其它的图形库, OpenSceneGraph 的优点显而易见。除了开源和平台无关性以外,它封装并提供 了数量众多的提升程序运行时性能的算法、针对包括分页数据库在内的几乎所有 主流数据格式的直接数据接口、以及对脚本语言系统 Python 和 Tcl 的支持,特别 的,支持脚本语言系统的意义不仅限于用户可以使用除 C++语言以外的工具进行
OpenSceneGraph快速入门指导 图形系统的开发,事实上,对弱类型计算机语言的支持将突破现有交互式图形系 统在人-机交互性能方面的最终限制。 为了将这本书尽快带给国内读者,尤其是当OSG开发小组在SIGGRAPH 2007-OSG BOF上宣布将本书的翻译工作列为OSG开发项目之一后,本书译者 带着紧迫感,在原书作者的帮助下,经过一个多月的努力,终于完成了本书的翻 译工作。在此要特别感谢Robert Osfield、Don Bruns,以及OSG开发小组主要成 员之一、本书作者Paul Martz,没有他们和其它小组成员的共同努力,OSG不可 能成为当今应用最为广泛的图形系统开发库,当然,也就不可能有这本小书的问 世。 译者简介 王锐:清华大学制造工程研究所研究员。2006年毕业于清华大学精密仪器 与机械学系。现主要从事数字控制技术、虚拟现实与虚拟产品等领域的开发与研 究工作。本人在虚拟设计论坛WWW.VRDEV,NET的注册用户名为array,主要 联系方式:电子邮箱wangray:84@gmail.com,MSN为wangray84@hotmail.com。 钱学雷:清华大学制造工程研究所博士后。主要从事数字控制技术、 CAD/CAM/CAPP集成技术、虚拟现实与虚拟产品开发、数控系统计算机仿真等 领域的科研工作
OpenSceneGraph 快速入门指导 vi 图形系统的开发,事实上,对弱类型计算机语言的支持将突破现有交互式图形系 统在人-机交互性能方面的最终限制。 为了将这本书尽快带给国内读者,尤其是当 OSG 开发小组在 SIGGRAPH 2007-OSG BOF 上宣布将本书的翻译工作列为 OSG 开发项目之一后,本书译者 带着紧迫感,在原书作者的帮助下,经过一个多月的努力,终于完成了本书的翻 译工作。在此要特别感谢 Robert Osfield、Don Bruns,以及 OSG 开发小组主要成 员之一、本书作者 Paul Martz,没有他们和其它小组成员的共同努力,OSG 不可 能成为当今应用最为广泛的图形系统开发库,当然,也就不可能有这本小书的问 世。 译者简介 王锐:清华大学制造工程研究所研究员。2006 年毕业于清华大学精密仪器 与机械学系。现主要从事数字控制技术、虚拟现实与虚拟产品等领域的开发与研 究工作。本人在虚拟设计论坛 WWW.VRDEV.NET 的注册用户名为 array,主要 联系方式:电子邮箱 wangray84@gmail.com,MSN 为 wangray84@hotmail.com。 钱学雷:清华大学制造工程研究所博士后。主要从事数字控制技术、 CAD/CAM/CAPP 集成技术、虚拟现实与虚拟产品开发、数控系统计算机仿真等 领域的科研工作
vii 前言 前言 本书是一本对于OpenSceneGraph(OSG)的简明介绍。OSG是一个跨平台 的开源场景图形程序开发接口(API)。本书特别地针对OSG1.3的版本。OSG 在3D应用程序的层级中扮演着重要的角色。它作为中间件(middleware)为应 用软件提供了各种高级渲染特性,IO,以及空间结构组织函数:而更低层次的 OpenGL硬件抽象层(HAL)实现了底层硬件显示的驱动。 一直以来,OSG都是以源代码作为可阅读的文档资料。OSG的发布版本中 包含了一些示例程序,用于介绍各种不同渲染效果的实现,以及OSG与终端用 户软件的集成方法。有相当部分的开发者可以通过这些示例程序,以及使用调试 工具深入了解OSG的核心,成长为熟练的OSG API程序员。 尽管根据以往的经验,源代码足可起到编程文档的作用,但是它仍然不能替 代正式格式的编程文档。图形和表格是编程手册中常见的易于理解的教学工具, 但是它们在源代码中几乎无法体现。正因为OSG的迅速发展和愈发复杂的体系, 对于它的新用户来说,在缺乏参考文档的情况下学习OSG所需的时间也就越长, 这是我们所不愿看到的。事实上,在这本书面世以前,由于编程文档的匮乏,一 部分开发者己经对OSG的成熟性和稳定性产生了疑问,怀疑它是否能胜任专业 级应用程序的开发工作。 2006年中期,Don Burns和Robert Osfield认识到了编写OSG书籍的重要性。 Don的客户之一,计算机图形系统开发公司(CGSD),要求编写一定量的OSG 图书和文档。Don将这一文档开发工作转交给Paul Martz,而Robert则建议第一 本OSG的书籍应当是免费且通俗易懂的。因此,《OpenSceneGraph快速入门指 导》诞生了。这本书是一个简短的编程指南,它介绍了基本和核心的OSG API 函数。它同时也是一系列计划出版的OSG书籍的第一部,OSG的文档将随着这 个系列的发行而逐渐完善。《OpenSceneGraph快速入门指导》的编写目的如下。 ●快速且高效地向新的OSG开发者介绍OSG的基础知识。 ●使开发者对于OSG的发行和源代码结构有更加深入的认识。 ●介绍常用的OSG API函数及其用途
vii 前言 前言 本书是一本对于 OpenSceneGraph(OSG)的简明介绍。OSG 是一个跨平台 的开源场景图形程序开发接口(API)。本书特别地针对 OSG 1.3 的版本。OSG 在 3D 应用程序的层级中扮演着重要的角色。它作为中间件(middleware)为应 用软件提供了各种高级渲染特性,IO,以及空间结构组织函数;而更低层次的 OpenGL 硬件抽象层(HAL)实现了底层硬件显示的驱动。 一直以来,OSG 都是以源代码作为可阅读的文档资料。OSG 的发布版本中 包含了一些示例程序,用于介绍各种不同渲染效果的实现,以及 OSG 与终端用 户软件的集成方法。有相当部分的开发者可以通过这些示例程序,以及使用调试 工具深入了解 OSG 的核心,成长为熟练的 OSG API 程序员。 尽管根据以往的经验,源代码足可起到编程文档的作用,但是它仍然不能替 代正式格式的编程文档。图形和表格是编程手册中常见的易于理解的教学工具, 但是它们在源代码中几乎无法体现。正因为 OSG 的迅速发展和愈发复杂的体系, 对于它的新用户来说,在缺乏参考文档的情况下学习 OSG 所需的时间也就越长, 这是我们所不愿看到的。事实上,在这本书面世以前,由于编程文档的匮乏,一 部分开发者已经对 OSG 的成熟性和稳定性产生了疑问,怀疑它是否能胜任专业 级应用程序的开发工作。 2006 年中期,Don Burns 和 Robert Osfield 认识到了编写 OSG 书籍的重要性。 Don 的客户之一,计算机图形系统开发公司(CGSD),要求编写一定量的 OSG 图书和文档。Don 将这一文档开发工作转交给 Paul Martz,而 Robert 则建议第一 本 OSG 的书籍应当是免费且通俗易懂的。因此,《OpenSceneGraph 快速入门指 导》诞生了。这本书是一个简短的编程指南,它介绍了基本和核心的 OSG API 函数。它同时也是一系列计划出版的 OSG 书籍的第一部,OSG 的文档将随着这 个系列的发行而逐渐完善。《OpenSceneGraph 快速入门指导》的编写目的如下。 z 快速且高效地向新的 OSG 开发者介绍 OSG 的基础知识。 z 使开发者对于 OSG 的发行和源代码结构有更加深入的认识。 z 介绍常用的 OSG API 函数及其用途
OpenSceneGraph快速入门指导 viii ● 指导读者学习OSG的源代码及相关文档。 基于开放源代码的理念,《OSG快速入门指导》一书的PDF版本将不必支付 任何费用即可获得。但是,读者也可以通过购买全彩薄页印刷版本的方式,向 OSG的开发团体进行捐助。用户可以访问Lulu.com网站并搜索OpenSceneGraph, 通过网络订购的方式来获取本书。 http://www.lulu.com 本书装订版本的收入将用于文档的修订工作,以保证本书版本是最新的。 无论用户是免费下载,还是购买了本书的装订版本,用户的反馈意见都将对 本书的修订工作产生极大的帮助。请您将相关的修改意见发布在OSG用户邮件 列表中。关于用户邮件列表的相关信息,请参见“附录:从这里开始”。 关于本书的最新修订版本,请登陆《OpenSceneGraph快速入门指导》网站: http://www.openscenegraph.org/osgwiki/pmwiki.php/ Documentation/QuickStartGuide 上面的网址包括了本书最新版本的获取方式,书中示例程序的源代码,以及 其他一些相关的出版信息。 适宜读者群 本书的内容不多,而缩短其篇幅并不是一件容易的事。本书将主要介绍实用 OSG的函数及其运用,因此,本书的适宜阅读群体也就限制为特定的人群。 本书专为准备开始学习OSG,并使用OSG进行程序开发的开发者所编写。 本书所涉及的工具可能包括特定行业的应用软件,本书同时还提供有关虚拟现实 和仿真方面的介绍,这也正是OSG的强大之处所在。 OSG是一个C++API库,因此本书假定读者具备相当的C+开发经验。特 别地,本书的读者应当对于C++的设计特性较为熟悉,例如公有和私有成员,虚 函数,内存分配,类继承,以及构造和析构函数等。OSG对于标准模板库(STL) 的运用十分广泛,因此读者应当对STL容器,特别是列表(Iist),向量组(vector)
OpenSceneGraph 快速入门指导 viii z 指导读者学习 OSG 的源代码及相关文档。 基于开放源代码的理念,《OSG 快速入门指导》一书的 PDF 版本将不必支付 任何费用即可获得。但是,读者也可以通过购买全彩薄页印刷版本的方式,向 OSG 的开发团体进行捐助。用户可以访问 Lulu.com 网站并搜索 OpenSceneGraph, 通过网络订购的方式来获取本书。 http://www.lulu.com 本书装订版本的收入将用于文档的修订工作,以保证本书版本是最新的。 无论用户是免费下载,还是购买了本书的装订版本,用户的反馈意见都将对 本书的修订工作产生极大的帮助。请您将相关的修改意见发布在 OSG 用户邮件 列表中。关于用户邮件列表的相关信息,请参见“附录:从这里开始”。 关于本书的最新修订版本,请登陆《OpenSceneGraph 快速入门指导》网站: http://www.openscenegraph.org/osgwiki/pmwiki.php/ Documentation/QuickStartGuide 上面的网址包括了本书最新版本的获取方式,书中示例程序的源代码,以及 其他一些相关的出版信息。 适宜读者群 本书的内容不多,而缩短其篇幅并不是一件容易的事。本书将主要介绍实用 OSG 的函数及其运用,因此,本书的适宜阅读群体也就限制为特定的人群。 本书专为准备开始学习 OSG,并使用 OSG 进行程序开发的开发者所编写。 本书所涉及的工具可能包括特定行业的应用软件,本书同时还提供有关虚拟现实 和仿真方面的介绍,这也正是 OSG 的强大之处所在。 OSG 是一个 C++ API 库,因此本书假定读者具备相当的 C++开发经验。特 别地,本书的读者应当对于 C++的设计特性较为熟悉,例如公有和私有成员,虚 函数,内存分配,类继承,以及构造和析构函数等。OSG 对于标准模板库(STL) 的运用十分广泛,因此读者应当对 STL 容器,特别是列表(list),向量组(vector)