文档简介
i 目 录 目 录 插图目录 III 表格目录 V 摘要 1 ABSTRACT 2 1 绪论 3 1 1 背景分析 3 1 2 OPENGL 介绍 3 1 3 问题的引入 4 1 4 开发和运行环境 4 1 5 论文组织与结构 5 2 基础知识与对应的 OPENGL 技术 6 2 1 三维数学基础 6 2 2 物理运动学基础 11 2 3 三维图形操作 14 2 4 三维渲染技术 15 3 系统的构架 18 3 1 设计思路 18 3 2 框架结构 18 4 系统的设计与实现 20 4 1 基本数据结构模块 20 4 1 1 三维向量类的设计原则 20 4 1 2 带值向量类的设计思路 21 4 2 三维图元模块 21 4 2 1 将 OpenGL 中复杂的显示和渲染技术抽象到类 22 4 2 2 基于八叉树的三维冲突算法 23 4 2 3 基于 XML 的图形存储模式 26 4 2 4 基于公共语言运行库编译的 XML 解析 27 4 3 动作容器模块 28 4 3 1 为 C 实现委托 28 4 3 2 将 OpenGL 中繁琐的矩阵转换抽象到简单的物理动作 30 4 3 3 基于委托的动作容器和显示容器 32 4 3 4 利用显示列表和纹理列表来提高 OpenGL 的运行性能 33 4 4 三维可视体模块 33 4 4 1 基于树形结构的可视体体系 34 4 4 2 2D 文本的显示技术与 2D 文本在 3D 动画中的应用 34 4 4 3 Unicode 编码与 OpenGL 中 2D 汉字文本的显示 35 4 5 用户交互模块 36 ii 4 5 1 基于选择模式的鼠标命中策略 37 4 5 2 基于反馈模式的实体定位策略 38 4 6 ANI WARE脚本解释模块 39 4 6 1 脚本系统的简介与设计框架 40 4 6 2 基于自动机的词法分析 43 4 6 3 基于递归的语法规约算法 43 4 6 4 内存池与信息元 45 4 6 5 基于表结构的语义分析 47 4 6 6 基于二叉树的脚本执行 49 4 7 MFC 可视化界面模块 52 4 7 1 可视化界面的设计框架 52 4 7 2 基于 OpenGL 的视图类设计 53 4 7 3 基于信息存储的文档类设计 54 5 系统性能分析 55 总结与展望 56 致谢 57 参考文献 58 iii 插图目录插图目录 图 2 1 笛卡尔坐标系和坐标 6 图 2 2 原图及原图相对于坐标系逆时针旋转 30 度后的图 7 图 2 3 原图及坐标系相对于原图逆时针旋转 30 度后在新坐标系中做的图 8 图 2 4 向量与点的关系 9 图 2 5 矩阵的平移 旋转和缩放 10 图 2 6 平移视口与平移物体 10 图 2 7 OpenGL 矩阵变换过程 10 图 2 8 三维场景中的位移表示 12 图 2 9 位移 速度和加速度 13 图 2 10 线速度与角速度 14 图 2 11 透视视景体与正交视景体 14 图 3 1 系统模块结构图 18 图 3 2 系统模块关系图 19 图 4 1 投影和垂线的图释 21 图 4 2 三维向量和带值向量 21 图 4 3 三维图元模块的类框架 22 图 4 4 Graphics3D 与球形图元的类设计图 23 图 4 5 立方体包围盒和圆柱体包围盒 24 图 4 6 模拟人体的多包围盒实例 24 图 4 7 空间的划分和对应的八叉树结构 25 图 4 8 空间状态树 25 图 4 9 三维图形的 XML 存储模式 27 图 4 10 动画场景中动作的执行原理 29 图 4 11 按照 OpenGL 编码规则形成动画的思路 31 图 4 12 基于物理运动学的动画构造思路 32 图 4 13 基于多播委托的动作容器和显示容器 33 图 4 14 可视体体系结构 34 图 4 15 在三维场景中显示二维字符的过程 35 图 4 16 选择模式下鼠标命中物体 38 图 4 17 命中记录的数据结构 38 图 4 18 反馈记录的基本格式 39 图 4 19 ANI WARE 脚本语言的器件与标签 40 图 4 20 器件 标签 的作用和关系 41 图 4 21 脚本系统中器件的运行模式 41 图 4 22 Ani Ware 脚本解释系统的架构 42 图 4 23 示例文法对应的语法分析过程 45 图 4 24 内存分配池 46 图 4 25 内存池结构 46 图 4 26 信息元结构图 47 图 4 27 语义分析表 对象属性匹配 48 iv 图 4 28 语义分析表 对象方法匹配 48 图 4 29 语义分析表 操作符操作数匹配 48 图 4 30 处理委托的实现 49 图 4 31 二叉树与表达式 49 图 4 32 a b c 与 a b c 的二叉运算树 50 图 4 33 向操作符树添加操作数 51 图 4 34 可视化界面的设计框架 52 图 4 35 OpenGL 视图类的结构 53 v 表格目录表格目录 表 2 1 OpenGL 中主要的矩阵操作函数列表 11 表 2 2 OpenGL 枚举值列表 17 表 4 1 反馈缓冲区中的数据标记和意义 39 表 5 1 性能分析表 55 1 Ani Ware 脚本系统的定义 设计与实现脚本系统的定义 设计与实现 常明 摘要 Ani Ware 脚本系统定义了一种用于设计和创作三维动画的脚本语 言 通过提供 4 种器件 实现了三维场景的渲染 三维物体的构造 运动属性的设置 交互事件的捕获 并行场景的链接 串行场景的切换 等接口支持 利用 Ani Ware 脚本系统可以方便地实现三维动画设计中的 模型转换和场景渲染 提高设计效率 本论文阐述了 Ani Ware 脚本系统 的定义 设计与实现的整个过程 并讨论了基于 XML 的三维图形建模 方法 三维场景的构建框架 三维坐标下鼠标命中策略 以及该脚本的 解释和执行算法等内容 Ani Ware 脚本系统具有友好的图形化用户界 面 提供了完善的脚本解析功能 包括 编译解释 错误提示和以三维 动画形式运行等 Ani Ware 脚本规则简单 语意清晰 直观易用 器件 的引入实现了代码的重用 增强了系统的扩展性 给用户提供了广阔的 创作空间 Ani Ware 脚本系统的性能良好 可将其用于教学演示 三维 仿真 广告设计等领域 关键字 Ani ware 脚本 Ani ware 器件 三维动画 解析 2 Defination Design and Implementation of Ani Ware Script System CHANG Ming Abstract Ani Ware script system defines a script language for the design and creation of three dimensional animation Using four kinds of wares this script can provide interfaces for renderring of three dimensional scene modeling of three dimensional object setting of kinematics attribute catching of alternation event linking of parallel scenes switching of serial scenes and so on Using Ani Ware script system users can conveniently transform three dimensional model render three dimensional scene and make improvement in developing efficiency This paper mainly tells the whole procedure of Ani Ware system s defination design and implementation talks about the mothod of three dimensional modeling based on XML the framework of three dimensional scene building the strategy of three dimensional mouse picking and interpretation of the script language Ani Ware script system has friendly graphics user interface provides perfect functions for script parsing interpreting error reporting and running three dimensional animation Ani Ware script has simple rules clear meaning and is easy to use The ware introduced by this script can achieve the reusability of code and enhance the expansibility of system which will provide powerful creating abilities for users Ani Ware system having nice capability can be applied to teaching demo three dimensional emulation advertisement design and so on Keyword Ani Ware Script Ani Ware Ware three dimensional animation parsing 3 1 绪论绪论 现在 各行各业的人们都要认识到 模型 的力量 我不是指辛迪 克 劳 而是指利用计算机模拟和图像分析 你可以把所有的数据收集在一起 做出 模型 从而可以看出各种复杂因素结合在一起究竟会产生什么后果 作为一个会 建立模型的房地产经济人 你可以给潜在的买主演示房屋或者公寓的平面设计 图 并让他们按照自己的意愿移动墙壁 以选择最佳的效果 作为一个会建立模 型的工程师 你也可以对桥梁和道路做出同样的模拟 所以那些园林建筑师 财 务计划起草者 家居设计者和不动产交易经纪人等 一旦掌握了这些技能 把其 运用到工作之中 满足客户的要求 就会发现他们自己具备了免受平坦化冲击的 能力 世界是平的 21 世纪简史 1 1 背景分析背景分析 随着计算机多媒体技术和计算机图形学技术的发展 我们可以使用计算机来 精确地模拟现实世界中的各种各样的物体 并充分发挥自身的创造性 利用三维 建模和动画技术来模拟和改造现实世界 三维模拟技术在机械制造 军事模拟 数字城市 生物医药 地理信息等很 多领域中发挥了重要作用 并以其逼真的运行效果证明了该技术在计算机多媒体 中举足轻重的地位 Windows Vista 的诞生作为计算机图形学的发展史上的一个 里程碑 以其精美的 3D 界面 更有力地推动了三维图形技术的发展 随着计算机图形学的快速发展 三维图形的编辑技术已经日趋完善 目前已 经有许多优秀的三维图形软件 例如 3DMAX 可以方便地建立物体模型 但又 难以实现对模型转换和控制 15 因此 三维动画技术存在较大的空间以待发展 三维动画技术 7 12 是建立在计算机图形图像基础上发展起来的一种新型技 术 因此三维动画技术的发展不仅伴随着计算机硬件技术的发展 而且伴随着计 算机图形图像技术的发展而发展 12 计算机三维动画技术在影视广告制作 虚拟现实技术 建筑装潢设计 计算 机辅助教学等领域有着广泛而重要的应用 12 凡是需要用计算机图形来模拟真 实世界的地方或用活动的画面来表达抽象的内容时 都可以用计算机三维动画来 实现 12 1 2 OpenGL 介绍介绍 OpenGL 是一个专业的 3D 程序接口 是一个功能强大 调用方便的底层 3D 图形库 它包括了大约 250 个函数 其中 200 个在 OpenGL 核心中 其他 50 个 在 OpenGL 实用库中 OpenGL 的前身是 SGI 公司为其图形工作站开发的 IRIS GL IRIS GL 是一个工业标准的 3D 图形软件接口 功能虽然强大但是移植性不 好 于是 SGI 公司便在 IRIS GL 的基础上开发了 OpenGL OpenGL 的英文全称 是 Open Graphics Library 顾名思义 OpenGL 便是 开放的图形程序接口 虽 4 然 DirectX 在家用市场全面领先 但在专业高端绘图领域 OpenGL 是不能被取 代的主角 15 OpenGL 是个与硬件无关的软件接口 2 可以在不同的平台如 Windows 95 Windows NT Unix Linux MacOS OS 2 之间进行移植 因此 支持 OpenGL 的软件具有很好的移植性 可以获得非常广泛的应用 15 OpenGL 使得原来必须在高档图形工作站上运行的大型 3D 游戏也可以在普 通的微机上运行 15 从而 推动了计算机 3D 游戏的发展 同样也在电影特效 虚拟现实 建筑 产品设计 医学 地球科学 流体力学等领域大展身手 4 OpenGL 提供了实体绘制 场景变换 光照处理 颜色修饰 雾化效果 纹 理映射等物体修饰功能 2 另外 OpenGL 提供诸如顶点数组 显示列表 双缓 存等提高系统性能的技术 使得在 PC 机上利用 OpenGL 制作美观真实 流利顺 畅三维动画变得现实 2 1 3 问题的引入问题的引入 由于 OpenGL 是三维图形的底层图形库 没有提供几何实体图元 因此不能 直接用以描述场景 虽然 OpenGL 技术提供了功能强大的低层图形库 但这些图 形编辑函数都是很基础的 要实现一个动画往往需要复杂的建模转换和编辑代 码 此外 OpenGL 代码在渲染场景 构造物体上都很繁琐 设计者往往要花费 大量的时间在这些渲染和构造上 从而不能专注于动画的设计 一个三维动画系 统一旦编辑成功则只能按照既定的模式运行而不能更改 如果需要创建新的动画 就只能重新编写场景渲染和实体构造代码 以及新的动画执行代码 这样也导致 将设计者的时间花费在很多重复性的工作上 为了能够简化三维动画设计的复杂性 减少动画设计者的工作量 并提供一 个使用简单的设计平台 本系统结合 OpenGL 中功能强大的低层图形库 克服上 述不足 实现基于 Ani Ware 脚本语言的三维动画辅助制作系统 1 4 开发和运行环境开发和运行环境 1 系统开发环境 硬件环境 512M 内存 1 2GHz CPU 40G 硬盘 软件环境 Windows XP 操作系统 Visual Studio 2005 平台 OpenGL 动态 支持库 1 0 或更高版本 OpenGL 静态支持库 OpenGL32 lib glu32 lib glaux lib Xerces 动态支持库 2 0 Release 版本与 Debug 版本 Xerces 静态支持库 Release 版本与 Debug 版本 2 运行环境 硬件环境 256M 内存 1 2GHz CPU 软件环境 Windows XP 操作系统 5 1 5 论文组织与结构 论文组织与结构 本论文主要介绍了三维动画的设计方案和 Ani Ware 脚本系统的分析与设 计 大体分为四个部分 其中 第一部分介绍了项目背景及设计相关基础知识 第二部分是系统的构架设计和模块结构 第三部分详细阐述了 Ani Ware 脚本系 统各个模块的设计与实现 其中对三维图形的构造 动作容器的设计 实时交互 的方法 脚本语言的编译解释算法 以及图形化界面的设计与实现分别进行阐述 第四部分是系统性能分析及总结和展望 6 2 基础知识与对应的基础知识与对应的 OpenGL 技术技术 2 1 三维数学基础三维数学基础 本节主要讨论与三维动画演示密切相关的 基础而重要的三维数学基础知 识 主要涉及到三维坐标与坐标系 三维向量 三维矩阵以及对应的 OpenGL 中 的计算技术 1 坐标与坐标系 我们平时指的坐标系 即二维坐标系 是由著名的法国数学家勒奈 笛卡尔 Rene Descartes 发明 并以他的名字命名的 1 每个二维坐标系都有一个特殊的点 称作原点 Origin 它是坐标系的中 心点 1 每个二维坐标系都有两条通过原点 并且相互垂直的直线 称为轴 Axis 1 水平的直线被称为 x 轴 垂直的直线被称为 y 轴 1 并规定 x 轴的右向为正 向 左向为负向 规定 y 轴的上向为正向 下向为负向 1 一个标准的二维笛卡 尔坐标系如图 5 1 1 1 所示 y x x y Origin 0 0 y x x y Origin 0 0 Point 2 3 图 2 1 笛卡尔坐标系和坐标 在二维坐标系中 用一个二维向量 x y 来表示点的位置 这个向量称为 坐标 坐标中的每一个量都表示了到相应轴的有符号距离 如图 2 1 所示 三维坐标系可以认为是在二维坐标系的基础上多了一条垂直于 xy 平面的 轴 我们称为 z 轴 1 三维坐标也可以相应认为是在二维坐标向量的基础上多了 一维向量 我们称为 z 向量 这样有助于我们在二维平面几何的基础上来理解三 维空间几何 初看来 三维空间只是比二维空间多了一个轴 似乎三维空间只比二维空间 复杂一点点而已 但事实并非如此 相对于二维空间来讲 三维空间理解和描述 的难度不只多一倍 这可能是我们平时用二维平面媒体来表现三维媒体的原因 1 7 所有二维坐标系都是等价的 但三维坐标系并非如此 三维空间有两种完全 不同的坐标系 左手坐标系和右手坐标系 左手坐标系指 伸出左手 让拇指与 食指垂直 拇指向右 食指向上 其余手指向前 这样就构成了一个左手坐标系 其中 拇指 食指和其余三个手指分别代表 x y z 轴 同样 右手坐标系指 伸出右手 让拇指与食指垂直 拇指向右 食指向上 其余手指向前 这样就构 成了一个右手坐标系 其中 拇指 食指和其余三个手指分别代表 x y z 轴 1 OpenGL 采用右手坐标系 OpenGL 坐标系主要有 全局固定坐标系 1 2 4 和移动局部坐标系 1 2 4 全局固定坐标系 相当于一般提到的世界坐标系 2 4 在该坐标系下考虑问 题时 不考虑坐标系的移动和转换 而只考虑物体的变换 即物体相对于坐标系 移动 移动局部坐标系 相当于一般提到的物体坐标系 2 4 在该坐标系下考虑问 题时 该坐标系是与物体紧紧关联在一起进行变换的 其实 这两种坐标系都是相对的 前者是物体相对于坐标系在变换 后者则 是坐标系相对于物体变换 然后在最终的坐标系中画出物体 如图 2 2 与 图 2 3 原图相对于全局坐标系逆时针旋转 30 度后 在全局坐标系中形成新图 G1 原图的移动坐标系相对于全局坐标系逆时针旋转 30 度后 在移动坐标系中画出 新图 G2 我们可以看到 G1 与 G2 是等价的 OpenGL 中的顺序变换为局部坐标变换 而逆序变换则为全局坐标变换 图 2 2 原图及原图相对于坐标系逆时针旋转 30 度后的图 y x y x G1 y x y x 8 图 2 3 原图及坐标系相对于原图逆时针旋转 30 度后在新坐标系中做的图 2 向量的应用 向量是三维数学研究的标准工具 是三维数学编程中基础也很有用的数据结 构 在几何意义上 向量是一个有大小 有方向的线段 在编程意义上 向量则 可以简单到一个数组 1 有时为了封装向量的运算 也可以将向量设计为一个类 在本系统设计中就把向量封装成一个类 Vector 向量的维度就是指向量中包含的数的个数 1 一般 在 N 维几何中就要用到 N 维向量 零向量是一种特殊的向量 它的每一维的值都是零 其大小也为零 而且零 向量是唯一一个没有方向的向量 并且规定零向量与所有向量都垂直 1 虽然零 向量看来没有什么意义 但零向量的特性是其他结构无法比拟的 首先 在几何 意义上 零向量可以表示没有发生位移 可以用来取投影运算 另外 在编程意 义上 零向量又可以作为默认值 并可以代表原点 1 向量和点在 N 维几何中所用的表示方法很类似 都是 N 维数字表示 例如 在三维几何中向量的表示方法是 x y z 点的表示方法是 x y z 二者在几何 意义上却完全不同 向量描述的是位移 而点描述的是位置 那么 在三维数学基础设计中是否需要考虑设计 Point 类呢 向量用来描述位移 自然包括了相对位置 而一个单独向量所表示的相对位 置正是顶点相对于原点的位移 用一个单独的点用来描述位置 这个位置同样是 相对于原点的 因此 在数值表示上向量与点是等价的 如图 2 4 表示了向量 x y 与点 x y 的相关性 可见 在程序设计中 只要明确用途 可以用向量来表示点 y x y x y x y x G2 9 图 2 4 向量与点的关系 假如在系统设计中增加了三维点 Point 类的设计 那么所带来的复杂性将不 仅仅是原来的两倍 在这一点上 我同意 3D 数学基础 图形与游戏开发 的 作者 Fletcher Dunn 与 Ian Parberry 的看法 单独的 Point 类在程序设计中所 带来的好处远远大于它带来的问题 1 例如 在使用向量类来代表点和向量的情况下 函数 Function1 能将点或者 向量绕某个轴旋转一个角度 函数 Function2 可以将点或者向量平移一段距离 函数 Function3 可以计算点到原点的位置也可以计算向量的长度等等 在添加了 三维点类后 这些函数要么都提供两个版本 要么必须实现向量与点的转换 向 量与点在数值上的等价性及其相关性 将导致大量的显示转换或者隐式转换 这 是任何设计者所不愿看到的 通过上面的讨论 可以得出结论 向量与点在表示意义上存在着等价性 只 要在设计和使用时 明确目的 根据这种等价性 便可以用一个类来表示向量和 点 从而有效地减少系统设计和代码编写 本次系统开发的实践也证明这个观点 是正确的 3 矩阵的应用 矩阵同样是三维几何的重要基础结构 它主要用来描述两个坐标系间的关 系 通过定义一种运算而将一个坐标系中的向量转换到另外一个坐标系中 在前 面我们把向量的维度定义为它所包含的数的个数 与之类似 矩阵的维度被定义 为它包含了多少行和多少列 1 一个 r c 的矩阵有 r 行 c 列 矩阵的变换是三维动画中主要用到的技术 首先 三维动画在场景的变换中 用到了大量的矩阵变换技术 如 视点的变换 2 4 模型的变换 2 4 投影的变 换 2 4 视口的变换 2 4 等 其本质就是一系列矩阵变换的融合 另外 三维动 画就是根据矩阵的旋转 平移等基本计算来变换坐标系 进而实现物体的各种复 杂运动的 和前面介绍的变换坐标系相比较 我们可以把旋转坐标系定义为 旋 转坐标系时 物体上的点实际上没有移动 我们只是在另外一个坐标系中描述它 的位置而已 1 OpenGL 中所有的观察类型的变换都可以规约为矩阵变换 首先 OpenGL 提供了基本的矩阵运算函数 即通用变换函数 其中包含了矩阵模型的修改 单 位矩阵的载入 矩阵的乘法运算等操作 此外 OpenGL 提供了一些内在的矩阵 10 运算函数 利用矩阵运算来表示坐标变换 实现了坐标物体的平移 缩放和旋转 另外 OpenGL 的视点变换 投影变换和视口变换等操作 都是由平移 缩放和 旋转等变换组合而成的 图 2 5 所示的是坐标系下矩阵的平移 旋转和缩放的效 果 图 2 6 展示了视口变换与物体变换的等价性 即视点变换同样是由平移 缩 放和旋转等变换来实现的 图 2 5 矩阵的平移 旋转和缩放 图 2 6 平移视口与平移物体 OpenGL 中通过矩阵变换将物体坐标转换为窗口坐标的流程如下 图 2 7 OpenGL 矩阵变换过程 11 OpenGL 中主要的矩阵操作函数如下 类别 名称 功能 通用变换函数 glMatrixMode Glenum 指定当前的矩阵模型 视口矩阵 投影矩阵 glLoadIdentity void 将当前矩阵指定为单位矩阵 glLoadMatrix TYPE 将当前矩阵指定为一个 4 4 的矩阵 glMultMatrix TYPE 将当前矩阵乘一个4 4的矩阵的结果作为当 前矩阵 模型变换函数 glTranslate x y z 将一个矩阵与当前矩阵相乘得到新的矩阵 以便将物体平移 x y z 个单位 glRotate angle x y z 将一个矩阵与当前矩阵相乘得到新的矩阵 以便将物体绕原点到点 x y z 的直线逆时 针旋转 angle 度 glScale x y z 将一个矩阵与当前矩阵相乘得到新的矩阵 以便将物体上每个点的坐标都分别乘以参数 x y 和 z 来达到缩放的目的 视点变换函数 gluLookAt 通过一系列的平移 缩放 旋转操作来定位 观察者的视点位置 投影变换函数 glFrustum 透视投影函数 glOrtho 正交投影函数 视口变化函数 glViewport 在窗口中指定一个显示图形的像素矩形 表 2 1 OpenGL 中主要的矩阵操作函数列表 2 2 物理运动学基础物理运动学基础 三维动画的实现与运动学是分不开的 动画 究其本质 就是物体位置或者 角度不断的改变 而位置和角度改变的因素在物理运动学中 被归结为速度和角 速度等变量 结合这些基础变量 我们对运动的理解变得直观 也将会有利于动 画中动作的设计 因此 本节主要讨论一些与运动相关的物理学知识 并在系统 的设计过程中将物理运行学知识与三维动画设计结合起来 1 概述 力学中描述物理运动的内容叫做运动学 运动学引进质点模型 即以具有一 定质量的点来代表物体 18 质点的位置可以用矢量的概念更简洁清楚地表示出来 为了表示质点在时刻 t的位置P 我们从原点向此点引一有向线段OP 并记作矢量r r的方向说明 了P点相对于坐标轴的方位 r的大小 即它的模 表明了原点到P点的距离 用来确定质点位置的这一矢量r叫做质点的位置矢量 简称位矢 质点在运动时 12 它的位矢是随时间改变的 这一改变一般可以用函数 trr 来表示 18 在空间几何中 位置矢量总可以用它的沿 3 个坐标轴的分量表示 位置矢量 r沿 3 个坐标轴的分量分别是 zyx 以 kji 分别表示沿 zyx 轴正方向的单位 矢量 则位矢r和它的 3 个分量的关系就可以用矢量合成公式 zkyjxir 表示 18 位置矢量的运动函数为 ktzjtyitxtr 18 y x z r t x t y t z t 图 2 8 三维场景中的位移表示 2 匀变速运动 质点在一段时间内位置的改变叫做它在这段时间内的位移 设质点在t和 tt 时刻分别通过 P 和 1 P 点 其位矢分别是 tr 和 ttr 则由P引到 1 P 的矢 量表示位矢的增量 即 trttrr 18 位移 r 和发生这段位移所经历的时间的比叫做质点在这一段时间内的平均 速度 以v表示平均速度 就有 t r v 18 当 t 趋于零时 t r v 的极限 即质点位矢对时间的变化率 叫做质点在时 刻t的瞬时速度 简称速度 用v表示速度 就有 dt dr t r v t 0 lim 18 速度变化的情况用加速度表示 以 tv 和 ttv 分别表示质点在时刻t和时 刻 tt 的速度 则在这段时间内的平均加速度 a 由下速度式定义 13 t v t tvttv a 18 当 t 趋于零时 此平均加速度的极限 即速度对时间的变化率 叫质点在 时刻t的瞬时加速度 简称加速度 以a表示加速度 就有 dt dv t v a t 0 lim 18 图 2 9 位移 速度和加速度 3 匀变速圆周运动 质点沿圆周运动时 它的速率通常加线速度 线速度v就可用 dt ds v 来表示 以 表示半径R从OA位置开始转过的角度 则 Rs 将此关系带入上式 由 于R是常数 可得 dt d Rv 式中 dt d 叫做质点运动的角速度 它的 SI 单位是 rad s 或 1 s 常以 表示角速度 即 dt d 这样就有 Rv 18 质点做圆周运动时 它的线速度可以随时间改变或不改变 但是由于其速度 矢量的方向总是在改变着 所以总是有加速度 由加速度的定义可得 圆周运动 的加速度为 t v t tvttv a tt 00 limlim 18 用 dt d 来表示质点运动角速度对时间的变化率 叫做角加速度 18 14 O A x s v 图 2 10 线速度与角速度 2 3 三维图形操作三维图形操作 三维图形的操作主要包括图形的变换 图形的裁剪和视口的变换 其中 三 维图形的变换是通过矩阵的乘法来进行的 主要实现图形的平移 旋转 缩放 反射 正交投影和透视投影 裁剪则是指通过三维几何计算剔除掉裁剪面以外的 物体 视口变换在图形显示时被用到 它将变换后的坐标与屏幕像素之间建立了 对应关系 图形变换与视口变换归根结底都是矩阵的变换 矩阵变换的相关内容已在上 文详细阐述 OpenGL 中三维图形的裁剪主要包括视景体的裁剪和附加裁剪 OpenGL 中提供了两种视景体的定义 透视投影和正交投影 2 4 其中 透 视投影中视景体被定义为一个棱锥台 2 在这种视景体中物体离观察点越远 在 图像上显示得就越小 这种投影方法与人眼的工作原理相近 因此常被用于动画 视觉模拟等 在正交投影中 视景体被定义为一个平行六面体 2 在这种视景体 中物体离观察点的远近并不影响物体在图像中的大小 这种投影常用于绘制建筑 图和计算机辅助设计中 定义了视景体之后 任何位于视景体之外的图元将会被 裁剪掉 图 2 11 透视视景体与正交视景体 15 除了视景体的 6 个裁剪面以外 OpenGL 规定最多还可以定义 6 个附加面 来更严格地限制视景体 在这些附加面以外的图元同样会被剔除掉 2 2 4 三维渲染技术三维渲染技术 三维场景构造过程中用到的渲染技术主要有 颜色 光照 混合 雾效 纹 理等 颜色使三维物体可以区别于背景色而被识别和区分 光照使三维物体的颜 色渲染具有了深度和立体感 混合功能可以使物体具有透明效果 雾效和纹理则 使三维场景和三维物体更具有真实感 1 颜色 颜色 作为人眼分辨物体最基本的要素是图形渲染技术中不可缺少的部分 从物理学的角度来将 人眼实际看到的颜色是频率不同的光子混合后的结果 在 可见光的光谱中 光子的波长为 390nm 紫色 到 720nm 红色 包括紫色 靛青 蓝色 绿色 黄色 橙色和红色 这些光子的混合就形成了多种多样的颜 色 如 白色 黑色 褐色 粉红色等 2 3 人体视网膜上的细胞受到光的刺激后 人眼便能感知到颜色 有三种视锥细 胞对三种波长的光最敏感 分别是红光 绿光和蓝光 计算机显示器通过让像素 发出三种颜色的光 来模拟可见的颜色 其中红 绿 蓝对感知红 绿 蓝的视 锥细胞产生的刺激程度与要模拟的光相同 为了显示特定的颜色 显示器发射相 应比例的红光 绿光和蓝光 RGB 来刺激眼睛中不同类型的视锥细胞 进而使 人眼看到各种不同的颜色 2 OpenGL 中采用了两种颜色模式 RGBA 模式和颜色索引模式 在 RGBA 模 式下 显示的每个像素点都是由 RGBA 的颜色分量组成的 在颜色索引模式下 OpenGL 提供了一个颜色查找表来对应于不同的颜色 每个像素点对应了一个索 引信息 在 RGBA 模式下 使用 glColor 来设置当前颜色 在颜色索引模式下使 用 glIndex 来设置当前颜色索引 无论在哪种模式下 每个像素都存储了一定数量的颜色信息 通常为 RGB 平均地分配存储空间 或者为 RGBA 平均地分配存储空间 在 OpenGL 中 可 以 使 用 参 数GL RED BITS GL GREEN BITS GL BLUE BITS GL ALPHA BITS 和 GL INDEX BITS 调用函数 glGetIntegerv 来查询分配给每 个像素分量的存储空间 2 5 2 光照 人眼对颜色的感知源自于光照 在三维场景的构造过程中 同样需要光照的 配置 在晴空万里和乌云密布时 大海的颜色是不同的 2 晴空万里时 海面看 起来是亮蓝色 而乌云密布时 海面看起来是灰绿色的 在三维场景的显示时 没有光照渲染的物体看起来往往很难分辨其三维效果 OpenGL 的光照技术主要包括了光照环境的配置和物体材质的配置 OpenGL 至少允许在场景中使用 8 个光源 名称分别是 GL LIGHT0 GL LIGHT1 GL LIGHT7 以这些名称作为参数调用函数 glEnable 并同时 使用 glEnable GL LIGHTING 来启动相应的光源效果 4 OpenGL 将三维场景中的光分为 4 个独立的部分 环境光 2 4 散射光 2 4 镜面反射光 2 4 和发射光 2 4 分别对应于枚举值 GL AMBIENT GL DIFFUSE 16 GL SPECULAR GL EMISSION 5 这 4 种光被分别计算 然后叠加起来 其中 环境光是指经过环境中多次散射 无法确定其方向的光 散射光来自 于同一个方向 当它到达物体的表面时 将延各个方向均匀的散射 镜面反射光 来自于同一方向 也被反射到同一方向 发射光是对于发光物体设计 比如房间 中的灯泡 行星演示系统中的太阳 另外 OpenGL 还提供了 4 种光照模型 全局环境光的强度 观察点是靠近 场景还是位于无穷远处 对物体的正反两面是否同时采取光照计算 是否将镜面 反射颜色与散射颜色分开计算 2 进行光照配置时 不仅要配置环境中的光线 还要配置物体的材质 不同材 质的物体对光线的反应不同 因而 在相同环境下 不同材质的物体表现的效果 也不相同 物体材质在光照配置中 主要配置其环境颜色 散射颜色 镜面反射 颜色 光泽度和发射光的颜色 物体看起来的颜色很大程度上是由物体散射光反 射率决定的 3 混合与雾效 混合功能主要用到了 RGBA 中的 Alpha 值 我们可以将 RGB 分量视作像素 的颜色 而 Alpha 值则可以看作像素的不透明度 因此 减小像素的 Alpha 值就 会增加像素的透明度 OpenGL 通过 glEnable GL BLEND 来启动混合功能 2 5 在混合过程中 分两步将输入片元的颜色值与当前存储在帧缓存中的像素合并起来 首先 指定 如何计算源因子和目标因子 这些因子是 RGBA 四元组 它们分别与源和目标 RGBA 分量相乘 然后 将这两个 RGBA 四元组中对应的分量相加 2 假定源 RGBA 值为 ssss ABGR 目标 RGBA 值为 dddd ABGR 源因 子为 abgr SSSS 目标因子为 abgr DDDD 则混合后的RGBA值如下 adasbdbsgdgsrdrs DASADBSBDGSGDRSR 2 最后 将最终RGBA四元组的各分量截取到 0 1 区间 2 雾 是一个通用的术语 它描述了类似于大气效果的各种形态 可用于模拟 薄雾 烟雾等 雾效被启用后 场景中远方的物体看起来已融入背景中 更接近 于现实效果 2 OpenGL中可以通过glEnable GL FOG 来启用雾效 并且可以通过函数 glFog中相关参数的设置来配置场景中雾的颜色 密度 远近等 5 4 位图 图像与纹理 位图 又称光栅图 是由0和1组成的阵列 通过指定光栅位置来确定位图 绘制的屏幕坐标 在绘制过程中 如果当前像素位为0则不绘制信息 如果为1 则按照当前的光栅颜色绘制像素 OpenGL中的位图通常用于字体的绘制 通过 函数glRasterPos来指定当前的光栅位置 通过函数glBitmap在当前的光栅位置 绘制位图 2 4 5 图像类似于位图 但不像位图那样只包含屏幕矩形区域内每个像素的1位信 息 图像可以包含更多的信息 比如 图像可以包含存储在每个像素中的RGBA 17 值 图像在OpenGL中可以被写入到深度缓存和模板缓存中 还可以从深度缓存 和模板缓存中读取像素阵列 OpenGL图像在处理过程中 主要用到的技术有 像素的封装和拆封 像素的存储 像素的转移 像素的映射 图像的旋转和缩放 2 图像在三维场景渲染中除了被显示到屏幕上外 主要用作纹理贴图 2 3 4 将图像粘贴到多边形上 以达到渲染的效果 纹理是一个数组 其中的数据为颜色和alpha值 2 纹理数组中的值通常被 称为纹素 2 矩形的纹理可以被映射到矩形或非矩形区域 通过纹理映射 可以 将整个墙壁绘制成一个多边形 然后将一幅砖墙的图像贴到多边形上 而使这个 多边形具有了墙壁外观 同样可以在一个球体上贴上一幅地球外观图 而使这个 球体具有地球的外观 通过纹理映射技术和纹理映射算法 可以将任意的图像粘 贴到任意的三维图形上去 而组合成特定的效果 OpenGL中只能在RGBA模式 下使用纹理映射 OpenGL 中使用纹理映射的步骤 2 如下 1 创建纹理对象并为其指定纹理 纹理对象可以在程序中通过数组创建 也可以载入BMP图像文件创建 2 指出如何将纹理应用于每个像素 3 启用纹理映射 4 使用纹理坐标和几何坐标来绘制场景 在粘贴纹理之前 必须指定纹 理和图形之间的对应关系 比如 在为墙壁指定砖块纹理时 需要将砖块图像的 坐标与墙壁图形的坐标一一对应起来 5 效果的启用与禁用 OpenGL中光照 混合 雾效 纹理等效果默认情况下都是关闭的 需要调 用glEnable并利用代表效果的枚举值作为参数来启用对应的效果 同样 以效果 的枚举值作为参数来调用glDisable可以禁用对应的效果 5 渲染效果与对应的 OpenGL枚举值列表如下 渲染类型 对应枚举值 描述 光照 GL LIGHTING 光照功能 GL LIGNTn 第 n 个光照模型 混合 GL BLEND 混合功能 雾效 GL FOG 雾效功能 纹理 GL TEXTURE 1D 一维纹理 GL TEXTURE 2D 二维纹理 GL TEXTURE 3D 三维纹理 表2 2 OpenGL枚举值列表 18 3 系统的构架系统的构架 3 1 设计思路设计思路 首先 提供三维动画中所需几何算术的相关操作 然后 结合物理运动学的 方法 将OpenGL中提供的静态图形变换转换为物理运行学模式下的动态运动 将OpenGL中繁琐的图形显示和渲染封装到类中 并提供图形构造的文件存储模 式 进而 结合图形的构造和运动模式的设计 构造出三维动画中的可动物体 并提供三维图形的容器和组合方式 结合面向对象的思路 提出一个脚本系统并 将脚本操作与三维动画中的配置 计算 演示等操作结合起来 最后 在MFC 可视化界面中将脚本编辑 解释和三维动画的演示融合在一起 形成一个交互性 好 可用性强的系统 3 2 框架结构框架结构 本系统的设计与实现主要分7个模块 基本数据结构 三维图元的显示和渲 染 动作的委托 三维动画物体 动画中的交互性能 Ani Ware脚本系统 MFC 可视化窗口系统 这些模块的结构和关系如下所示 图3 1 系统模块结构图 19 图3 2 系统模块关系图 20 4 系统的设计与实现系统的设计与实现 4 1 基本数据结构模块基本数据结构模块 向量 矩阵 点作为三维几何中基本的数据结构和研究工具 是三维图形设 计中不可缺少的单元 而带值向量 如 速度 加速度 力等 作为质点运动学 的基本数据变量 同样是三维动画设计中不可缺少的数据结构 通过向量与点的等价性的讨论 我们可以在系统的设计中 只用其中的一个 数据结构便可以互相代表 而且可以避免编程过程中相互转换导致的复杂性 在 该系统的设计中 采用了向量来表示点 可以称之为 向量 点 由于在OpenGL中提供了硬件支持的功能全面的矩阵操作函数 矩阵的应用 中讨论的矩阵变换函数 矩阵操作函数等 正如 OpenGL Programming Guide 的作者所提的那样 在使用OpenGL进行三维变换的时候 尽量地利用OpenGL 提供的矩阵操作函数 而不要自己来实现 因为OpenGL中的矩阵操作函数都是 基于硬件来实现了 可以很大程度上提高显示的性能 2 所以在本系统的设计 中全部使用了OpenGL自带的矩阵函数 而没有自定义矩阵的相关操作 4 1 1 三维向量类的设计原则三维向量类的设计原则 向量主要用到的运算 加 减 乘 除 以及取模的运算 对应于点的位移 缩放以及到原点的距离 其中乘法包括点乘和叉乘 由于加减乘除这些基本运算在系统中提供了对应的运算符重载 因此 对这 项操作提供重载函数可以提高程序的编写效率和代码的可读性 但是 如果对系 统中的操作重载过多的意义不明确的操作符 反而会降低代码的可读性 因此 三维向量类的设计中为保证代码的清晰易懂 仅对意义明确的操作和操作符关系 提供重载 另外 系统设计的另一个原则就是尽可能的使用const引用参数 1 const引 用参数在形式上是传值 而实际上是传地址 可以避免调用构造函数 有助于提 高运行效率 另外 const修饰的参数 在使用过程中可以接受const和非const 类型的值 比没有const修饰的参数能接受更多的输入 系统为三维向量类添加了两个比较实用的运算 投影和垂线 这两个操作在 冲突检测和冲突响应的计算中应用较多 y x x y 投影 y x x y 垂线 21 图4 1 投影和垂线的图释 4 1 2 带值向量类的设计思路带值向量类的设计思路 速度 加速度 力等向量的存储结构和使用方式相同 而且这些向量完全可 以用三维向量来表示 然而 这些向量在使用过程中 大小和方向一般是分开考 虑的 三维向量只是显示表示了这些向量的方向 而没有对它们的大小作出定义 实践证明 对三维结构的速度 加速度 力等向量进行大小的相关操作会变得比 较复杂 以速度为例 当速度用三维向量表示时 每次获得速度的大小都要进行取模 运算 而取模运算中由于包含了开平方 所以每次取模的开销都比较大 另外 对速度的大小进行设置更是要进行复杂的运算 三维向量中各个值都需要改变 因此 这里提出了带值向量 把原来的三维向量的扩展为一个表示大小的数 值和一个表示方向的三维向量 这样 获得向量的大小或者方向都变得简单 而 且对大小或者方向的设置可以在类的内部实现 从而可以简化使用过程中的复杂 性 并提高代码的运行效率 图4 2 三维向量和带值向量 4 2 三维图元模块三维图元模块 三维图元是指组成三维可视图形的基本图形元素 在二维场景中 可以称的 上二维图元的主要有 直线 线段 三角形 四边形 圆 扇形等 而在三维 场景中 三维图元主要有 直线 线段 三角形 四边形 球 柱体 椎体等 在OpenGL中已经实现了基于硬件的图元绘制 如 多边形 球体 圆柱体 圆 锥体 盘体等 因此 将三维图形的显示分解为多个图元的显示 不仅可以简化 复杂图形的设计 而且可以提高三维图形的显示效率 在本系统的设计和实现中 通过分析OpenGL中三维图形的生成 显示
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论