OpenGL技术教学课件

上传人:wux****ua 文档编号:22927704 上传时间:2021-06-02 格式:PPT 页数:106 大小:1.89MB
收藏 版权申诉 举报 下载
OpenGL技术教学课件_第1页
第1页 / 共106页
OpenGL技术教学课件_第2页
第2页 / 共106页
OpenGL技术教学课件_第3页
第3页 / 共106页
资源描述:

《OpenGL技术教学课件》由会员分享,可在线阅读,更多相关《OpenGL技术教学课件(106页珍藏版)》请在装配图网上搜索。

1、第 10章 OpenGL10.1 简 介10.2 OpenGL基 本 程 序 结 构10.3 OpenGL程 序 设 计 入 门 10.1 简 介10.1.1 什 么 是 OpenGL?OpenGL是 一 个 功 能 强 大 的 开 放 图 形 库 ( Open Graphics Library) 。 其 前 身 是 SGI公 司 为 其 图 形工 作 站 开 发 的 IRIS GL。 为 使 其 能 够 更 加 容 易 地移 植 到 不 同 的 硬 件 和 操 作 系 统 , SGI开 发 了OpenGL。OpenGL被 打 造 为 开 放 性 标 准 , 任 何 软 硬 件 厂 商均 可

2、自 由 使 用 , 这 让 它 受 到 广 泛 的 欢 迎 。 1992年 7月 , SGI正 式 发 布 OpenGL 1.0标 准 。 OpenGL 1.0完 全 实 现 了 SGI的 预 期 设 计 目 标 : 功 能 强 大 、 移 植性 良 好 并 能 自 由 使 用 。 SGI和 微 软 进 行 首 次 合 作 、 联 手将 OpenGL 1.0移 植 到 Windows NT平 台 。 1995年 , SGI推 出 了 更 为 完 善 的 OpenGL 1.1版 本 。OpenGL 1.1的 性 能 比 1.0版 提 高 甚 多 , 同 时 还 加 入 了 诸如 顶 点 数 组

3、、 顶 点 位 置 、 新 纹 理 等 新 特 性 , 并 增 强 了元 文 件 对 OpenGL的 调 用 等 等 。 OpenGL 1.1同 样 获 得 了成 功 , 而 它 也 有 对 应 的 Windows NT版 本 。 1992年 成 立 的 独 立 财 团 OpenGL Architecture Review Board (ARB)控 制 。 SGI等 ARB成 员 以投 票 方 式 产 生 标 准 , 并 制 成 规 范 文 档(Specification)公 布 , 各 软 硬 件 厂 商 据 此 开 发 自己 系 统 上 的 实 现 。 只 有 通 过 了 ARB规 范 全

4、 部 测试 的 实 现 才 能 称 为 OpenGL。 1995年 12月 ARB批 准 了 1.1版 本 , 1999.5通 过 的 1.2.1。 2003年 的7月 , ARB公 布 OpenGL 1.5规 范 这 也 是 迄今 为 止 最 新 的 OpenGL版 本 。 10.1.2 OpenGL的 特 点从 程 序 开 发 人 员 的 角 度 来 看 , OpenGL是 一 组绘 图 命 令 的 API集 合 。 利 用 这 些 API能 够 方 便 地描 述 二 维 和 三 维 几 何 物 体 , 并 控 制 这 些 物 体 按某 种 方 式 绘 制 到 显 示 缓 冲 区 中 。

5、OpenGL的 API集 提 供 了 物 体 描 述 、 平 移 、 旋 转 、 缩 放 、 光 照 、纹 理 、 材 质 、 像 素 、 位 图 、 文 字 、 交 互 以 及 提高 显 示 性 能 等 方 面 的 功 能 , 基 本 涵 盖 了 开 发 二 、三 维 图 形 程 序 所 需 的 各 个 方 面 。 与 一 般 的 图 形开 发 工 具 相 比 , OpenGL具 有 以 下 几 个 突 出 特点 : ( 1) 跨 平 台 特 性 OpenGL与 硬 件 、 窗 口 和 操 作 系 统 是 相 互 独 立 的 。为 了 构 成 一 个 完 整 功 能 的 图 形 处 理 系

6、统 , 其 设 计 实 现共 分 5 层 : 图 形 硬 件 、 操 作 系 统 、 窗 口 系 统 、 OpenGL和 应 用 软 件 。 因 而 , OpenGL可 以 集 成 到 各 种 标 准 窗 口 和 操 作系 统 中 。 例 如 , 操 作 系 统 包 括 UNIX,Windows NT, Windows 95/98, DOS等 ; 窗 口 系 统 包 括 X Windows, Microsoft Windows等 。 ( 2) 应 用 的 广 泛 性OpenGL是 目 前 最 主 要 的 二 、 三 维 交 互 式 图 形 应 用 程序 开 发 环 境 , 已 成 为 业 界

7、最 受 推 荐 的 图 形 应 用 编 程 接口 。 自 从 1992年 发 表 以 来 , OpenGL已 被 广 泛 地 应 用于 CAD/CAM、 三 维 动 画 、 数 字 图 像 处 理 以 及 虚 拟 现实 等 领 域 , Kinetix公 司 的 3D Studio Max就 是 突 出 的代 表 。 无 论 是 在 PC机 上 , 还 是 在 工 作 站 甚 至 是 大 型机 和 超 级 计 算 机 上 , OpenGL都 能 表 现 出 它 的 高 性 能和 强 大 威 力 。 ( 3) 网 络 透 明 性 建 立 在 客 户 /服 务 器 模 型 上 的 网 络 透 明 性

