OpenSceneGraph快速入门指导 13 使用如下的命令回放此动画路径的内容。 osgviewer-p saved_animation.path cow.osg 回放动画路径时,osgviewer将序列所消耗的时间输出到std:out。如果 osgviewer并没有显示这些信息,按下Esc退出osgviewer,设置环境变量 OSG NOTIFY LEVEL为INFO,并重新启动osgviewer.。 1.4编译0SG程序 要生成基于OSG的应用程序,你需要建立一个包括头文件和链接库文件的 OSG开发环境。OSG运行时文件中包括了头文件和优化的链接库文件。如果想 创建调试用的链接库,你需要下载并重新编译OSG和OpenThreads的源代码。 OSG和OpenThreads的源代码均可以在OSG维基网站的下载专区上取得。OSG 维基网站还包括了如何生成OSG的教学文档。 要正确编译基于OSG的程序,首先要设置正确的头文件路径,以便编译器 找到必要的头文件。在编译器的包含文件搜索路径中添加以下的目录: <parent>/OpenSceneGraph/include <parent>/OpenThreads/include 将<parent>替换为OpenSceneGraph和OpenThreads的最高层安装目录。使用 Linux系统的gcc进行编译时,可以添加-I参数。在Linux系统上,<parent>通常 会被替换为usr/local/include,因此gcc的命令行参数应当包含如下的格式: -I/use/local/include/OpenSceneGraph/include -I/usr/local/include/OpenThreads/include 如果使用Microsoft Visual Studio,可以打开Project Properties对话框的C/C++ 选项卡,在Additional Include Directories中添加适当的路径。 同样的,你也需要向链接器说明OSG链接库的位置。在Liux操作系统下, OSG链接库通常位于usr/local/Mb,因此链接程序不需要再使用-L参数就可以找
OpenSceneGraph 快速入门指导 13 使用如下的命令回放此动画路径的内容。 osgviewer –p saved_animation.path cow.osg 回放动画路径时,osgviewer 将序列所消耗的时间输出到 std::out。如果 osgviewer 并没有显示这些信息,按下 Esc 退出 osgviewer,设置环境变量 OSG_NOTIFY_LEVEL 为 INFO,并重新启动 osgviewer。 1.4 编译 OSG 程序 要生成基于 OSG 的应用程序,你需要建立一个包括头文件和链接库文件的 OSG 开发环境。OSG 运行时文件中包括了头文件和优化的链接库文件。如果想 创建调试用的链接库,你需要下载并重新编译 OSG 和 OpenThreads 的源代码。 OSG 和 OpenThreads 的源代码均可以在 OSG 维基网站的下载专区上取得。OSG 维基网站还包括了如何生成 OSG 的教学文档。 要正确编译基于 OSG 的程序,首先要设置正确的头文件路径,以便编译器 找到必要的头文件。在编译器的包含文件搜索路径中添加以下的目录: <parent>/OpenSceneGraph/include <parent>/OpenThreads/include 将<parent>替换为 OpenSceneGraph 和 OpenThreads 的最高层安装目录。使用 Linux 系统的 gcc 进行编译时,可以添加-I 参数。在 Linux 系统上,<parent>通常 会被替换为/usr/local/include,因此 gcc 的命令行参数应当包含如下的格式: -I/use/local/include/OpenSceneGraph/include -I/usr/local/include/OpenThreads/include 如果使用 Microsoft Visual Studio,可以打开 Project Properties 对话框的 C/C++ 选项卡,在 Additional Include Directories 中添加适当的路径。 同样的,你也需要向链接器说明 OSG 链接库的位置。在 Linux 操作系统下, OSG 链接库通常位于/usr/local/lib,因此链接程序不需要再使用-L 参数就可以找
14 场景图形与OpenSceneGraph概述 到它们。 Microsoft Visual Studio所需的链接库文件可以在如下的源代码目录中找到: <parent>/OpenSceneGraph/lib/win32 <parent>/OpenThreads/lib/win32 将这两个目录添加到Project Properties对话框的Linker选项卡,Additional Library Directories选项。 最后,选择应用程序将要链接的OSG链接库。正如1.6.3节“组件”中叙述 的,OSG是由多个不同的库组成的,每个库都提供了不同的功能模块。一个简 单的基于OSG的程序往往需要使用osgViewer,osgDB,osgUtil和osg库,其 gcc命令参数如下: -losg Viewer-losgDB-losgUtil-losg 使用Microsoft Visual Studio进行编译时,将库文件的名称添加到Project Properties对话框的Linker选项卡,Additional Dependencies选项。在Microsoft Windows系统下,OSG针对Debug和Release版本生成不同名字的链接库。对于 Release版本的编译,添加如下的链接库名称: osg Viewer.lib osgDB.lib osgUtil.lib osg.lib 对于Debug版本的编译,在文件扩展名前添加“d”: osg Viewerd.lib osgDBd.lib osgUtild.lib osgd.lib 上面所添加的链接库只是一个例子,程序中实际添加的库取决于程序中用到 的OSG功能模块。你的程序可能需要链接其它的库,例如osgText,.osgShadow, osgGA等。在Mac OS X系统中,如果己经设定Xcode使用OSG框架,那么上 述所有的工作均可以由操作系统自动进行处理。 如果你错误地设置了编译和链接的选项,你的程序在生成过程中可能会出现 诸如“unable to open include file”,“unable to find library file”,“unresolved symbol” 的错误。当你遇到这样的错误提示时,请仔细检查错误提示信息,并确定你已经 正确设置了程序编译和链接的选项
14 场景图形与 OpenSceneGraph 概述 到它们。 Microsoft Visual Studio 所需的链接库文件可以在如下的源代码目录中找到: <parent>/OpenSceneGraph/lib/win32 <parent>/OpenThreads/lib/win32 将这两个目录添加到 Project Properties 对话框的 Linker 选项卡,Additional Library Directories 选项。 最后,选择应用程序将要链接的 OSG 链接库。正如 1.6.3 节“组件”中叙述 的,OSG 是由多个不同的库组成的,每个库都提供了不同的功能模块。一个简 单的基于 OSG 的程序往往需要使用 osgViewer,osgDB,osgUtil 和 osg 库,其 gcc 命令参数如下: -losgViewer –losgDB –losgUtil –losg 使用 Microsoft Visual Studio 进行编译时,将库文件的名称添加到 Project Properties 对话框的 Linker 选项卡,Additional Dependencies 选项。在 Microsoft Windows 系统下,OSG 针对 Debug 和 Release 版本生成不同名字的链接库。对于 Release 版本的编译,添加如下的链接库名称: osgViewer.lib osgDB.lib osgUtil.lib osg.lib 对于 Debug 版本的编译,在文件扩展名前添加“d”: osgViewerd.lib osgDBd.lib osgUtild.lib osgd.lib 上面所添加的链接库只是一个例子,程序中实际添加的库取决于程序中用到 的 OSG 功能模块。你的程序可能需要链接其它的库,例如 osgText,osgShadow, osgGA 等。在 Mac OS X 系统中,如果已经设定 Xcode 使用 OSG 框架,那么上 述所有的工作均可以由操作系统自动进行处理。 如果你错误地设置了编译和链接的选项,你的程序在生成过程中可能会出现 诸如“unable to open include file”,“unable to find library file”,“unresolved symbol” 的错误。当你遇到这样的错误提示时,请仔细检查错误提示信息,并确定你已经 正确设置了程序编译和链接的选项
OpenSceneGraph快速入门指导 15 1.5场景图形初步 前几章的内容主要是关于OSG的起源,安装和例子程序的运行。如果你一 直在按照指导阅读本章,你应该已经使用OSG在屏幕上创建了一些有趣的图形 了。本书的剩余部分将更深一步地对OSG进行探讨:本节从概念的层次介绍场 景图形:第l.6节,“OpenSceneGraph概述”,将对OSG的特性作更高层次的介 绍:然后,第二章“建立场景图形”,以及第三章“在用户程序中使用 OpenSceneGraph”,将对OSG应用编程接口部分的内容作进一步阐述。 场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以 提升渲染的效率。图1-5描述了一个抽象的场景图形,其中包含了地形,奶牛和 卡车的模型。 根节点 地形节点 奶牛节点 卡车节点 图1-5简单、抽象的场景图形 渲染一个包含了地形、奶牛和卡车的场景时,场景图形采用 了一个根节点与三个子节点的形式。每个子节点都包含了用于绘 制对象的几何信息。 场景图形树结构的顶部是一个根节点。从根节点向下延伸,各个组节点中均 包含了几何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以
OpenSceneGraph 快速入门指导 15 1.5 场景图形初步 前几章的内容主要是关于 OSG 的起源,安装和例子程序的运行。如果你一 直在按照指导阅读本章,你应该已经使用 OSG 在屏幕上创建了一些有趣的图形 了。本书的剩余部分将更深一步地对 OSG 进行探讨:本节从概念的层次介绍场 景图形;第 1.6 节,“OpenSceneGraph 概述”,将对 OSG 的特性作更高层次的介 绍;然后,第二章“建立场景图形”,以及第三章“在用户程序中使用 OpenSceneGraph”,将对 OSG 应用编程接口部分的内容作进一步阐述。 场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以 提升渲染的效率。图 1-5 描述了一个抽象的场景图形,其中包含了地形,奶牛和 卡车的模型。 图 1-5 简单、抽象的场景图形 渲染一个包含了地形、奶牛和卡车的场景时,场景图形采用 了一个根节点与三个子节点的形式。每个子节点都包含了用于绘 制对象的几何信息。 场景图形树结构的顶部是一个根节点。从根节点向下延伸,各个组节点中均 包含了几何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以
16 场景图形与OpenSceneGraph概述 有零个(有零个子成员的组节点事实上没有执行任何操作)或多个子成员。在场 景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。 OSG程序使用组节点来组织和排列场景中的几何体。想象这样一个三维数 据库:一间房间中摆放了一张桌子和两把一模一样的椅子。你可以采用多种方法 来构建它的场景图形。图1-6表示一种可能的组织方式。根节点之下有四个分支 组节点,分别为房间几何体,桌子几何体,以及两个椅子几何体。椅子的组节点 为红色,以标识它们与子节点的转换关系。椅子的叶节点只有一个,因为两个椅 子是同样的,其上级组节点将这把椅子转化到两个不同的空间位置以产生两把椅 子的外观效果。桌子组节点只有一个子节点,即桌子叶节点。房间的叶节点包括 了地板、墙壁和天花板的几何信息。 场景 椅子 椅子 桌子 房间 椅子 桌子 图1-6场景图形示例 组节点可能有多个子节点,程序可以有序地安排其几何和状 态数据。在此例中,两个椅子组节点将其唯一的子节点变换到两 个不同的空间位置上,产生了两把椅子的外观效果。 场景图形通常包括了多种类型的节点以执行各种各样的用户功能,例如,开 关节点可以设置其子节点可用或不可用,细节层次(LOD)节点可以根据观察者 的距离调用不同的子节点,变换节点可以改变子节点几何体的坐标变换状态。面 向对象的场景图形使用继承的机制来提供这种多样性,所有的节点类都有一个共 有的基类,同时各自派生出实现特定功能的方法
16 场景图形与 OpenSceneGraph 概述 有零个(有零个子成员的组节点事实上没有执行任何操作)或多个子成员。在场 景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。 OSG 程序使用组节点来组织和排列场景中的几何体。想象这样一个三维数 据库:一间房间中摆放了一张桌子和两把一模一样的椅子。你可以采用多种方法 来构建它的场景图形。图 1-6 表示一种可能的组织方式。根节点之下有四个分支 组节点,分别为房间几何体,桌子几何体,以及两个椅子几何体。椅子的组节点 为红色,以标识它们与子节点的转换关系。椅子的叶节点只有一个,因为两个椅 子是同样的,其上级组节点将这把椅子转化到两个不同的空间位置以产生两把椅 子的外观效果。桌子组节点只有一个子节点,即桌子叶节点。房间的叶节点包括 了地板、墙壁和天花板的几何信息。 图 1-6 场景图形示例 组节点可能有多个子节点,程序可以有序地安排其几何和状 态数据。在此例中,两个椅子组节点将其唯一的子节点变换到两 个不同的空间位置上,产生了两把椅子的外观效果。 场景图形通常包括了多种类型的节点以执行各种各样的用户功能,例如,开 关节点可以设置其子节点可用或不可用,细节层次(LOD)节点可以根据观察者 的距离调用不同的子节点,变换节点可以改变子节点几何体的坐标变换状态。面 向对象的场景图形使用继承的机制来提供这种多样性,所有的节点类都有一个共 有的基类,同时各自派生出实现特定功能的方法
OpenSceneGraph快速入门指导 ◇ 大量定义的节点类型及其内含的空间组织结构能力,使得传统的底层渲染 API无法实现的数据存储特性得到了实现。OpenGL和Direct3.D主要致力于图形 硬件特性的抽象实现。尽管图形设备可以暂时保存即将执行的几何和状态数据 (例如显示列表和缓冲对象),但是底层API中对于上述数据的空间组织能力在 本质上还是显得过于简单和弱小,往往难以适应大部分3D程序的开发与应用需 求。 场景图形是一种中间件(middleware),这类开发软件构建于底层API函数 之上,提供了高性能3D程序所需的空间数据组织能力及其它特性。图1-7表现 了一个典型的OSG程序层次结构。 3D应用程序 场景图形开发包(OpenSceneGraph) 底层渲染API(OpenGL) 图1-73D程序层次结构 多数3D应用程序并不是直接通过底层渲染API显示人机交 互界面,而是需要使用OpenSceneGraph等开发包中提供的额外 的功能。 1.5.1场景图形特性 场景图形除了提供底层渲染API中具备的几何信息和状态管理功能之外,还 兼具如下的附加特性和功能: ·空间结构:场景图形所采用的树状数据结构更直观,也更符合人们一般 理解中的空间事物的排布和组织结构
OpenSceneGraph 快速入门指导 17 大量定义的节点类型及其内含的空间组织结构能力,使得传统的底层渲染 API 无法实现的数据存储特性得到了实现。OpenGL 和 Direct3D 主要致力于图形 硬件特性的抽象实现。尽管图形设备可以暂时保存即将执行的几何和状态数据 (例如显示列表和缓冲对象),但是底层 API 中对于上述数据的空间组织能力在 本质上还是显得过于简单和弱小,往往难以适应大部分 3D 程序的开发与应用需 求。 场景图形是一种中间件(middleware),这类开发软件构建于底层 API 函数 之上,提供了高性能 3D 程序所需的空间数据组织能力及其它特性。图 1-7 表现 了一个典型的 OSG 程序层次结构。 图 1-7 3D 程序层次结构 多数 3D 应用程序并不是直接通过底层渲染 API 显示人机交 互界面,而是需要使用 OpenSceneGraph 等开发包中提供的额外 的功能。 1.5.1 场景图形特性 场景图形除了提供底层渲染 API 中具备的几何信息和状态管理功能之外,还 兼具如下的附加特性和功能: z 空间结构:场景图形所采用的树状数据结构更直观,也更符合人们一般 理解中的空间事物的排布和组织结构