基 于 OpenGL 的 HPGL 数 据 异 形 体 模 型 三 维 建 模 贾 龙 1 1,, 方 亮 2, 陈 太 喜 2 2, 刘 艳 伟 1 中 国 矿 业 大 学 材 料 科 学 与 工 程 学 院, 江 苏 徐 州 (22116) 2 中 国 矿 业 大 学 机 电 工 程 学 院, 江 苏 徐 州 (22116) E-mail:jjllI58738432@yahoo.com.cn 摘 要 : 通 过 利 用 OpenGL 图 形 编 程 工 具 和 Visual C++6.0 编 程 语 言, 详 细 阐 述 了 基 于 端 面 HPGL 数 据 文 件 的 异 形 体 模 型 的 建 模 方 法 使 用 OpenGL 对 异 形 体 三 维 模 型 添 加 进 行 真 实 感 渲 染 视 角 变 换 平 移 缩 放 等 操 作, 实 现 了 异 形 体 模 型 在 OpenGL 图 形 窗 口 中 直 接 显 示, 以 便 在 模 型 加 工 成 形 之 前 检 验 其 端 面 图 元 几 何 设 计 的 合 理 性 和 预 测 被 加 工 异 形 体 的 几 何 造 型 关 键 词 :HPGL 格 式 ;OpenGL; 几 何 建 模 中 图 分 类 号 :TP391.72 1. 引 言 HPGL 是 Hewlett-Packard Graphics Language 首 字 母 缩 写, 中 文 翻 译 为 惠 普 绘 图 语 言, 是 惠 普 公 司 于 20 世 纪 50 年 代 为 控 制 其 绘 图 仪 产 品 建 立 的 一 套 指 令 系 统, 随 后 HPGL 被 广 泛 的 使 用 于 绘 图 仪 和 打 印 机 控 制 语 言 并 成 为 标 准 [1] 它 有 plt hpg hp2 pl2 prn 四 种 扩 展 名, 以 plt 最 为 常 用, 本 文 是 以 plt 格 式 为 数 据 对 象 HPGL 原 来 是 为 控 制 绘 图 仪 而 设 计 的, 所 以 它 只 能 表 达 二 维 图 形 而 且 是 非 交 互 的, 但 由 于 HPGL 格 式 文 件 具 有 简 洁 高 效 容 易 理 解 和 修 改 等 优 点, 它 的 描 述 机 制 也 非 常 合 适 表 达 几 何 图 形, 于 是 HPGL 文 件 格 式 成 为 CAD 矢 量 绘 图 和 加 工 的 一 种 重 要 数 据 格 式 国 内 外 部 分 EPS( 聚 苯 乙 烯 泡 沫 塑 料 ) 快 速 成 形 机 加 工 文 件 都 采 用 plt 文 件 格 式, 例 如 波 兰 MEGAPLOT 公 司 的 快 速 成 形 机 和 西 安 交 通 大 学 研 发 的 FoamCutter 快 速 成 形 系 统 等 [2] OPenGL 是 一 个 性 能 卓 越 的 三 维 图 形 标 准, 作 为 一 种 硬 件 图 形 发 生 器 的 软 件 接 口, 它 包 括 了 模 型 绘 制 坐 标 变 换 颜 色 模 式 设 置 光 照 和 材 质 设 置 管 理 位 图 和 图 像 增 强 纹 理 映 射 实 时 动 画 交 互 技 术 在 内 的 八 大 功 能 和 大 约 250 个 不 同 的 函 数, 能 够 建 立 交 互 的 三 维 场 景 和 构 造 三 维 景 物 模 型 异 形 体 是 指 工 件 的 上 下 端 面 的 图 形 不 相 同 或 者 相 似, 比 如 上 端 面 是 个 圆, 下 端 面 是 个 方, 上 下 端 面 之 间 平 滑 地 过 渡, 如 图 1 所 示 由 于 异 形 体 三 维 形 状 不 同 于 一 般 规 则 零 件 的 形 状, 设 计 者 很 难 在 异 形 体 模 型 设 计 之 初 准 确 把 握 其 上 下 端 面 几 何 图 形 的 绘 制, 所 以 利 用 OpenGL 建 立 三 维 仿 真 环 境 及 对 基 于 二 维 HPGL 数 据 格 式 的 异 形 体 进 行 三 维 建 模, 实 现 三 维 真 实 感 渲 染 视 角 变 换 显 示 缩 放 等, 使 基 于 端 面 二 维 HPGL 数 据 的 异 形 体 模 型 显 示 更 加 直 观, 更 加 完 善, 更 方 便 地 检 验 异 形 体 端 面 图 形 几 何 设 计 合 理 性, 从 而 得 到 正 确 的 异 形 体 端 面 HPGL 加 工 文 件
图 1 异 形 体 模 型 2. Visual C++ 中 OpenGL 三 维 仿 真 环 境 的 构 建 在 VC++6.0 开 发 环 境 下 开 发 OPenGL 应 用 程 序 需 解 决 OPenGL 与 VC++6.0 窗 口 系 统 的 接 口 问 题, 主 要 是 为 OpenGL 创 建 适 当 的 图 形 操 作 描 述 表 并 设 置 正 确 的 像 素 格 式 此 外 就 是 要 将 OpenGL 编 程 与 VC++6.0 事 件 编 程 相 结 合, 在 VC++6.0 事 件 处 理 程 序 中 利 用 OpenG 进 行 图 形 绘 制, 从 而 真 正 地 将 OpenGL 融 入 到 程 序 中, 使 之 于 程 序 的 其 他 部 分 有 机 地 结 合 成 为 一 个 整 体 用 VC++6.0 编 写 OPenGL 程 序 的 基 本 步 骤 如 下 : (1) 利 用 MFC AppwiZard 建 立 一 个 多 文 档 应 用 程 序 框 架 在 文 档 视 图 结 构 中, 视 图 负 责 窗 口 中 内 容 的 显 示, 因 此 所 有 的 OpenGL 绘 制 工 作 应 放 在 视 图 类 中 进 行 (2) 打 开 资 源 编 辑 器 对 程 序 界 面 上 的 菜 单 对 话 框 等 资 源 进 行 必 要 的 修 改 (3) 在 程 序 中 包 含 进 库 函 数 文 件 和 OpenGL 的 头 文 件 在 Visual C++ 开 发 环 境 下, 选 择 Project Setting 菜 单, 在 Link 标 签 中 的 Object/library moduls 编 辑 框 中 输 入 opengl32.lib glu32.lib 库 函 数 文 件 在 视 图 类 C~View 的 头 文 件 ~View.h 中, 包 含 有 关 OpenGL 的 头 文 件, 如 下 : #include gl\gl.h # include gl\glu.h # include gl\glut.h 其 中 gl.h 文 件 是 OpenGL 必 不 可 少 的,glu.h 文 件 表 示 要 用 到 OpenGL 实 用 库 函 数,glut.h 表 示 会 用 到 的 OpenGL 工 具 库 [3] (4) 利 用 Classwizard 进 行 OpenGL 所 必 须 的 初 始 化 工 作 OpenGL 的 初 始 化 工 作 包 括 : 设 置 像 素 格 式 建 立 着 色 描 述 表 以 及 初 始 化 OpenGL 投 影 观 察 体 系 等 工 作 通 过 象 素 格 式 的 设 置, 规 定 了 OpenGL 对 象 素 进 行 操 作 的 基 本 方 式 绘 制 描 述 表 指 明 了 Windows 进 行 图 形 显 示 的 基 本 属 性 (5) 根 据 用 户 对 程 序 的 功 能 要 求, 利 用 VC++6.0 中 的 各 种 编 辑 工 具, 给 视 图 类 C_View 或 其 它 类, 添 加 具 有 相 应 功 能 的 成 员 函 数, 以 及 进 行 相 应 的 事 件 处 理 运 用 OpenGL 函 数 绘 制 图 形, 包 括 定 义 观 察 区 域 建 立 光 照 模 型 实 现 图 形 的 平 移 旋 转 缩 放 的 等 功 能, 均 在
这 部 分 完 成, 这 是 程 序 开 发 的 核 心 内 容 (6) 图 形 绘 制 完 毕 后, 通 过 响 应 Windows 消 息 WM_DESTORY 来 删 除 着 色 描 述 表 (7) 利 用 VC++6.0 的 编 译 工 具, 进 行 程 序 的 编 译 链 接 及 调 试 等 工 作 3 HPGL 文 件 数 据 读 取 与 建 立 模 型 显 示 数 据 格 式 3.1 HPGL 文 件 格 式 HPGL 格 式 文 件 由 一 系 列 指 令 组 成, 每 个 指 令 由 两 个 大 写 字 母 组 成, 后 面 或 有 或 没 有 跟 着 参 数 ( 数 字 ), 当 后 面 跟 有 参 数 时, 两 个 大 写 字 母 后 的 第 一 个 数 据 为 第 一 个 参 数, 参 数 多 于 一 个 时 以 空 格 分 开, 指 令 以 分 号 结 束 若 参 数 为 字 符 串, 则 以 换 行 表 示 结 束 以.plt 为 后 缀 名 的 HPGL 文 件 的 图 形 格 式 是 矢 量 格 式, 它 将 坐 标 系 中 各 点 按 顺 序 用 直 线 连 接 起 来 构 成 几 何 图 形 在 CorelDRAW 11 里 画 一 个 10mm 10mm 的 正 方 形, 以 HPGL(.plt) 保 存, 并 用 记 事 本 将 该 文 件 打 开, 我 们 将 看 到 记 事 本 包 含 有 下 面 的 内 容 : PU0 0; PD400 0; PD400 400; PD0 400; PD0 0; SP0; HPGL 指 令 有 近 百 条, 很 多 指 令 和 绘 图 仪 控 制 直 接 相 关, 而 对 数 据 交 互 有 用 的 指 令 并 不 多, 下 面 仅 就 上 文 所 述 正 方 形 文 件 对 应 的 HPGL 文 件 中 的 与 图 形 坐 标 数 据 有 关 的 指 令 加 以 说 明 PU Pen Up 抬 起 画 笔, 后 面 的 参 数 为 X 坐 标 Y 坐 标 PD Pen Down 落 下 画 笔, 后 面 的 参 数 为 X 坐 标,Y 坐 标 SP0 Select Pen 0 不 选 择 任 何 画 笔, 结 束 标 志 HPGL 的 指 令 虽 然 很 多, 但 从 CorelDRAW 保 存 的.plt 文 件 看, 常 用 指 令 只 有 10 条 左 右 与 图 形 上 点 的 坐 标 值 相 关 的 指 令 有 PU PD 和 SP0 PU 指 令 提 笔 移 动 到 图 形 单 元 的 起 点, 即 PU 指 令 后 面 参 数 所 表 示 的 坐 标 点, 接 着 是 一 系 列 PD 指 令 落 笔 画 线, 直 线 连 接 上 一 指 令 参 数 所 表 示 的 坐 标 点 和 这 一 指 令 参 数 所 表 示 的 坐 标 点 由 于 每 个 图 形 单 元 是 连 续 的, 所 以 画 图 形 单 元 的 程 序 都 是 一 个 PU 指 令 加 若 干 PD 指 令, 最 后 一 个 PD 指 令 将 画 笔 移 动 到 图 形 单 元 的 终 点, 如 果 图 形 单 元 是 封 闭 的, 那 么 最 后 一 个 PD 指 令 将 使 画 笔 回 到 PU 指 令 开 始 的 那 一 点 SP0 表 示 图 形 文 件 所 有 坐 标 点 绘 制 完 毕, 文 件 结 束 3.2 HPGL 文 件 数 据 读 取 对 于 HPGL(.plt) 格 式 文 件 的 内 容, 作 者 只 关 心 其 所 表 达 的 图 形, 由 上 文 对 HPGL 格 式 文
件 的 数 据 结 构 的 分 析 可 知, 图 形 需 要 的 数 据 仅 为 指 令 PU 及 PD 后 面 所 带 的 参 数 及 程 序 结 束 指 令 SP0 即 只 将 图 形 单 元 的 数 据 点 依 次 有 序 地 记 录 下 来, 程 序 的 数 据 结 构 采 用 链 表 结 构 链 表 每 个 节 点, 分 别 记 录 所 读 取 的 图 形 单 元 的 编 号, 即 第 几 个 图 形 单 元, 记 录 所 读 取 的 数 据 是 该 图 形 单 元 的 第 几 个 点, 以 及 对 应 的 X 坐 标 和 Y 坐 标, 所 以 定 义 如 下 的 数 据 结 构 : struct HPGLORIGINALDATA // 描 述 HPGL 格 式 文 件 图 形 的 数 据 结 构 { int NoOfItem; int NoOfPoint; float x; float y; // 记 录 第 几 个 图 形 单 元 // 记 录 图 形 单 元 的 第 几 个 点 // 点 的 X 坐 标 // 点 的 Y 坐 标 }; typedef CList<HPGLORIGINALDATA, HPGLORIGINALDATA> HPGLModeList; // 定 义 该 HPGL 数 据 结 构 的 链 表 typedef CArray<HPGLOriginalDataList, HPGLOriginalDataList> ModeListArray; // 定 义 存 储 数 据 的 链 表 数 组 HPGL 文 件 的 读 入, 本 文 选 择 使 用 C++ 中 的 fstream 类, 具 体 执 行 过 程 是 先 生 成 一 个 fstream 对 象 m_fin, 用 一 个 循 环 语 句 逐 行 读 取 数 据, 依 次 读 取 指 令 PU 和 PD 后 面 的 数 据, PU 和 下 一 个 PU 之 间 所 有 指 令 PU PD 的 数 据 存 储 在 一 个 链 表 中, 遇 到 一 个 PU 指 令 就 开 始 链 表 数 组 中 下 一 个 链 表 的 数 据 存 储, 直 到 读 入 SP0 中 止 循 环 并 结 束 ; 若 是 遇 到 其 他 指 令, 不 执 行 操 作 依 次 读 取 异 形 体 模 型 上 下 端 面 HPGL 文 件, 分 别 形 成 上 下 端 面 两 个 图 形 链 表 数 组 m_modelistuparray 和 m_modelistdownarray 3.3 异 形 体 点 插 补 数 据 处 理 由 于 异 形 体 模 型 的 特 殊 性, 其 上 下 端 面 具 有 不 同 的 几 何 图 元, 建 模 要 求 上 下 端 面 之 间 平 滑 地 过 渡, 即 必 须 经 过 三 维 建 模 数 据 前 处 理 使 异 形 体 上 下 端 面 几 何 图 元 具 有 相 同 的 节 点 数, 这 个 过 程 我 们 称 为 异 形 体 点 插 补 如 图 2(a) (b) 所 示 图 形 为 异 形 体 模 型 上 下 端 面 图 元 节 点 分 布, 黑 色 节 点 表 示 原 图 形 节 点 分 布, 红 色 部 分 为 经 过 异 形 体 点 插 补 处 理 后 对 所 在 图 元 添 加 的 新 节 点, 以 满 足 模 型 上 下 端 面 的 坐 标 节 点 个 数 必 须 相 同 A5 B6 B5 B4 A6 A4 A7 A3 B7 B3 A0 A2 A1 B0 B1 (a) 模 型 上 端 面 (b) 模 型 下 端 面 B2
图 2 异 形 体 模 型 端 面 图 元 异 步 点 插 补 异 步 点 插 补 的 中 心 思 想 是 : 在 一 端 图 形 中 的 所 有 点 中, 每 一 个 点 相 对 与 该 图 形 的 起 始 点 的 路 程 与 该 图 形 的 周 长 的 比 率 如 果 不 能 在 另 一 个 图 形 中 找 到 一 点 相 对 于 起 始 的 路 程 和 其 所 在 图 形 的 周 长 的 比 率 相 等, 就 必 须 在 没 有 对 应 点 的 图 形 中 对 应 的 补 一 个 点 例 如 图 1 异 形 体 模 型 端 面 异 步 插 补 点 示 意 图 如 图 2 所 示, 首 先 确 定 上 下 端 面 图 元 起 始 点 为 A0 和 B0; 然 后, 进 行 异 步 点 插 补 处 理, 例 如 (a) 图 中 的 A1 点 在 原 (b) 图 中 没 有 周 长 比 率 相 同 点 与 其 对 应, 通 过 异 步 点 插 补 原 理, 在 (b) 图 图 元 中 插 补 一 点 B1 与 (a) 图 中 A1 点 形 成 对 应 点 这 样, 将 所 有 对 应 点 补 上 以 后, 如 图 (b) 所 示, 模 型 下 端 面 图 形 为 八 个 点, 和 上 端 面 图 元 节 点 数 一 致, 并 且 每 一 个 点 相 对 于 起 点 的 路 程 与 其 所 在 的 图 形 的 周 长 的 比 值 与 另 一 个 图 形 中 对 应 点 与 其 所 在 的 图 形 的 起 点 的 路 程 与 其 周 长 的 比 值 是 相 等 的 经 过 异 步 点 插 补 处 理 的 异 形 体 端 面 图 元 链 表 数 组 作 为 三 维 建 模 数 据 源 进 行 异 形 体 的 几 何 建 模 3.4 异 形 体 三 维 建 模 数 据 格 式 OpenGL 的 数 据 类 型 定 义 可 以 与 其 它 语 言 一 致, 例 如 GLint GLfloat 等 [4] 异 形 体 三 维 建 模 用 OpenGL 双 精 度 浮 点 数 GLdouble 来 定 义 端 面 图 元 节 点 坐 标 数 据 类 型, 用 GLdouble[3] 数 组 存 放 图 元 节 点 x y z 三 维 坐 标 值 设 计 用 于 储 存 异 形 体 对 应 端 面 图 元 的 二 维 链 表 数 组, 具 体 定 义 如 下 : CArray<GLdouble*,GLdouble*> ModeArray[3][2]; ModeArray[3][2] 包 含 上 下 两 个 端 面 链 表 数 组, 每 个 数 组 最 多 有 三 个 图 元 的 坐 标 链 表, 模 型 侧 面 绘 制 和 端 面 绘 制 使 用 同 一 数 据 结 构 数 组 的 每 个 元 素 均 为 GLdouble 型 的 指 针, 该 指 针 指 向 一 个 包 含 三 个 GLdouble 型 的 数 组, 即 三 维 坐 标 数 值 将 链 表 数 组 m_modelistuparray 和 m_modelistdownarray 图 形 坐 标 依 次 对 应 储 存 到 ModeArray[3][2] 数 据 里 面 形 成 三 维 建 模 数 据 源 4 异 形 体 三 维 建 模 在 OpenGL 中 没 有 三 维 实 心 体 的 概 念, 所 有 的 几 何 物 体 最 终 都 是 由 一 定 顺 序 的 顶 点 组 成 的 面 来 描 述 的 通 过 调 用 glvertex( ) 函 数, 来 定 义 一 个 二 维 三 维 或 者 一 个 用 其 次 坐 标 定 义 的 顶 点 连 续 的 调 用 顶 点 定 义 函 数 可 以 生 成 一 系 列 顶 点 线 或 多 边 形 等 这 些 定 义 的 顶 点 放 在 glbegin( ) 和 glend( ) 函 数 之 间 绘 制 基 本 图 元,OpenGL 通 过 这 些 基 本 图 元 构 造 出 复 杂 形 体 异 形 体 三 维 建 模 的 图 元 顶 点 数 据 存 放 在 ModeArray[3][2] 链 表 数 组 中, 通 过 数 据 调 用 分 别 绘 制 出 异 形 体 模 型 的 侧 面 和 端 面 并 进 行 图 形 渲 染 4.1 异 形 体 的 侧 面 建 模 异 形 体 模 型 的 侧 面 显 示 原 理 : 绘 制 四 边 形 片 利 用 OpenGL 基 本 图 元 绘 制 状 态 变 量
GL_QUADS, 依 次 画 出 每 个 四 边 形 如 图 3 所 示, 模 型 上 端 面 点 C1 C2 与 下 端 面 点 D2 D1 绘 制 一 个 四 边 形 片, 遍 历 图 元 坐 标 链 表 依 次 绘 制 四 边 形 最 终 形 成 模 型 的 侧 面 工 件 模 型 的 侧 面 建 模 实 现 函 数 为 DrawModel( ), 其 建 模 原 理 示 意 图 图 3 侧 面 建 模 原 理 4.2 异 形 体 的 端 面 建 模 异 形 体 模 型 的 端 面 是 整 个 异 形 体 三 维 建 模 中 的 难 点, 异 形 体 端 面 端 面 有 凹 多 边 形 中 间 有 洞 的 多 边 形 这 时,OpenGL 的 基 本 图 元 绘 制 没 有 办 法 达 到 要 求 因 为 OpenGL 为 了 能 快 速 渲 染 多 边 形, 只 能 直 接 显 示 简 单 凸 多 边 形 ( 多 边 形 中 任 意 两 点 的 连 线 上 的 所 有 点 仍 属 于 此 多 边 形 ), 对 凹 多 边 或 者 交 叉 多 边 形 渲 染 结 果 将 不 确 定 为 了 优 化 性 能,OpenGL 工 具 库 GLU 对 OpenGL 函 数 库 进 行 了 一 些 补 充, 以 支 持 一 些 高 层 操 作 GLU 包 括 了 一 些 函 数, 把 复 杂 多 变 形 分 格 化 多 个 凸 多 边 形, 然 后 再 由 基 本 的 OpenGL 函 数 进 行 渲 染 OpenGL 的 函 数 库 中 提 供 分 格 化 的 函 数 是 以 通 过 多 边 型 轮 廓 线 生 成 简 单 多 边 形, 从 而 渲 染 复 杂 多 边 形 [5] 所 以 异 形 体 端 面 的 建 模 需 要 用 多 边 形 的 分 格 化 对 端 面 进 行 处 理, 然 后 进 行 渲 染 显 示 GLU 提 供 一 组 函 数 来 执 行 分 格 化 操 作, 这 些 函 数 所 接 受 的 参 数 就 是 描 述 这 些 难 以 渲 染 的 复 杂 多 边 形 的 轮 廓 线, 并 返 回 一 些 三 角 形 三 角 形 网 三 角 形 扇 以 及 直 线 的 组 合 [6] 使 用 自 定 义 函 数 DrawSection( ) 实 现 异 形 体 端 面 的 几 何 建 模 其 中 调 用 多 边 形 的 分 格 化 函 数 完 成 工 件 端 面 的 绘 制 异 形 体 端 面 图 元 建 模 过 程 中 的 图 元 分 格 化 主 要 工 作 具 体 步 骤 如 下 : (1) 在 自 定 义 函 数 DrawSection( ) 中 进 行 分 格 化 操 作 初 始 设 置, 使 用 glunewtess 函 数 创 建 一 个 分 格 化 对 象 GLUtesselator, 与 多 边 形 描 述 和 分 格 化 相 关 的 顶 点 和 回 调 函 数 都 连 接 到 这 个 分 格 化 对 象 中 GLUtesselator *glunewtess(void); (2) 设 置 回 调 函 数 : 多 次 调 用 glutesscallback 函 数, 注 册 多 个 回 调 函 数, 用 于 分 格 化 期 间 执 行 必 要 操 作 ( 每 个 分 格 化 对 象 需 要 注 册 多 个 回 调 函 数 ) 1 在 三 角 形 生 成 的 开 始 只 调 用 glbegin 的 回 调 函 数 glutesscallback(ptess,glu_tess_begin,(void( stdcall*)( ))glbegin);
2 在 三 角 形 生 成 的 结 束 只 调 用 glend 的 回 调 函 数 glutesscallback(ptess,glu_tess_end,(void( stdcall*)( ))glend); 3 为 每 个 顶 点 只 调 用 glvertex3fv 的 回 调 函 数 glutesscallback(ptess,glu_tess_vertex,(void( stdcall*)( ))glvertex3dv); 4 调 用 glutessproperty 函 数 制 定 分 格 化 的 属 性, 对 分 格 化 算 法 进 行 控 制 在 这 些 属 性 中 最 重 要 最 复 杂 的 是 环 绕 规 则, 控 制 生 成 多 边 形 是 以 填 充 多 边 形 还 是 以 轮 廓 的 形 式 绘 制, 以 及 合 并 顶 点 所 需 的 距 离 阈 值 glutessproperty(ptess,glu_tess_winding_rule, GLU_TESS_WINDING_ODD); // 如 何 计 算 填 充 和 开 放 区 域 本 文 的 环 绕 规 则 用 glutessproperty 函 数 指 定 如 下 : glutessproperty(ptess,glu_tess_winding_rule,glu_tess_winding_odd) ; glutessproperty 第 二 个 参 数 使 用 GLU_TESS_WINDING_RULE, 其 value 取 默 认 值 GLU_TESS_WINDING_ODD, 表 示 渲 染 环 绕 数 为 奇 数 的 区 域 (4) 程 序 定 义 一 个 端 面 索 引 变 量 用 来 指 定 一 个 或 多 个 封 闭 多 边 形 轮 廓, 用 于 创 建 和 渲 染 经 过 分 格 后 的 简 单 多 边 形 集 合 通 过 端 面 索 引 赋 值 的 改 变 来 分 别 指 向 经 过 建 模 数 据 处 理 的 异 形 体 上 下 端 面 坐 标 链, 然 后 定 义 一 个 异 形 体 端 面 基 本 形 状 判 断 式, 利 用 加 载 工 件 的 端 面 图 元 数 来 判 断 工 件 的 类 型, 异 形 体 端 面 图 形 的 类 型 基 本 分 为 单 连 通 域 双 连 通 域 和 三 连 通 域 三 种, 然 后 根 据 不 同 端 面 类 型 来 指 定 端 面 图 元 的 离 散 数 据 轮 廓, 循 环 调 用 数 组 ModeCutArray[3][2] 元 素, 用 于 逆 时 针 指 定 多 边 形 轮 廓, 完 成 一 个 端 面 的 面 片 渲 染 (5) 分 别 对 工 件 两 个 端 面 的 分 格 化 渲 染 之 后, 调 用 函 数 gludeletetess(ptess); 函 数 删 除 分 格 化 对 象, 程 序 运 行 结 束 5 异 形 体 模 型 的 三 维 显 示 及 三 维 观 察 在 仿 真 窗 口 中 进 行 基 于 OpenGL 的 HPGL 数 据 格 式 三 维 模 型 显 示, 如 图 4(a) (b) 分 别 为 异 形 体 工 件 三 维 仿 真 模 型 的 填 充 显 示 和 线 框 显 示 另 外, 添 加 了 图 形 的 三 维 观 察 包 括 : (1) 视 图 定 向 观 察 例 如 轴 测 图 后 视 图 左 视 图 俯 视 图 右 视 图 和 正 视 图 ; (2) 模 型 绕 轴 定 向 旋 转, 包 括 绕 X 旋 转 绕 Y 旋 转 和 绕 Z 旋 转 ; (3) 任 意 缩 放 旋 转 平 移 操 作 ; 辅 助 操 作 设 置 是 为 了 方 便 用 户 从 不 同 角 度 观 察 物 体 下 面 以 实 例 来 说 明 论 文 的 成 果 : 图 5 为 异 形 体 仿 真 模 型 的 真 实 效 果, 依 次 来 验 证 基 于 OpenGL 的 HPGL 数 据 格 式 三 维 模 型 显 示 的 正 确 性 图 6 为 汉 字 百 异 形 体 模 型 的 仿 真 效 果 图, 其 上 下 端 面 分 别 为 黑 体 字 型 和 魏 体 字 型, 为 了 能 同 时 看 到 模 型 上 下 端 面 图 元, 仿 真 时 模 型 采 用 了 半 透 明 处 理 ; 图 7 为 与 其 想 对 应 的 异 形 体 百 字 加 工 样 例, 经 对 比 图 6 与 图 7 可 知, 仿 真 模 型 完 全 表 达 真 实 加 工 模 型, 达 到 加 工
模 型 仿 真 要 求, 满 足 实 际 加 工 需 要 (a) (b) 图 4 仿 真 模 型 显 示 窗 口 图 5 仿 真 模 型 显 示 图 图 6 异 形 体 百 字 仿 真 模 型 图 7 异 形 体 百 字 加 工 样 例 6 结 束 语 在 Visual C++6.0 开 发 环 境 中 建 立 OpenGL 图 形 显 示 窗 口 对 异 形 体 仿 真 模 型 进 行 显 示, 详 细 阐 述 了 通 过 导 入 异 形 体 模 型 上 下 两 端 面 的 二 维 图 形 格 式 HPGL 文 件, 经 过 数 据 处 理 后 进 行 三 维 异 形 体 模 型 的 建 模 方 法 实 现 了 对 两 个 二 维 数 据 的 异 形 体 模 型 的 三 维 显 示, 同 时 实 现 了 对 三 维 模 型 的 多 视 角 观 察 缩 放 等 功 能 经 过 与 真 实 加 工 模 型 的 对 比, 该 软 件 能 实 现 对 HPGL 文 件 格 式 的 异 形 体 模 型 的 三 维 显 示, 方 便 了 对 异 形 体 端 面 图 元 几 何 设 计 合 理 性 的 检 验, 能 在 异 形 体 模 型 真 实 加 工 之 前 预 测 和 得 到 工 件 形 状, 从 而 指 导 异 形 体 造 型 设 计
参 考 文 献 [1] Paul Bourke.Using HPGL as a drawing interchange media. http://www.lprng.com/distrib/resources/hpgl_short_summary.html, 1992:9 [2] 龚 道 明. 基 于 HPGL 的 EPS 快 速 成 形 技 术 [D]. 西 安 : 西 安 交 通 大 学.2006 [3] 张 香 圃, 任 乃 飞, 张 海 军. 基 于 OpenGL 和 Visual C ++ 的 数 控 机 床 仿 真 教 学 系 统 研 究 [J]. 现 代 制 造 工 程.2007(3):129~132 [4] 乔 林, 费 广 正 等. OpenGL 程 序 设 计 [M]. 清 华 大 学 出 版 社,2000 年 [5] Dave Shreiner 等 著 ; 徐 波 等 译. OpenGL 编 程 指 南 [M], 北 京 : 人 民 邮 电 出 版 社,2006 [6] Paul Martz 著 ; 邓 郑 祥 译. OpenGL 2.0 精 髓 [M], 北 京 : 人 民 邮 电 出 版 社,2006 Modeling Procedure of HPGL data Model Based on OpenGL Technology JIA Long 1, FANG Liang 1,2, CHEN Taixi 2, LIU Yanwei 2 1 School of Materials Science and Engineering,China Univercity of Mining and Technology, Xuzhou, Jiangsu (221116) 2 School of Mechanical and Electrical Engineering,China Univercity of Mining and Technology, Xuzhou, Jiangsu (221116) Abstrat The modeling method of HPGL data model using Visual C++6.0 program language and the tool of graphic function library OpenGL was introduced. After a HPGL data model is read,using OpenGL can easily render model, transform visual angle, zoom display sizes and etc; Furthermore, 3D model can be directly in OpenGL environment,in order to testify geometry design of model and forecast 3D shape of model. Keywords:HPGL data model;opengl;modeling 作 者 简 介 : 贾 龙, 男,1983 年 生, 硕 士 研 究 生, 主 要 研 究 方 向 是 EPS 热 丝 快 速 成 形 虚 拟 制 造 技 术