8、 是OpenGL的 固 有 特 性 , 它 允 许 一 个 运 行 在 工 作 站 上 的进 程 在 本 机 或 通 过 网 络 在 远 程 工 作 站 上 显 示 图 形 。 利用 这 种 性 质 能 够 均 衡 各 工 作 站 的 工 作 负 荷 ,共 同 承 担图 形 应 用 任 务 。( 4) 高 质 量 和 高 性 能 无 论 是 在 CAD/CAM、 三 维 动 画 还 是 可 视 化 仿 真等 领 域 , OpenGL高 质 量 和 高 效 率 的 图 形 生 成 能 力 都能 得 到 充 分 的 体 现 。 在 这 些 领 域 中 , 开 发 人 员 可 以 利用 OpenGL

9、制 作 出 效 果 逼 真 的 二 、 三 维 图 像 来 。 ( 5) 出 色 的 编 程 特 性 OpenGL在 各 种 平 台 上 已 有 多 年 的 应 用 实践 , 加 上 严 格 的 规 范 控 制 , 因 此 OpenGL具 有良 好 的 稳 定 性 。 OpenGL具 有 充 分 的 独 立 性 与 易 使 用 性 等 。 10.2 OpenGL基 本 程 序 结 构 Windows 95/98以 及 Windows NT 3.51 以 上 的 操作 系 统 中 提 供 了 OpenGL的 动 态 库 , 在 VC+2.0 以 上 的 版 本 中 提 供 了 OpenGL的 静

10、 态 库 , 所 以 ,使 用 OpenGL编 程 , 在 微 机 上 使 用 时 , 最 好 是在 上 述 软 件 环 境 中 编 写 OpenGL程 序 。 在 微 机 版 本 中 , OpenGL 提 供 了 三 个 函 数 库 ,它 们 是 基 本 库 、 实 用 库 和 辅 助 库 。 10.2.1 Windows系 统 下 的 OpenGL函 数 OpenGL的 基 本 库 是 OpenGL的 核 心 函 数 库 , 在 这个 函 数 库 中 , 提 供 了 115个 函 数 , 这 些 函 数 都 是 以“ gl”为 前 缀 。 这 类 API的 主 要 功 能 包 括 物 体

11、描 述 、平 移 、 旋 转 、 缩 放 、 光 照 、 纹 理 、 材 质 、 像 素 、 位图 、 文 字 处 理 等 。所 有 OpenGL 提 供 的 操 作 都 可 以 使 用 这 些 函 数 来 实现 , 而 且 , 对 于 不 同 的 软 件 和 硬 件 平 台 , 这 些 函 数的 使 用 是 完 全 相 同 的 , 这 个 特 性 注 定 了 OpenGL程序 完 美 的 可 移 植 性 。 OpenGL的 实 用 库 是 OpenGL基 本 库 的 一 套 子 程 序 ,它 提 供 了 43个 函 数 , 这 些 函 数 都 是 以 ” glu”为 前 缀 。基 本 的 O

12、penGL不 支 持 传 统 上 同 图 形 标 准 相 关 的 一些 几 何 对 象 , 为 了 减 少 一 些 编 程 负 担 , OpenGL提供 了 实 用 库 。 主 要 功 能 包 括 绘 制 二 次 曲 面 、NURBS曲 线 曲 面 、 复 杂 多 边 形 以 及 纹 理 、 矩 阵 管理 等 。实 用 库 中 的 所 有 函 数 全 都 是 由 OpenGL基 本 库 函 数来 编 写 的 , 所 以 , 在 使 用 上 和 OpenGL基 本 库 的 使用 是 完 全 相 同 的 , 而 且 , 用 户 也 可 以 使 用 基 本 函数 库 来 实 现 实 用 库 的 函

13、数 功 能 。 OpenGL的 辅 助 库 是 为 了 方 便 用 户 用 标 准 C编 写 OpenGL程 序 而 编 写 的 。 OpenGL是 一 个 图 形 标 准 , 所 以 , 在OpenGL中 没 有 提 供 窗 口 管 理 和 消 息 事 件 响 应 的 函 数 ,这 样 使 用 标 准 C 编 写 OpenGL程 序 是 很 不 方 便 的 , 所 以提 供 了 辅 助 库 。 它 提 供 了 31个 函 数 , 这 些 函 数 都 是 以“ aux”为 前 缀 。 OpenGL辅 助 库 提 供 了 一 些 基 本 的 窗 口管 理 函 数 、 事 件 处 理 函 数 和

14、一 些 简 单 模 型 的 制 作 函 数 等 ,例 如 , 定 义 窗 口 的 大 小 、 处 理 键 盘 时 间 、 鼠 标 击 键 事 件 、绘 制 多 面 体 等 等 。 10.2.2 一 个 简 单 的 OpenGL程 序下 面 将 通 过 一 个 简 单 的 OpenGL 程 序 来 说 明 OpenGL头 文件 的 使 用 、 语 法 规 则 、 程 序 的 基 本 结 构 、 程 序 的 运 行 环境 配 置 。例 10.1 OpenGL 例 程 sample.c#include #include #include #include #include void myinit(v

15、oid); void CALLBACK myReshape(int w, int h);void CALLBACK display(void); void myinit(void) /初 始 化glClearColor(0.0,0.0,0.0,0.0); /将 窗 口 清 为 黑 色void CALLBACK display(void)glClear(GL_COLOR_BUFFER_BIT); /将 颜 色 缓 存 清 为 glClearColor命 令 所 设 置 的 颜 色 , 即 背 景 色glColor4f(0.2,0.8,1.0,1.0); /选 颜 色 (R,G,B)glRotat

16、ef(30,1.0,1.0,0.0); /做 旋 转 变 换auxWireCube(1.0); /绘 制 六 面 体 的 虚 线 图glFlush(); /强 制 绘 图 , 不 驻 留 缓 存 void CALLBACK myReshape (int w, int h) /用 于 窗 口 大 小 改 变 时 的 处 理 ,与 绘 图 无 关glViewport(0,0,w,h);void main(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); /窗 口 显 示 单 缓 存 和RGB(彩 色 )模 式auxInitPosition(0,0,200,

17、200); /大 小 x=200 y=200 (0,0)是 屏 幕 左 上 点auxInitWindow(“openglsample.c”); /初 始 化 窗 口 , 参 数 是 标 题myinit(); auxReshapeFunc(myReshape);auxMainLoop(display); 1. 头 文 件 使 用若 应 用 程 序 使 用 OpenGL核 心 函 数 , 应 包 括 头 文件 ;使 用 GLU库 函 数 , 应 包 括 头 文 件 ;使 用 AUX库 函 数 , 应 包 括 头 文 件 ; 使 用 WGL和 Win32应 包 括 头 文 件 。2. 回 调 ( C

18、ALLBACK) 函 数CALLBACK函 数 是 一 些 用 来 让 系 统 调 用 的 函 数 ,系 统 调 用 它 们 来 实 现 显 示 、 接 受 输 入 事 件 功 能 。 3. 语 法 规 则OpenGL基 本 库 的 所 有 操 作 函 数 都 是 以 “ gl”为 前 缀 的 。实 用 库 的 所 有 操 作 函 数 都 是 以 “ glu”为 前 缀 。 辅 助 库 的所 有 操 作 函 数 都 是 以 “ aux”为 前 缀 的 。 OpenGL命 令 带有 后 缀 。以 sample.c中 的 glColor4f为 例 , 前 缀 “ gl”指 这 个 函 数 是Ope

19、nGL的 核 心 库 函 数 , 组 成 命 令 的 单 词 首 字 母 大 写 ,如 “ Color”; 后 缀 “ 4”表 示 颜 色 值 是 由 4个 变 量 来 表 示的 ; “ f ”表 示 所 表 示 颜 色 的 每 个 分 量 的 类 型 为 32位 浮 点数 。OpenGL核 心 库 函 数 常 量 是 以 “ GL_” 开 头 , 均 用 大 写字 母 , 并 用 下 划 线 将 每 个 关 键 词 分 开 , 如GL_COLOR_BUFFER_BIT。 4. 程 序 的 基 本 结 构 一 个 OpenGL程 序 的 基 本 结 构 是 很 简 单 的 , 无 论 多 么

20、复 杂的 OpenGL程 序 , 可 以 大 致 分 解 成 以 下 部 分 :( 1) 定 义 窗 口Windows 系 统 下 的 OpenGL实 现 提 供 了 一 个 辅 助 函 数 库 aux,用 于 解 决 开 窗 口 和 处 理 输 入 事 件 等 问 题 。窗 口 管 理 函 数 :首 先 , 调 用 void auxInitDisplayMode(Glbitfield mask) 函数 定 义 窗 口 的 特 性 , 如 颜 色 和 缓 存 区 的 性 质 。 例 如 :auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); /窗 口 显 示 单 缓

21、 存 和 RGB(彩 色 )模 式 其 次 , 调 用 void auxInitPosition(Glint x,Glint y, Glint width, Glint height)定 义 窗 口 在 屏 幕 上 的 位 置 和 大 小 。 其中 , x,y为 窗 口 左 上 角 的 坐 标 , width,height 分 别 为 窗 口 的宽 和 高 (像 素 个 数 )。 默 认 值 为 (0,0,100,100)。 例 如 :auxInitPosition(0,0,200,200); /大 小 x=200 y=200 (0,0)是 屏 幕 左 上 点最 后 , 完 成 上 述 两 个

22、 函 数 调 用 后 , 用 函 数 void auxInitWindow(Glbyte *titleString)打 开 窗 口 。 窗 口 的 标题 为 字 符 串 titleString。 窗 口 把 ESC键 与 退 出 函 数 联 系 起来 , 可 以 用 来 关 闭 窗 口 , 退 出 程 序 。 例 如 :auxInitWindow(“openglsample.c”); /初 始 化 窗 口 , 参 数 是 标 题 处 理 输 入 事 件 :当 改 变 窗 口 尺 寸 、 移 动 窗 口 、 重 新 显 示 窗 口 时 ,由 auxReshapeFunc(myReshape)调

23、用 函 数myReshape重 新 定 义 窗 口 属 性 。通 常 myReshape函 数 调 用 glViewPort函 数 , 对 当前 图 形 进 行 裁 剪 , 重 新 定 义 投 影 矩 阵 等 。OpenGL辅 助 函 数 库 中 还 包 括 处 理 键 盘 和 鼠 标 输入 事 件 的 函 数 。 ( 2) 初 始 化 操 作由 于 OpenGL的 绘 图 方 式 是 由 一 系 列 的 状 态 确 定 的 , 因 而 在 绘制 图 形 前 需 要 做 一 些 准 备 工 作 , 包 括 清 缓 存 区 ( buffer) 、 定义 光 照 模 型 、 定 义 纹 理 映 射

24、 等 基 本 操 作 的 初 始 化 状 态 、 设 置三 维 视 景 体 、 定 义 视 口 。 例 如 :glClearColor(0.0,0.0,0.0,0.0); /将 窗 口 清 为 黑 色glClear(GL_COLOR_BUFFER_BIT); /将 颜 色 缓 存 清 为 glClearColor命 令 所 设 置 的 颜 色 , 即 背 景 色 ( 3) 设 置 观 察 坐 标 系 下 的 取 景 模 式 和 取 景 框 位 置 及 大 小主 要 利 用 了 三 个 函 数 : 函 数 void glViewport(GLint x, Glint y, Glsizei wid

25、th, Glsizei height): 设 置 在 屏 幕 上 的 视 口 大 小 , 四 个 参 数 描 述屏 幕 视 口 四 个 角 上 的 坐 标 ( 以 像 素 表 示 ) 。参 数 (x,y)用 于 指 定 视 口 的 左 下 角 在 窗 口 坐 标 系 中 的 位 置 ,参 数 width和 height分 别 确 定 矩 形 视 口 的 宽 和 高 , 均 以 像 素为 单 位 。注 意 : 视 口 的 大 小 和 尺 寸 是 在 窗 口 坐 标 系 中 进 行 度 量 的 ,默 认 状 态 下 其 坐 标 原 点 位 于 窗 口 的 左 下 角 , 其 尺 寸 与 窗 口的

26、大 小 相 同 。 视 点 方 向 观 察 体 积 函 数 void glOrtho(left,right,bottom,top,near,far):设 置 投 影 方 式 为 正 交 投 影 ( 平 行 投 影 ) , 其 取 景 体 积是 一 个 各 面 均 为 矩 形 的 六 面 体 。 函 数 void gluPerspective(fovy,aspect,zNear,zFar): 设 置投 影 方 式 为 透 视 投 影 , 其 取 景 体 积 是 一 个 截 头 锥 体 , 在这 个 体 积 内 的 物 体 投 影 到 锥 的 顶 点 。它 通 过 指 定 x-z平 面 内 的 视

27、 角 大 小 及 宽 高 比 来 确定 沿 视 线 方 向 的 棱 锥 , 并 通 过 指 定 远 、 近 剪 切 面与 视 点 间 的 距 离 来 截 断 棱 锥 , 得 到 观 察 体 。 注 : 在 默 认 状 态 下 投 影 方 式 为 平 行 正 交 投 影 。 ( 4) 使 用 OpenGL的 库 函 数 构 造 几 何 物 体 对 象 的数 学 描 述 。 包 括 点 线 面 的 位 置 和 拓 扑 关 系 、 几 何变 换 、 光 照 处 理 等 。 这 是 OpenGL程 序 的 主 要 部 分 。在 例 10.1中 , 在 函 数 void CALLBACK display

28、(void)中 写 好要 绘 制 的 三 维 图 形 , 然 后 , 在 主 程 序 中 调 用auxMainLoop(display)就 可 让 该 图 形 一 直 显 示 。 ( 5) 程 序 的 微 机 运 行 环 境 配 置 软 件 与 硬 件 环 境 操 作 系 统 : Windows 95/98, Windows NT 软 件 开 发 环 境 : Microsoft Visual C+4.0及 以 上 版 本 硬 件 : 奔 腾 级 微 机 , 最 好 配 有 支 持 OpenGL硬 加 速 的 图 形 卡 连 接 三 个 静 态 库 程 序 中 除 了 包 含 必 需 的 头 文

29、 件 如 外 , 在 创 建 执 行 文 件 时 , 在 VC环境 设 置 中 要 连 接 opengl32.lib, glu32.lib和 glaux.lib 三 个 函 数 库 。 运行 已 创 建 的 执 行 文 件 时 , 在 windowssystem目 录 下 要 有opengl32.dll, glu32.dll两 个 动 态 连 接 库 。 10.3 OpenGL程 序 设 计 入 门 OpenGL的 状 态 机 制 OpenGL中 的 图 元 绘 制 坐 标 变 换 及 其 OpenGL实 现 应 用 变 换 的 一 个 实 例 光 照 处 理 10.3.1 OpenGL的 状

30、 态 机 制OpenGL的 绘 图 方 式 是 由 一 系 列 的 状 态 决 定 的 , 如 果 设 置 了一 种 状 态 或 模 式 而 不 改 变 它 , OpenGL在 绘 图 过 程 中 将 一 直保 持 这 种 状 态 或 模 式 。 例 如 , 当 前 绘 图 颜 色 就 是 OpenGL 的 一 个 状 态 , 当 选 定 颜色 后 , OpenGL就 用 这 个 颜 色 绘 图 。 在 例 10.1中 , 以 下 语 句void myinit(void)glClearColor(0.0,0.0,0.0,0.0); 中 的 函 数 glClearColor(0.0,0.0,0.

31、0,0.0)将 视 口 背 景 色 清 为 黑色 , 如 果 不 改 变 这 种 状 态 , 视 口 背 景 色 将 一 直 保 持 为 黑 色 。 再 如 :glColor3f(1.0,0.0,0.0); /设 置 当 前 颜 色 为 红 色glColor3f(0.0,0.0,1.0); /设 置 当 前 颜 色 为 蓝 色glRectf(0.5,0.5,0.7,0.7); /绘 制 一 个 矩 形glColor3f(0.0,1.0,0.0); /设 置 当 前 颜 色 为 绿 色glRectf(0.8,0.8,0.9,0.9);glRectf(0.2,0.2,0.4,0.4); 执 行 结

32、 果 是 : 一 个 蓝 色 的 矩 形 和 两 个 绿 色 的 矩 形 。 10.3.2 OpenGL中 的 图 元 绘 制 任 何 复 杂 的 图 形 都 是 由 基 本 的 图 元 点 、 线 和 多 边 形组 成 的 。程 序 格 式 如 下 :要 绘 制 某 个 几 何 对 象 , 首 先 必 须 指 明 究 竟 是 哪 种 类型 的 几 何 对 象 ( 例 如 点 、 线 和 多 边 形 ) , 否 则 系 统在 执 行 绘 图 操 作 时 无 法 判 断 究 竟 是 画 什 么 。 OpenGL提 供 了 一 对 用 于 指 定 顶 点 序 列 操 作 的 函 数 , 确 定 基

33、本 几 何 对 象 的 类 型 。glBegin(); /描 述 一 组 顶 点 , 用 于 建 构 某 种 几 何 对 象glEnd(); 1. 点 的 绘 制 OpenGL中 点 定 义 为 一 个 方 块 , 在 默 认 状 态 下 , 点 是屏 幕 上 的 一 个 像 素 。 在 OpenGL中 , 一 个 点 是 当 作 一个 n( 2,3,4) 维 向 量 来 处 理 的 。 OpenGL 中 的 点 是 三 维 的 , 如 果 用 户 设 定 二 维 坐 标(x,y), 则 OpenGL在 实 际 计 算 时 处 理 的 点 为 ( x,y,0) ;对 于 由 四 维 齐 次 坐

34、 标 定 义 的 顶 点 ( x,y,z,w) , 在 w非 零时 , 齐 次 顶 点 ( x,y,z,w) 对 应 于 三 维 坐 标 中 的 点( x/w,y/w,z/w) ; 若 w =0.0, 则 对 应 于 无 穷 远 处 的 点 。 glVertex 2,3,4dfisv(TYPE coords); 例 如 : glVertex2i(0,1);glVertex3d(-1.0,1.0,3.1425926);glVertex4d(40,-15.9, 0,2);Glfloat v3=-1.2f,3.4f,5.6f; glVertex3fv(v);以 下 操 作 的 结 果 是 在 屏 幕

35、 上 绘 制 三 个 点 :glBegin(GL_POINTS) glVertex3f(1.0,0.0,0.0); glVertex3f(1.0,1.0,0.0); glVertex3f(0.0,1.0,1.0); glEnd(); 2. 线 的 绘 制与 数 学 意 义 上 两 端 无 限 延 伸 的 直 线 不 同 , OpenGL的 线 是数 学 定 义 中 的 线 段 , 用 成 对 的 端 点 来 描 述 。 如 :glBegin(GL_LINES) glVertex2f(0.0,0.0); glVertex2f(1.0,1.0);glEnd(); 上 述 操 作 描 述 了 一 条

36、 由 坐 标 原 点 到 点 ( 1.0,1.0) 的 线 段 。 3. 多 边 形 的 绘 制多 边 形 指 封 闭 线 段 围 成 的 区 域 。 但 OpenGL中 可 以 描 述 的多 边 形 有 两 点 限 制 : 多 边 形 的 边 除 了 多 边 形 的 顶 点 外 不 允许 相 交 , 即 确 保 多 边 形 为 简 单 多 边 形 ; 多 边 形 为 凸 多 边 形 ,即 任 给 多 边 形 的 两 个 内 部 点 , 其 连 线 完 全 在 多 边 形 内 。多 边 形 的 描 述 方 式 如 下 :glBegin(GL_POLYGON); glVertex*(v0); g

37、lVertex*(v1); . glVertex*(vn);glEnd();其 中 , *表 示 glVertex函 数 的 上 述 任 一 种 组 合 形 式 , 由 多 边形 顶 点 v0,v1,vn的 表 示 形 式 而 定 。注 意 : 多 边 形 顶 点 应 按 一 定 顺 序 排 列 ( 如 逆 时 针 ) 。 4. 矩 形 的 绘 制由 于 矩 形 在 几 何 体 构 造 中 出 现 得 比 较 频 繁 , 所 以 OpenGL提供 了 专 门 的 矩 形 函 数 :void glRectdfis(TYPE x1, TYPE y1, TYPE x2, TYPE y2);void

38、glRectdfisv (TYPE *v1, TYPE *v2);矩 阵 的 左 上 、 右 下 角 点 坐 标 分 别 为 ( x1,y1) 和 (x2,y2), 或者 用 数 组 指 针 v1、 v2表 示 。 用 上 述 函 数 描 述 的 矩 形 位 于 z=0平 面 内 , 并 且 各 边 分 别 平 行 于 x、 y轴 。 但 注 意 : 经 过 坐 标变 换 之 后 , 这 些 特 性 可 能 改 变 。 例 10.2 基 本 的 图 元 绘 制 程 序 为 简 单 起 见 , 我 们 仅 改 变 例 10.1中 的 绘 制 函 数 void CALLBACK display(v

39、oid)如 下 :void CALLBACK display(void) glClear(GL_COLOR_BUFFER_BIT);/将 颜 色 缓 存 清 为 glClearColor命 令 所 设 置 的 颜 色 , 即 背 景 色 glColor4f(1.0,1.0,1.0,1.0); /选 颜 色 (R,G,B)glPointSize(6.0); /设 置 点 的 大 小glBegin(GL_POINTS); /在 屏 幕 上 绘 制 三 个 点 glVertex3f(0.1,0.2,0.0); glVertex3f(0.2,0.7,0.0); glVertex3f(0.5,0.8,0

40、.0);glEnd(); glBegin(GL_LINES); /在 屏 幕 上 绘 制 一 条 线 段 glVertex2f(0.0,0.4); glVertex2f(-0.3,0.8);glEnd(); glBegin(GL_POLYGON); /在 屏 幕 上 绘 制 一 个 四 边 形 glVertex2f(-0.6,0.0); glVertex2f(-0.4,0.0); glVertex2f(-0.4,0.3); glVertex2f(-0.6,0.4); glEnd();glColor3f(1.0,0.0,0.0); /设 置 当 前 颜 色 为 红 色 glColor3f(0.0

41、,0.0,1.0); /设 置 当 前 颜 色 为 蓝 色 glRectf(0.5,0.5,0.7,0.7); /绘 制 一 个 矩 形 glColor3f(0.0,1.0,0.0); /设 置 当 前 颜 色 为 绿 色 glRectf(0.8,0.8,0.9,0.9); /绘 制 一 个 矩 形 glRectf(0.2,0.2,0.4,0.4); /绘 制 一 个 矩 形 glFlush(); /强 制 绘 图 , 不 驻 留 缓 存 用 该 函 数 替 换 例 10.1中 相 应 的 函 数 后 , 运 行 的 结 果 如 下图 所 示 。 10.3.3 坐 标 变 换 及 其 Open

42、GL实 现在 二 维 平 面 上 创 建 三 维 物 体 的 过 程 :在 三 维 空 间 中 创 建 所 绘 制 物 体 的 模 型 , 由 计 算 机 经 过 适 当 的变 换 , 将 三 维 坐 标 系 中 的 点 转 换 为 屏 幕 上 的 相 应 位 置 , 以 得到 理 想 的 视 觉 效 果 。OpenGL就 是 实 现 将 物 体 的 各 个 顶 点 通 过 各 种 变 换 矩 阵 的 作用 映 射 到 屏 幕 的 过 程 。 下 图 是 顶 点 变 换 过 程 。 注 意 : 在 模式 观 察 变 换 过 程 中 , 顶 点 的 法 向 量 也 自 动 地 进 行 变 换 。

43、 在 OpenGL编 程 过 程 中 ,程 序 员 必 须 在 头 脑 中 有 整 个 坐 标变 换 过 程 的 清 晰 的 图 像 , 才 能 将 所 建 的 场 景 模 型 正 确 地显 示 在 屏 幕 上 。 OpenGL的 坐 标 变 换 过 程 类 似 于 用 照 相 机 拍 摄 照 片的 过 程 。 使 用 照 相 机 与 坐 标 变 换 的 步 骤 比 较 如 下 :(1)竖 起 三 角 架 , 将 照 相 机 对 准 场 景 ( 视 图 变 换 ,取景 变 换 ,视 点 变 换 ) 。(2) 将 要 拍 的 场 景 置 于 所 要 求 的 位 置 上 ( 造 型 变换 ) 。(

44、3) 选 择 照 相 机 透 镜 或 调 整 焦 距 ( 投 影 变 换 ) 。(4) 确 定 最 终 的 照 片 需 要 多 大 , 例 如 放 大 照 片 ( 视口 变 换 ) 。其 中 (1)、 (2)顺 序 可 看 成 照 相 馆 中 的 照 相 过 程 ; 而在 室 外 摄 影 时 , 由 于 先 有 景 物 , 再 选 择 照 相 机 的 位置 与 方 向 , 因 此 照 相 顺 序 可 看 成 (2)、 (1)。 OpenGL中 的 多 种 变 换 ( 几 何 变 换 、 投 影 变 换 等 ) 是 由 矩阵 的 乘 积 实 现 的 。 OpenGL提 供 了 一 系 列 矩 阵

45、 操 作 函 数 。(1) 通 用 的 矩 阵 操 作 命 令void glMatrixMode(Glenum mode); 参 数 取 值 : GL_MODELVIEW、GL_PROJECTION或 GL_TEXTURE 。 默 认 的 选 定矩 阵 为 造 型 -观 察 变 换 矩 阵 。 void glLoadIdentity(void);OpenGL中 的 变 换 命 令 都 是 对 当 前 矩 阵 ( 当 前 矩 阵 为以 后 图 形 变 换 所 要 使 用 的 矩 阵 ) 进 行 操 作 , 因 此 在选 定 可 修 改 矩 阵 后 , 应 首 先 用 上 述 命 令 设 置 当

46、前 操 作 矩 阵 为 单 位 矩 阵 。 ( 2) 造 型 -观 察 变 换 造 型 -观 察 变 换 过 程 就 是 一 个 将 顶 点 坐 标 从 世 界 坐 标 变换 到 视 觉 坐 标 的 过 程 。 这 里 很 重 要 的 是 对 两 个 坐 标 系 的 认识 。 世 界 坐 标 系 也 称 为 全 局 坐 标 系 。 它 是 一 个 右 手 坐 标 系 ,可 以 认 为 该 坐 标 系 是 固 定 不 变 的 , 在 初 始 态 下 , 其 x轴 为沿 屏 幕 水 平 向 右 , y轴 为 沿 屏 幕 垂 直 向 上 , z轴 则 为 垂 直 屏幕 面 向 外 指 向 用 户 。

47、 视 觉 坐 标 系 (即 观 察 坐 标 系 )也 称 为 局 部 坐 标 系 。 它 是一 个 左 手 坐 标 系 , 该 坐 标 系 是 可 以 活 动 的 。 在 初 始 态 下 ,其 原 点 及 x、 y轴 分 别 与 世 界 坐 标 系 的 原 点 及 x、 y轴 重 合 ,而 z轴 则 正 好 相 反 , 即 为 垂 直 屏 幕 面 向 内 。 在 初 始 状 态 下 ,相 机 在 观 察 坐 标 系 的 原 点 且 指 向 z轴 正向 ,即 为 垂 直 屏 幕 面 向 内 。 平 移 变 换 void glTanslatefd(TYPE x, TYPE y, TYPE z);

48、旋 转 变 换void glRotatefd(TYPE angle, TYPE x, TYPE y, TYPE z); 绕 矢 量 v=(x,y,z)T逆 时 针 方 向 旋 转 angle指 定 的 角 度 。 旋 转 角度 的 范 围 是 0360度 。 当 angle=0时 , glRotate()不 起 作 用 。 缩 放 变 换 void glScalefd( TYPE x, TYPE y, TYPE z); 变 换 的 顺 序 :glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMultMatrixf(N); /* apply transf

49、ormation N */glMultMatrixf(M); /* apply transformation M */glMultMatrixf(L); /* apply transformation L */glBegin(GL_POINTS);glVertex3f(v); /* draw transformed vertex v */glEnd(); 在 这 个 过 程 中 , 在 GL_MODELVIEW状 态 下 , 相 继 引 入了 I( 单 位 阵 ) ,N,M,L矩 阵 。 变 换 后 的 顶 点 为 NMLv(顶 点 取 列 向 量 )。 因 此 , 顶 点 的 变 换 为 N

50、(M(Lv), 即 是 先 作 变 换 L, 然 后是 变 换 M, 最 后 才 是 N。 这 里 , 顶 点 v 的 实 际 变 换 顺 序 正 好 与指 定 的 顺 序 相 反 。 ( 3) 投 影 变 换在 调 用 投 影 变 换 命 令 前 必 须 先 在 程 序 中 加 入 下 述 语句 :glMatrixMode(GL_PROJECTION);glLoadIdentity();这 两 条 命 令 一 方 面 指 定 接 下 来 的 变 换 命 令 只 影 响 投影 矩 阵 , 同 时 也 将 当 前 投 影 矩 阵 设 置 为 单 位 阵 。 透 视 投 影void gluPers

51、pective (Gldouble fovy, Gldouble aspect, Gldouble zNear, Gldouble zFar) ; 正 交 投 影 void glOrtho (Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldouble near, Gldouble far) ; 对 于 二 维 图 形 向 二 维 屏 幕 的 投 影 , 则 应 使 用 实 用 库 中 的 如下 函 数 :void gluOrtho2D(Gldouble left, Gldouble right, Gldouble

52、 bottom, Gldouble top);前 面 提 到 过 , 用 二 维 顶 点 命 令 绘 制 的 二 维 物 体 的 z坐 标 均 为 零 , 而 gluOrtho2D()命 令 假 定 场 景 中 的 z 坐 标 介 于 -1.0和 1.0 之 间 。 ( 4) 视 口 变 换 void glViewport(GLint x, Glint y, Glsizei width, Glsizei height); 窗 口 和 视 口 是 两 个 不 同 的 概 念 。注 意 : 应 该 使 视 口 的 长 宽 比 与 取 景 体 积 的 长 宽 比 相 等 ,否 则 会 使 图 像 变

53、 形 。 10.3.4 应 用 变 换 的 一 个 实 例本 节 将 通 过 一 个 简 单 的 程 序 进 一 步 阐 述 OpenGL的 基 本 变 换 命 令 及其 使 用 方 法 。 例 10.3 三 维 空 间 绘 制 立 方 体 的 程 序 cube.c#include #include #include #include #include void myinit(void);void CALLBACK myReshape(int w, int h);void CALLBACK display(void); /初 始 化void myinit(void) glClearColor(

54、0.0,0.0,0.0,0.0); /将 窗 口 清 为 黑 色 glShadeModel(GL_FLAT); /常 量 明 暗 处 理 方 式void CALLBACK display(void) glClear(GL_COLOR_BUFFER_BIT); /将 颜 色 缓 存 清 为 glClearColor命 令 所 设 置 的 颜 色 , 即 背 景 色 glColor3f(1.0,1.0,1.0); /选 当 前 颜 色 (R,G,B)为 白 色 glLoadIdentity(); /设 置 当 前 矩 阵 为 单 位 矩 阵 glTranslatef(0.0, 0.0, -3.0)

55、; /平 移 变 换 glRotatef(45,1.0,1.0,0.0); /旋 转 变 换 glScalef(1.0,2.0,1.0); /缩 放 变 换 auxWireCube(1.0); /绘 制 立 方 体 glFlush(); /强 制 绘 图 , 不 驻 留 缓 存void CALLBACK myReshape (int w, int h) /用 于 窗 口 改 变 大 小 时 的 处理 , 与 绘 图 无 关 glMatrixMode(GL_PROJECTION); /指 明 当 前 矩 阵 操 作 是 针 对 投影 矩 阵 进 行 的 glLoadIdentity(); /设

56、置 当 前 矩 阵 为 单 位 矩 阵 gluPerspective(70.0, (GLfloat)w/ (GLfloat)h, 1.5, 40.0); / 投 影 变 换 glMatrixMode(GL_MODELVIEW); / 返 回 视 点 -模 型 矩 阵 glViewport(0,0,w,h); /定 义 视 口 变 换 void main(void) auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); /窗 口 显 示 单 缓 存 和 RGB(彩 色 )模 式 auxInitPosition(0,0,200,200); /大 小 x=200、 y=2

57、00 , (0,0)是 屏 幕 左上 点 auxInitWindow(“Perspective 3-D Cubes”); /初 始 化 窗 口 , 参 数 是标 题 myinit(); auxReshapeFunc(myReshape); auxMainLoop(display); 10.3.5 光 照 处 理光 照 处 理 是 OpenGL中 绘 制 逼 真 的 三 维 图 形 的 一 个重 要 步 骤 。 否 则 , 就 无 法 使 最 终 显 示 在 屏 幕 上 的 物体 表 现 出 立 体 感 。在 RGBA模 式 下 , 如 果 不 启 用 光 照 处 理 , 则 顶 点 的颜 色

58、由 当 前 颜 色 值 所 确 定 ; 启 用 光 照 处 理 后 , 则 另行 计 算 。场 景 中 物 体 的 光 照 计 算 不 仅 取 决 于 光 源 的 属 性 , 而且 与 材 料 的 特 性 直 接 相 关 。 即 光 照 计 算 要 反 映 出 在场 景 中 使 用 的 光 照 特 性 , 以 及 场 景 中 的 物 体 对 这 种光 的 反 射 和 吸 收 特 性 。 1. OpenGL光 照 的 基 本 概 念OpenGL中 将 光 视 为 由 红 、 绿 、 蓝 三 种 成 分 所 组 成 , 光源 的 特 性 由 所 发 出 的 三 种 颜 色 的 光 的 比 例 来

59、确 定 。说 明 : 光 源 的 RGB值 代 表 各 种 颜 色 占 最 大 光 强 的 比 例 ,通 过 调 整 各 数 值 可 以 使 光 源 呈 现 出 各 种 不 同 的 颜 色 。例 如 : R=G=B=1时 得 到 最 强 的 白 光 , 而 R=G=B=0.5时 ,由 于 光 强 减 弱 , 得 到 灰 白 光 。OpenGL在 光 照 模 拟 中 将 光 线 分 为 辐 射 光 、 环 境 光 、 漫反 射 光 和 镜 面 反 射 光 4 种 独 立 的 成 分 。 辐 射 光 : 源 自 发 光 体 , 并 且 不 受 其 他 光 源 的 影 响 。环 境 光 ( 泛 光

60、) : 它 经 过 环 境 的 多 次 散 射 , 已 不 可 能确 定 其 方 向 , 而 是 好 像 来 自 各 个 方 向 。 它 作 用 于 物 体 的表 面 时 , 将 沿 各 个 方 向 均 匀 反 射 。漫 反 射 光 : 它 来 自 一 个 方 向 , 但 作 用 于 物 体 表 面 后 将沿 各 个 方 向 均 匀 散 射 。镜 面 反 射 光 : 来 自 一 个 方 向 , 并 沿 一 特 定 方 向 离 开 。顺 便 指 出 , 可 以 在 场 景 中 设 置 多 个 独 立 的 光 , 通 过 调 整各 光 源 的 参 数 , 得 到 满 意 的 光 照 效 果 。 物

61、 体 表 面 的 材 质 特 性 :OpenGL中 认 为 , 材 料 的 颜 色 决 定 于 其 对 入 射 光 中 的 红 、绿 、 蓝 各 成 分 的 反 射 比 例 。 例 如 , 对 于 理 想 的 红 色 物 体 来说 , 它 完 全 反 射 红 色 光 , 完 全 吸 收 绿 色 光 和 蓝 色 光 。 因 而 ,白 光 照 射 下 物 体 呈 红 色 ; 纯 绿 光 照 射 下 物 体 则 呈 黑 色 。说 明 : 材 料 的 设 置 参 数 中 也 包 括 对 R、 G、 B值 的 设 定 ,但 与 光 照 的 参 数 设 置 相 比 , 两 者 的 含 义 是 不 同 的

62、。 对 材 料来 说 , 上 述 各 值 分 别 对 应 材 料 对 各 种 颜 色 光 的 反 射 比 例 。如 上 述 理 想 的 红 色 物 体 对 应 的 参 数 为 R=1,G=0,B=0。 一 般地 , 如 果 光 源 和 材 料 的 参 数 分 别 为 (Rl,Gl,Bl)和(Rm,Gm,Bm), 若 不 考 虑 其 它 影 响 因 素 , 则 观 察 到 的 光 线的 参 数 为 ( Rl*Rm,Gl*Gm, Bl*Bm) 。 与 光 线 的 情 况 相 似 , 材 料 也 具 有 辐 射 色 、 环 境 色 、 漫 反射 色 和 镜 面 反 射 色 。为 了 模 拟 场 景

63、中 的 发 光 体 , 可 以 设 定 材 料 的 辐 射 光 特 性 ;而 环 境 色 、 漫 反 射 色 和 镜 面 反 射 色 则 反 映 材 料 对 环 境 光 、漫 反 射 光 和 镜 面 反 射 光 的 反 射 系 数 。材 料 的 泛 光 与 每 个 入 射 光 源 的 泛 光 组 分 相 结 合 ; 漫 反 射与 入 射 光 源 的 漫 反 射 光 组 分 相 结 合 ; 镜 面 反 射 与 入 射 光源 的 镜 面 反 射 光 组 分 相 结 合 。 2. 光 照 步 骤 的 处 理以 下 程 序 绘 制 一 个 有 光 照 的 球 体 :#include #include

64、#include #include void myinit(void);void CALLBACK myReshape(int w, int h);void CALLBACK display(void); void myinit(void) /初 始 化glClearColor(0.0,0.0,0.0,0.0); /将 窗 口 清 为 黑 色 Glfloat mat_specular=1.0, 1.0, 1.0, 1.0; Glfloat mat_shininess=50.0; Glfloat light_position = 1.0, 1.0,1.0,0.0;/无 穷 远 光 源 glMat

65、erialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); void CALLBACK display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_B

66、UFFER_BIT);/将 颜 色 缓 存 清 为 glClearColor命 令 所 设 置 的 颜 色 , 即 背景 色glColor4f(0.2,0.8,1.0,1.0); /选 颜 色 (R,G,B)auxSolidSphere(1.0); glFlush(); /强 制 绘 图 , 不 驻 留 缓 存 void CALLBACK myReshape (int w, int h) /定 义 视 口 变换 和 投 影 变 换glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w=h)glOrtho(-1.5, 1.5, -1.5*(GLfoalt)h/(GLfloat)w, 1.5*(GLfoalt)h/(GLfloat)w,-10.0,10.0);elseglOrtho(-1.5*(GLfoalt)h/(GLfloat)w, 1.5*(GLfoalt)h/(GLfloat)w, -1.5, 1.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glIdentity

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!