OpenGL实现3D模型的交互控制

合集下载

基于Visual Basic 2008和OpenGL的3ds文件的读取与控制

基于Visual Basic 2008和OpenGL的3ds文件的读取与控制

块的相对位位置信息 . 较之 *. a 文件 , 3s mx *.d 文 件有 明显 的优点 即结 构清 晰 , 内容 明确 , 式统 一 . 格 但读取要求必须了解每一块 的含义 , 同时, 3s *.d 文件数据格式是十六进制存储 的 】这给快速开发 ,
程 序带来不便 . 了能把 主要精 力放在 程 序开发 上 , 为
软件公 司 采 用 O eG pn L作 为 三 维 图形 应 用 程 序 设 计界 面 , 其红 极一 时 , 使 已成 为业界 标准 u . J O eG pn L作为 一种 图形 工业标 准 的 A I它必 须 P, 寄生 于一定 的软件 开发 环境才 能进 行软 件开发 , 几 乎 所有 的 应 用 程 序 开 发 工 具 都 支 持 O eG pn L的 集 成 , 是绝 大 部分开 发人 员都 出于 执行效 率考 虑而 但
先 描述块 是如 何组成 的 , 的信 息 类别 I, 块 D 与下 一
本文利用 3 SM x D a 快速建模 , 然后 导出为 *. 3s d 文件 . 由于 *.d 文件 的 S K未公布 , 但 3s D 且结 构块 较 为复 杂 , 因此读 取相对 困难 . 采 用 Ve 3 s 若 i d w 软件 , *.d 文件转化 为 *. 将 3s h文件与 *. 文 件 , 将 *. 文 件改 写成 Vsa Bs 08类模 块 , 后 h i l ai20 u c
速 建模 的 需要 , 匕 又胄 高效的 实现友好 的 交互功 能 .
关键 词 : O eG ;a 框 架 ; i 3 sVsa B s 0 8 pn L To V e d ; i l ai 2 0 w u c
中图分类 号 :
l . 72
文 献标识 码 : A

基于OpenGL的新型水雷三维仿真训练系统

基于OpenGL的新型水雷三维仿真训练系统
s se d mon tae e sbi t f eme h d y tm e sr tst f a i l yo t t o . he i h
K e wo d : D i a in;n e a t ec n o ; e GL c n l g ; r g a v lpig e vio e t m o e h w ig y r s 3 smult o it rc i o t l Op n v r t h oo y po e r m de eo n n r n n ; m d ls o n
练系统 的方法和 过程。重点阐述了如何在 O eGL 开发环境中实现对三维模型 的交 互控制 。训练系统的建立证 pn
明了方法 的可行性 。
关键词:三维仿真 ;交互控制 :O e G pn L技术 :开发环境 :模型显示
3D a ni yse f rN e M i s d n Ope Tr i ng S t m o w neBa e o nGL
i eat e o t l f D ojc eO e G rga d vlpn n i n n. h rcs f u dn et ii n rc v n o o bet i t p n Lporm e e igev o metT epo es i ig h a n t i c r 3 sn h o r ob l t rn g
光线跟踪 的高质量静止 或活动的三维彩色图像l。 ”
O eG pn L渲染使用一种流水线结构 。 pn O eGL使 用
加速 了应用程序 的开发。功能强大 O eGL可 以在所 pn 有流行 的个 人计算机和工作站平 台上开发和使用 ,确
4个主要阶段 来处理像素和顶 点数据 :顶点操作 、像
l 引 言

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验基于OpenGL的三维图形绘制实验⽬录实验题⽬:交互图形程序设计基础实验 (3)1.实验⽬的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运⾏截图 (7)4.实验结果 (7)5.实验体会 (7)实验题⽬:交互图形程序设计基础实验1.实验⽬的1)理解并掌握三维基本图形数据结构表⽰⽅法。

2)掌握编写OpenGL图形程序的基本⽅法.3)掌握OpenGL基本图形表⽰及绘制。

2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验⽬的是掌握图形信息的表⽰、数据的组织,在此基础上基于OpenGL绘制出三维图形。

实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核⼼函数等的使⽤;基本图形的绘制(点、线段、折线、闭合折线、多边形、三⾓形、三⾓扇、三⾓条带、四边形、四边形条带等)及图形属性控制(线宽、颜⾊、线型、填充样式等);对指定的若⼲三维模型进⾏建模、绘制,在⼀个程序框架下实现,提交1次程序,1份实验报告。

2.2 实验任务1、使⽤Visual C++建⽴⼀个单⽂档(SDI)程序,完成OpenGL绘制框架程序的设计。

在此基础上参照提供的资料,定义绘制函数,基于⾃定义的若⼲点坐标与颜⾊,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三⾓形、四边形、三⾓扇、三⾓条带、四边形条带。

2、使⽤1中建⽴的程序框架,完成如下任务:(1)绘制正棱柱(底⾯多变形的边数及⾼度可以通过对话框输⼊)(2)正棱锥(底⾯多变形的边数及⾼度可以通过对话框输⼊)(3)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。

加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。

使用OpenGL进行三维游戏引擎开发与性能优化

使用OpenGL进行三维游戏引擎开发与性能优化

使用OpenGL进行三维游戏引擎开发与性能优化OpenGL是一种跨平台的图形库,广泛应用于三维游戏开发中。

本文将介绍如何利用OpenGL进行三维游戏引擎开发,并探讨如何优化性能,提升游戏体验。

一、OpenGL简介OpenGL是一种用于渲染2D和3D矢量图形的跨平台图形库。

它提供了一系列的API,可以让开发者利用GPU进行图形渲染,实现高性能的图形效果。

在三维游戏开发中,OpenGL被广泛应用于渲染场景、模型、光照等方面。

二、三维游戏引擎开发1. 游戏引擎架构在开发三维游戏引擎时,通常会采用组件化的架构。

引擎包括渲染引擎、物理引擎、音频引擎等多个模块,各模块相互独立但又相互协作,共同构建出一个完整的游戏引擎。

2. 场景渲染利用OpenGL进行场景渲染是三维游戏引擎开发的核心部分。

通过构建场景图、加载模型、设置光照等操作,可以实现逼真的三维场景呈现。

3. 用户交互用户交互是游戏引擎中至关重要的一环。

通过捕捉用户输入事件,实现玩家与游戏世界的交互,提升游戏的可玩性和趣味性。

4. 物理模拟物理引擎是实现真实物理效果的关键。

利用OpenGL进行碰撞检测、重力模拟等操作,可以让游戏中的物体表现出真实世界的物理特性。

三、性能优化技巧1. 批处理在渲染大量物体时,尽量减少状态切换次数,将相邻物体合并成一个批次进行渲染,可以显著提升性能。

2. 纹理压缩使用纹理压缩技术可以减小纹理占用内存大小,降低GPU负担,提高渲染效率。

3. GPU剔除利用OpenGL提供的剔除技术,可以在渲染前排除掉不可见的物体,减少不必要的渲染计算,提升帧率。

4. 着色器优化合理设计着色器程序结构,避免过多分支和循环语句,优化着色器代码可以提高渲染效率。

四、案例分析:《夺宝奇兵》游戏开发以《夺宝奇兵》为例,该游戏采用了基于OpenGL的三维引擎进行开发。

通过对场景进行精细化设计、优化纹理资源、合理设置光照效果等手段,成功打造了一个高品质的三维冒险游戏。

用OpenGL实现交互式的三维图形显示

用OpenGL实现交互式的三维图形显示
g n a 0 2 @ sn . on . ogn 3 8 i a c i
通 过 指 定 相 应 的 视 图 变 换 矩 阵 , 以 控 制 O eG 可 pn I
显示物体 的位置 ( 移动相机) 大小 ( 、 将相机移近或 移远物体 ) 还能实现物体在肝幕 } , : 的旋转操作 ( 将
平行投影 ( 或称 正交投影 ) 将物体直接 映射到
屏幕上 , 而不改变它们 的相对尺寸。计算机辅助设 计中使用 的往往是平行投影 , 它们需要 的不是物体 的真实感 , 而更加偏重于物体 的实际的( 或相对的) 尺寸。函数 g r o l t 用来指定合适的平行投影矩阵 , Oh 其六个参 数同样用来设 置视 图体 的范 围。文 中示 例中同时考虑 了透视投影和平行投影。
维普资讯
第 6卷
第1 O期 2 0 0 6年 5月



术 与 工


Vo. No 1 16 .0
Ma 0 6 y2 0
17 —8 5 20 ) 0 12 —2 6 111 ( 06 1 —4 80
S in e T c n lg n g n e ig ce c e h oo y a d En i e r n
所在位置 ee ,yY ee ) 参考点 ( yX ee 和 yZ 、 代表物体的
中心,et X cn r cn r ,et Y和 cn r ) e e et Z 和观察 物体 时向 e 上的方向( 即观察 物体 时头顶 所指 向的方 向,p , u X
u Y uZ 。 p 和 p )
若改变视点的位置 , 使得视点 与参考点之间的 距离发生变化 , 则可 以实 现物体 的缩 放; 改变参 若 考点的位置 , 使得参考点偏 离物体 的中心 , 可以 则 实现物体的平移 ; 若改 变观察物体 时 向上 的方 向, 则可以实现物体的旋转。 通过视图变换 和模 型变换 均可 以实现对 物体 的缩放 、 移和旋转操作 , 平 而且 两种方式通 过指定 视 口变换相 当于将 照 片放 在幻灯机上 进行观 察 的过程。这个 过程最终决 定 了物体在计 算机屏 幕上显示的位置 、 大小等。投影变换 指定 映射 的机 制, 而视 口变换则给 出映射后 图象在屏幕中最终显

3D模型LOD算法的研究及其OpenGL实现

3D模型LOD算法的研究及其OpenGL实现
摘要:3D模型LOD技术是计算机图形学的一个重要研究课题,简述了3D模型LOD技术的基本原理并分析和探讨 了各粪LOD算法。为了克服LOD算法在使用中的局限性,提出了一种3D模型LOD算法,并通过OpenGL编程进行了 实现,运行的结果表明此3D模型LOD算法是可行和高效的。 关键词:3D模型;三角形网格;层次细节显示和简化几何形状过渡
[4] UNIX技术大全:系统管理员卷【M]北京:机械工业出版社, 1998
(上接第1791页)
囤4程序截图2
在程序截圈1中,右边为原始模型,一共有551个三角 形,左边是删减后的模型,有332个三角形,尽管三角形数量 减少了40%,但形体仍保持较好。
在程序截图2中,左边模型的三角形数量只有180,减 少了67%,这可以清楚地从右侧的网格显示图中看出来,但 当距离很远时,很难区分两者的差别。
Key words:3-D model;triangular mesh;LOD;geomorphs
……一

物体很近时,它的图像将在屏幕上占据较多的像素,而当视 点距离它很远时,图像只能在屏幕上占据很少的像素。在
在研制较大规模的可视化模拟系统时,由于三维场景 这种情况下,用大量的多边形或三角面片去精确表示该物
从近处观察物体时,我们采用精细模型 而当从远处观察物 体时,则采用较为粗糙的模型。
·建立相邻层次多边形同格埘,^缸 (o≤I<n)之间的儿 何形状过渡:
w:M.一MH L 当视点连续变化时,在髓个不同层次模型间就存在一 个明显的跳跃,因而有必要在两个相邻层次的模型间形成 光滑的视觉过渡,我们称之为几何形状过渡(geomorphs)。
删除边的根据是边的权值,其计算公式为: cos“u,v)=|_“一v_I。max(min((1一厂normal*n.normaD+2))

基于OpenGL的三维游戏引擎设计与实现

基于OpenGL的三维游戏引擎设计与实现

基于OpenGL的三维游戏引擎设计与实现在当今数字游戏行业蓬勃发展的背景下,三维游戏引擎作为游戏开发的核心技术之一,扮演着至关重要的角色。

基于OpenGL的三维游戏引擎设计与实现是一个复杂而又具有挑战性的任务,需要开发者具备扎实的编程基础、对图形学原理的深刻理解以及对游戏引擎架构的把握能力。

本文将深入探讨基于OpenGL的三维游戏引擎的设计与实现过程,带领读者一窥游戏引擎开发的奥秘。

一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,广泛应用于计算机图形领域。

作为一种开放标准,OpenGL提供了丰富的图形渲染功能,为开发者提供了强大的工具来实现各种视觉效果。

在三维游戏开发中,OpenGL扮演着至关重要的角色,为游戏引擎提供了底层的图形渲染支持。

二、三维游戏引擎架构设计1. 游戏循环在设计三维游戏引擎时,首先需要考虑的是游戏循环(Game Loop)。

游戏循环是指游戏引擎不断更新游戏状态并渲染画面的过程,通常包括事件处理、物理模拟、逻辑更新和渲染等步骤。

一个高效稳定的游戏循环是保证游戏流畅性和性能的关键。

2. 场景管理场景管理是指如何管理游戏中的场景、对象和资源。

在三维游戏中,场景管理器负责加载、卸载场景、管理场景中的对象以及处理碰撞检测等任务。

合理设计场景管理系统可以提高游戏开发效率和资源利用率。

3. 图形渲染图形渲染是三维游戏引擎最核心的部分之一。

通过OpenGL提供的图形渲染功能,开发者可以实现各种视觉效果,包括光照、阴影、纹理映射等。

合理利用OpenGL API可以提高渲染效率和画面质量。

4. 用户交互用户交互是指玩家与游戏之间的互动过程。

在三维游戏中,用户交互包括键盘鼠标输入、触摸屏输入等方式。

设计友好直观的用户交互系统可以提升玩家体验和游戏可玩性。

三、基于OpenGL的三维游戏引擎实现1. 硬件加速利用OpenGL进行三维图形渲染时,可以充分利用硬件加速功能来提高渲染效率。

基于3DS与OpenGL的三维人体模型构建方法

基于3DS与OpenGL的三维人体模型构建方法

基于3DS与OpenGL的三维人体模型构建方法摘要:在应用程序中构建三维人体模型是实现三维虚拟试衣系统的一项基础工作。

在Visual C++6.0开发环境下,利用OpenGL和3DS优势互补实现人体模型的构建和交互。

克服了因OpenGL没有提供三维模型的高级命令,仅通过点、线及多边形等基本几何图元构建模型所造成的工作量和难度大的问题,实现了快速构建高质量三维人体模型的目的。

关键词:三维人体模型;OpenGL;3DS0引言三维人体建模是实现虚拟试衣的基础,也是计算机图形学和服装CAD 领域研究的热点和难点。

目前,在服装人体建模中主要使用的方法有4种:多面体建模、基于特征的服装人体曲面建模、参数化的曲面建模、以网格边界线为连续条件的三维人体建模[1]。

人体表面复杂、不规则,人体模型建立难度较大,不少学者在人体建模方面进行了相关研究。

宋庆文等[2]对人体模型数据进行分析,用NURBS曲面构建了人体的四肢和躯干,但手部和脚的原始三角型网孔依然残留着。

吴龙、张欣等[3]在单文档视图模式下调用OpenGL,通过多边形曲面造型方法来实现参数化人台设计。

盛光有、姜寿山等[4]以一种基于单目视觉测量原理的三维人体扫描装置获得的人体数据为来源,运用三角面片法构建人体表面,并把人体模型保存为标准的OBJ文件模型格式。

李基拓等[5]提出了使用正、侧、背面 4 幅正交人体图像,通过参数化变形截面环变形人体模型模板后得到带服饰纹理的个性化虚拟人,但基于照片构建的人体模型往往真实程度很差,不能真正反映人体的特征。

本文的三维人体模型构建采用多面体建模技术,在获取人体曲面数据阶段,通过Poser中的人体模型导出为3DS 文件来获得相关数据,并结合3DS和OpenGL的方法来实现模型构建和交互。

13DS文件格式3DS是非常普遍的数据格式,以3DS格式保存的三维图形文件非常丰富。

3DS文件由块组成,每个块由信息类别和下一个块的相对位置两部分组成,其中块的信息类别由ID来识别。

基于OpenGL的交互技术研究

基于OpenGL的交互技术研究
名称堆栈 然后 , 在发出各景物绘图命令 同时 , 用
() 6 应用双缓存技术实现平滑动画。 () 7 提供实现交互技术 的机制。
1 Op n L简 述 eG
O eG pn L是 由 S 公 司推出的独立 于操作 系 GI 统和硬件环境 的开放式三维 图形库 , 作为一种用于
实时 3 图 形 的 工 业 标 准 AP ( p lai r— D I A pi t n Po c o
() 1 创建三维物体 。 () 2 绘制场景并以合适 的角度观看场景。 ( )实现物体 的光照 , 与光源 、 3 这 被照物体的 材质特性和物体表面每点的法向量有关 , 使绘制图
・4 ・ 6 Fra bibliotek上 海 工 程 技 术 大 学 学 报
第2 0卷
形具有真实感和立体感。 () 4 应用纹理映射技术 , 表示物体表面细节 。 ( ) pn L提供一系列特殊的函数 , 5 O eG 使用融 合技术实现半透明效果 ; 使用雾化技术模拟雾或模 糊场景 ; 使用反走样技术, 可以改善图像质量等 , 从
a d a tmaial n iaeisp it g a e n t esr e n uo t l idc t t ani rai h ce n.Att esmet e h ed a k o ea in c n s n c y n h a i ,t efe b c p rt a e d m o
Opn L的交 互技 术。 eG
关键词 : pn L 交互技术 ; O eG ; 选择 ; 拾取 ; 反馈 中图分 类号 : P3 74 T 1 . 文献标 志 码 :A
R s a c fIt r c ie T c n l g s d o e GL e e r h o n e a t e h o o y Ba e n Op n v

一种运用OpenGL导入显示3DS三维模型的方法

一种运用OpenGL导入显示3DS三维模型的方法

} 三、3DS 模型在 OpenGL 中的再现过程 1. 计算法向量 在绘制场景时,首先计算法向量,它直接影响到 光线从不同的的角度入射到模型表面,产生不同的 显示结果,如果法向量不确定,三维效果的图形是显 示不出来的。再通过模型的各种变换来实现法向量 的计算,这里. 利用自定义的方法 void CLoad3DS: : Counts( t3DModel* pModel) 来计算对象,遍历对象 的面和顶点的所有信息,从而计算出这些信息的法 向量. 再将法向量添加到法向量列表中。 2. 重绘三维模型 根据存储在自定义的数据结构的信息,OpenGL 将模型绘制出来。在 OpenGL 中重现 3DS 模型是通 过 OnDraw ( CDC * pDC ) 函 数 中 调 用 显 示 列 表 drawGL( ) 函数实现的。 下面这个方法 drawGL( ) 是画出各个物体块。 void CTriObject: : drawGL( ) { if ( normalapplied) { glBegin( GL_TRIANGLES) ; for ( i = 0; i < numfaces /3; i + + ) { / / 此处用 glVertex3f 函数带出各个面} glEnd( ) ; } } 四、结束语 本文运用 OpenGL 导入显示 3DS 三维模型,即 在利用现有强大的三维建模软件建立优秀的模型 后,实现模型在 OpenGL 交互控制,从 多 个 角 度 更 直 观 地 展 示 三 维 模 型 。 本 方 法 在 军 事 、广 播 电 视 、 CAD / CAM / CAE、娱乐、艺 术 造 型、医 疗 影 像、虚 拟 世界等领域 都 有 着 广 泛 的 应 用,它 将 避 免 大 量 地 重 复 建 模 工 作 ,且 系 统 设 计 简 单 ,有 效 地 提 高 工 作 效率。

基于VB6.0和OpenGL的DXF文件读取与交互控制

基于VB6.0和OpenGL的DXF文件读取与交互控制

基于VB6.0和OpenGL的DXF文件读取与交互控制
张永超;岳建平;王海青
【期刊名称】《计算机时代》
【年(卷),期】2009(000)009
【摘要】DXF文件格式是传统图形开发中最常用的图形交换格式之一,众多第三方开发的图形软件均加入了对DXF文件的支持.为开发一套三维可视化仿真数据分析软件,首先就必须解决对DXF文件的读取及显示问题.文章详细分析了ASCⅡ码格式DXF文件的数据结构特点,然后,使用VB6.0从中读取数据,并利用OpenGL的模型绘制和渲染功能,实现了三维模型的重构以及交互控制.这种处理方法既能满足快速建模的需要,又能高效地实现友好的交互功能.
【总页数】3页(P39-41)
【作者】张永超;岳建平;王海青
【作者单位】河海大学土木工程学院,江苏,南京,210098;河海大学土木工程学院,江苏,南京,210098;河海大学土木工程学院,江苏,南京,210098
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于 OpenGL的三维模型交互控制研究 [J], 叶帅;游有鹏;邢永彦
2.基于VC++和OpenGL的STL文件读取显示 [J], 严梽铭;钟艳如
3.基于OpenGL的3DS图形文件读取和显示 [J], 李声弘;周楚涵;董远
4.基于dxflib库的dxf格式文件读取和写入方法研究 [J], 梁小锋;张海洋
5.基于dxflib库的dxf格式文件读取和写入方法研究 [J], 梁小锋;张海洋
因版权原因,仅展示原文概要,查看原文内容请购买。

基于OpenGL的三维建模与动画设计技术研究

基于OpenGL的三维建模与动画设计技术研究

基于OpenGL的三维建模与动画设计技术研究一、引言在当今数字化时代,三维建模与动画设计技术已经成为影视、游戏、虚拟现实等领域不可或缺的重要组成部分。

而OpenGL作为一种跨平台的图形库,被广泛运用于三维建模与动画设计中。

本文将探讨基于OpenGL的三维建模与动画设计技术,包括其原理、应用和未来发展趋势。

二、OpenGL概述OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨平台图形库。

它提供了一系列的函数,可以用来绘制复杂的图形、场景和动画。

OpenGL具有开放源代码、跨平台、高性能等特点,因此被广泛应用于计算机图形学领域。

三、三维建模技术1. 网格建模网格建模是三维建模中最基本的技术之一,它通过顶点、边和面构成的网格结构来描述物体的外观和形状。

在OpenGL中,可以利用顶点缓冲对象(VBO)和索引缓冲对象(IBO)来高效地管理网格数据,实现复杂物体的建模。

2. 着色器编程着色器编程是OpenGL中非常重要的一部分,它可以控制光照、材质、纹理等效果,从而使得渲染出来的图像更加逼真和生动。

顶点着色器和片元着色器是着色器编程中常用的两种着色器类型,它们可以对顶点和像素进行灵活处理。

3. 纹理映射纹理映射是将二维图像映射到三维物体表面上的技术,可以使得物体表面呈现出各种细节和纹理。

在OpenGL中,通过纹理对象和纹理坐标来实现纹理映射,从而增强了三维场景的真实感和视觉效果。

四、三维动画设计技术1. 骨骼动画骨骼动画是一种基于骨骼系统进行变换和插值计算的动画技术,可以使得角色或物体呈现出生动的动作和表情。

在OpenGL中,可以通过骨骼动画算法和插值技术实现复杂的角色动画效果。

2. 关键帧动画关键帧动画是一种基于关键帧设置和插值计算的动画技术,通过在不同关键帧上设置物体的位置、旋转等属性,然后通过插值计算生成中间帧,从而实现流畅自然的动画效果。

在OpenGL中,可以通过关键帧插值算法实现各种复杂的动画效果。

基于OpenGL的3D模型浏览、测量及管理

基于OpenGL的3D模型浏览、测量及管理

1D S数据模型的结构及读取 3
3 DS是一种三 维模型 的数据文件 交换格式 ,含有纹理和 光照信息。它 是由 A tD s uo ek公司定义的 ,并可以通过多种 3 D软件进行创建、打开、编辑、保存等操作。由于它的通用 性 ,很多软件 中都需要提供接 1来完成 3 模型的管理 及操 3 D
m a a e n a o ltd Th x rs iea ii da p ia l au f3 mo esaeg al r v yu ig teeWc n q e ・ n g me t n b c mpee . ee p sv blt a p lc bev eo D d l r t i C e e yn l r e y mp o e b sn s .h i u s d h
中圈 分类号l 1 11  ̄ 12 1 3 ・
基 于 Op n e GL 的 3 模 型 浏 览 、 测 量及 管 理 D
仲思东 .肓 智
(. 1 武汉大学 电子信息学院 ,武汉 407 ;2 武汉 大学遥感信息工程学院 ,武汉 407) 309 . 309
■ 蔓 :通过解析 3 S 式的模 型数据结构 ,借助于 O e G D 格 p n L实现了 3 D模型 的浏览 。通过高精度 的交 互操 作、实现模型 的点拾取 功能 是

[ ywo d ]Op n ; D mo esT xue Itrcieo rt n P it eet n Ke r s e GL 3 d l e tr;neat p ao ; on l i ; v e i sc o
r, L r


L ● ● ● L r
科学可视化 ,计 算机 动画和虚 拟现 实是计算机 图
ZHONG i o g , S d n GAO i Zh

基于OpenGL的3D游戏引擎设计与实现

基于OpenGL的3D游戏引擎设计与实现

基于OpenGL的3D游戏引擎设计与实现一、引言随着计算机图形学和游戏行业的快速发展,3D游戏引擎作为游戏开发的核心技术之一,扮演着至关重要的角色。

本文将介绍基于OpenGL的3D游戏引擎的设计与实现过程,包括引擎架构设计、渲染管线实现、物理引擎集成等方面的内容。

二、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形API,广泛应用于计算机图形学、虚拟现实、游戏开发等领域。

作为一种开放标准,OpenGL提供了丰富的图形功能和接口,为开发者提供了强大的图形渲染能力。

三、3D游戏引擎架构设计1. 游戏引擎架构概述在设计3D游戏引擎时,通常会采用模块化的架构设计,包括渲染模块、物理模块、场景管理模块、资源管理模块等。

这些模块相互独立又相互关联,共同构成一个完整的游戏引擎系统。

2. 渲染模块设计渲染模块是3D游戏引擎中最核心的部分之一,负责将场景中的3D模型、纹理等元素渲染到屏幕上。

在基于OpenGL的游戏引擎中,需要实现渲染管线、着色器编写、光照效果等功能。

3. 物理模块集成物理引擎在3D游戏中扮演着模拟真实物理效果的重要角色。

通过集成物理引擎,可以实现游戏中的碰撞检测、重力模拟、运动仿真等功能,增强游戏的真实感和交互性。

四、OpenGL渲染管线实现1. 顶点着色器与片元着色器顶点着色器和片元着色器是OpenGL渲染管线中两个重要的阶段。

顶点着色器负责对顶点进行变换和投影操作,片元着色器则负责对像素进行颜色计算和纹理采样。

2. 光照与阴影效果在3D游戏中,光照和阴影效果是营造真实场景感的重要手段。

通过在OpenGL中实现光照模型和阴影算法,可以使游戏场景更加逼真。

3. 纹理映射与贴图纹理映射是将2D纹理映射到3D模型表面的过程,在OpenGL中通过纹理对象和纹理坐标来实现。

贴图可以为游戏场景增加细节和真实感,提升视觉效果。

五、基于OpenGL的3D游戏引擎实现1. 引擎初始化与资源加载在开发基于OpenGL的3D游戏引擎时,首先需要进行引擎初始化工作,包括创建窗口、初始化OpenGL环境等。

3DS与OBJ格式的三维模型文件在OpenGL中的输入与处理

3DS与OBJ格式的三维模型文件在OpenGL中的输入与处理

3DS与OBJ格式的三维模型文件在OpenGL中的输入与处理【摘要】介绍了两种流行的三维文件的文件格式,即3DS文件与OBJ文件,并论述了如何将这些文件在OpenGL(Open Graphic Library)中进行输入和处理。

重点为OBJ文件的文件格式及怎样利用程序代码来构建模型数据结构、绘制对象模型,然后运用OpenGL实现三维显示和交互操作,并应用于地形建模、城市规划以及虚拟现实等领域。

【关键词】三维模型文件;OpenGL;3DS文件;OBJ文件1.前言OpenGL(开放图形库)作为一个开放的三维图形软件包,它独立于窗口系统和操作系统,基于OpenGL开发的应用程序可以十分方便地在各种平台间移植。

OpenGL的功能包括:建模、变换、颜色模式设置、纹理映射、位图显示以及双缓存动画等,而且借助Windows编程环境可以方便地对所构模型的人机交互进行控制。

由于其开放性和高度重用性,OpenGL已经成为业界标准[1]。

虽然OpenGL提供了一些建立形体模型的命令,但OpenGL并没有提供更为复杂的三维模型的高级命令。

在这种情况下,如果完全通过基本的几何图元—点、线、多边形来构建模型,势必十分困难;另一方面,由于3D图形技术的发展,形成了非常多的3D建模软件,这些软件建模一般比较方便,但又难以对其进行控制和交互。

因此,如何有效地利用这些资源,对于快速开发可视化系统具有非常重要的意义。

作者在本文中对两种流行的三维模型文件的文件格式进行了介绍,并通过程序实现了文件的读取。

把这些文件转换成OpenGL程序,再对其进行控制和交互操作。

2.3DS文件的输入和处理3D Studio Max是Autodesk公司开发的用于制作三维动画的应用程序,它所生成的图形文件格式是3DS文件格式。

该软件建模方便,且功能强大。

因此,可以利用3D Studio Max对构建可视化系统提供重要帮助。

这里介绍一种将3DS 文件转换成OpenGL文件的简单方法。

基于OpenGL三维图形的开发

基于OpenGL三维图形的开发

纹理映射(Texture Mapping):利用OpenGL纹理映射功能可以十分 逼真地表达物体表面细节。 位图显示和图象增强:图象功能除了基本的拷贝和像素读写外,还提 供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图 象效果处理。以上三条可是被仿真物更具真实感,增强图形显示的效 果。
用户必须从点、线、面等最基本的图形单 元开始构造自己的三维模型
OpenGL提供了以下的对三维物体的绘制 方式:
网格线绘图方式(wireframe):这种方式仅绘制三维物体的网格轮廓 线。 深度优先网格线绘图方式(depth_cued):用网格线方式绘图,增加 模拟人眼看物体一样,远处的物体比近处的物体要暗些。 反走样网格线绘图方式(antialiased):用网格线方式绘图,绘图时采 用反走样技术以减少图形线条的参差不齐。 平面消隐绘图方式(flat_shade):对模型的隐藏面进行消隐,对模型 的平面单元按光照程度进行着色但不进行光滑处理。
OpenGL具体功能
模型绘制:OpenGL能够绘制点、线和多边形。应用这些基 本的形体,我们可以构造出几乎所有的三维模型。 OpenGL通常用模型的多边形的顶点来描述三维模型。如 何通过多边形及其顶点来描述三维模型,在指南的在后续 章节会有详细的介绍。 模型观察:在建立了三维景物模型后,就需要用OpenGL描 述如何观察所建立的三维模型。观察三维模型是通过一系 列的坐标变换进行的。模型的坐标变换在使观察者能够在 视点位置观察与视点相适应的三维模型景观。在整个三维 模型的观察过程中,投影变换的类型决定观察三维模型的 观察方式,不同的投影变换得到的三维模型的景象也是不 同的。最后的视窗变换则对模型的景象进行裁剪缩放,即 决定整个三维模型在屏幕上的图象。

OBJ模型文件在OpenGL中的导入与处理

OBJ模型文件在OpenGL中的导入与处理

科技信息SCIENCE&TECHNOLOGYINFORMATION2013年第7期0前言OpenGL 作为一个开源跨平台的三维计算机图形和模型库,凭借其开放性和高度重用性,现在已经成为业界标准[1]。

虽然OpenGL 的辅助库中提供了一些复杂的形体模型的命令,但是OpenGL 并没有提供更为复杂的三维模型的高级命令[2],完全通过基本的几何图元(如点、线、多边形)来构建复杂的模型十分困难。

随着3D 图形技术的发展,出现了非常多的3D 建模软件。

这些软件建模一般比较方便,但又难以对其进行控制和交互。

本文提出了一种将OBJ 模型文件的模型数据(顶点、法线、纹理坐标等数据)进行分离、提取、并保存到OpenGL 中进行显示和渲染的方法。

该方法可以有效降低OpenGL 复杂建模的难度。

1OBJ 模型文件介绍通常OBJ 为后缀的文件有两种:一种,是程序编译时生成的中间代码文件也称目标文件,再通过链接器和资源文件链接就成exe 文件了。

第二种,是由Alias|Wavefront 公司推出的一种标准的3D 模型文件格式[2],本文涉及到的OBJ 文件格式是指后者。

OBJ 模型文件是让人可读的文本,存储了模型的顶点、法线和纹理坐标和材质使用信息。

可以直接用记事本打开对它进行编辑。

而且OBJ 文件不需要任何种文件头(File Header),以井号(#)为开头注释行,非注释行都由一两个标记字母也就是关键字(Keyword )开头,关键字可以说明这一行代表什么数据。

多行可以通过每一行最后添加一个连接符(\)逻辑地连接在一起表示一行。

在OBJ 模型文件中,每行的格式如下:前缀、参数1、参数2、参数3......前缀标识了这一行所存储的信息类型。

参数则是具体的数据。

OBJ 文件中使用的常见的关键字及其描述如表1所示:表1OBJ 文件中使用的常见的关键字及其描述OBJ 模型文件[4]支持的关键词还有很多,本文不做一一介绍了,详细请参阅相关资料。

MFC框架下三维场景的绘制与交互控制

MFC框架下三维场景的绘制与交互控制

MFC框架下三维场景的绘制与交互控制摘要:通过一个实例,讲述了在MFC框架下使用OpenGL函数来快速构建一个可以交换控制的三维球体。

MFC框架编程,在获得设备环境对象后,使用绘图函数完成绘图工作,并编辑应用程序菜单为菜单项连接处理函数。

利用OpenGL开发库函数,在VC++关键词:MFC;光照模型;纹理映射1 创建项目在VC环境下用OpenGL函数库绘制图像,需要在VC里导入OpenGL的头文件、静态链接文件等。

将glut.h放到...Microsoft Visual StudioVC98IncludeGL目录下,将glut32.lib放到...Microsoft Visual StudioVC98Lib目录下,将glut32.dll放到X:windowssystom32目录下。

创建项目,基于OpenGL的三维图形的绘制可以在MFC的对话框下进行绘制,也可以在单文档中进行绘制,本课题采取在单文档模式下进行三维图形的绘制。

创建一个MFC SDI应用程序,在项目属性中加入所需要链接的库文件。

2 系统初始化(1)打开ClassWizard,选择CtestballView类,为下述消息加入消息处理函数:WM_CREATE,WM_DESTROY,WM_SIZE,WM_ERASEBACKGROUND。

其中OnSize中的glMatrixMode是用来设置矩阵模式的,它有三个选项:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE。

GL_MODELVIEW表示从实体坐标系转到人眼坐标系。

GL_PROJECTION表示从人眼坐标系转到剪裁坐标系。

GL_TEXTURE表示从定义纹理的坐标系到粘贴纹理的坐标系的变换。

要使三维物体显得更流畅,前后各面的空间关系正确,一定得使用Z缓冲技术。

否则,前后各面的位置就会相互重叠,不能正确显示。

Z缓冲区存储物体每一个点的值,这个值表明此点离人眼的距离。

基于OpenGL的3DS模型的导入与控制

基于OpenGL的3DS模型的导入与控制

基于OpenGL的3DS模型的导入与控制高海芳;王天雷;邱杰;康献民;王大承【摘要】研究了在VC++6.0环境下利用OpenGL导入3DS模型的两种方法,并给出了具体实现过程和技术要点,两种导入方法比较结果说明:读入3DS文件类的方法优于文件转换法,导入的模型图的失真度很小,并可方便实现平移、旋转、缩放、拾取等人机交互控制.【期刊名称】《五邑大学学报(自然科学版)》【年(卷),期】2010(024)003【总页数】5页(P32-36)【关键词】OpenGL;3DS模型;人机交互【作者】高海芳;王天雷;邱杰;康献民;王大承【作者单位】五邑大学,机电工程学院,广东,江门,529020;五邑大学,信息工程学院,广东,江门,529020;国家摩托车及配件质量监督检验中心,广东,江门,529000;五邑大学,机电工程学院,广东,江门,529020;五邑大学,摩托车研究院,广东,江门,529020;五邑大学,机电工程学院,广东,江门,529020;五邑大学,摩托车研究院,广东,江门,529020【正文语种】中文【中图分类】TP311OpenGL是SGI公司开发的一套高性能的图形处理系统,是图形硬件的软件界面[1]. 通过OpenGL,程序员可以创建人机交互的应用程序,实现具有逼真效果的三维图形图像,但是利用OpenGL绘制复杂的三维模型的工作量和难度较大;而利用3DS MAX可灵活绘制复杂的三维模型及动画,但不能实现人机交互;因此,越来越多的图形、图像制作者选择利用OpenGL与3DS MAX的优势,即使用3DS MAX对复杂模型建模,再将它导入OpenGL中编程,实现交互式的动画.3DS模型文件由许多Chunk组成,每个Chunk包括一个头和一个主体,Chunk是相互嵌套的,这就决定了必须以递归的方式读取它们. Chunk的头又由2部分组成:ID是一个整型数,表示Chunk的含义;Chunk的长度是一个长整型数(以字节为单位,包括头),包含了下一个Chunk的相对位置信息[2-3]. 3DS模型文件中有一个基本Chunk,其ID是4D4D,基本Chunk又称为主Chunk,主Chunk包括3D编辑器Chunk和关键帧Chunk. 3DS模型文件中3个主要的Chunk ID信息见表1.文件转换是指直接采用VIEW3DS等软件将3DS文件转换为OpenGL所需要的C 文件. 具体实现过程如下:1)将VIEW3DS软件在开始菜单的运行程序中运行;2)将需要转换的3DS文件拖入即可得到一个后缀名为.h和.gl的文件;3)将这2个文件拷贝到已编好的OpenGL框架程序中,并在工程菜单中加入这2个文件;4)在视类的执行文件中添加该头文件,如#include "BASE.h",并添加成员变量int Model,在初始化函数中添加代码:Model =GL3DS_initialize_BASE(),在绘制场景函数中添加代码:glCallList(Model1),编译运行程序即可得到图1所示的模型图.该方法使用简单,但模型在导入过程中丢失了部分材质及纹理,有明显的失真;由于模型以一个数据文件存放,也不便于控制.由于3DS模型文件中的编辑Chunk、颜色Chunk、材质Chunk、纹理Chunk最重要,对3DS模型起关键性的作用,因此建立读入3DS文件的类就是怎样读入这些关键的Chunk. 在VC++6.0的MFC框架中定义一个名为3DSload的类,用于3DS文件的读入与重绘,该类中主要定义了几个结构体及主要函数.1)主要结构体:a. 颜色结构体typedef struct {GLfloat red; 颜色的红色分量GLfloat green; 颜色的绿色分量GLfloat blue; 颜色的蓝色分量GLfloat alpha;}OUTGL_RGB;b. 顶点结构typedef struct {GLfloat u,v; 纹理坐标GLfloat nx,ny,nz; 法向量GLfloat x,y,z; 坐标值}OUTGL_VERTEX;c. 对象结构体M3DSObject用于存取读入的内容typedef struct{GLuint NumVertex;OUTGL_VERTEX *VertexLists;GLuint NumPolygon;GLuint strip;POLYGONLIST *PolygonLists;}M3DSObject;2)主要函数:M3DSObject* Load3DSObject(char *filename); 读取3DS文件函数void Draw3DSObject(M3DSObject *object);3DS模型重绘函数void Unitize3DSObject(M3DSObject *object);3DS模型归一化函数将3DS模型归一化,即将模型平移到原点,并缩放到每个坐标均在[-1,1]的立方体中.3DSload类编写完成后即可按下面的步骤导入3DS模型:1)在MFC的文档类中添加成员变量M3DSObject *m_Real3DS1用于存取导入的模型.2)添加OnOpenDocument的消息响应函数. 为了能够导入多个模型并便于控制,采用显示列表的方法加载模型. 在OnOpenDocument的消息响应函数中添加源程序:BOOL CRead3DSDoc::OnOpenDocument(LPCTSTR lpszPathName){glNewList(1,GL_COMPILE);创建显示列表m_Real3DS1=Load3DSObject("BASE.3DS");导入第一个名为BASE.3DS的模型Draw3DSObject(m_Real3DS1);调用3DSload类的成员函数重绘3DS模型glEndList();...glNewList(7,GL_COMPILE);m_Real3DS2=Load3DSObject("6.3DS");Draw3DSObject(m_Real3DS2);glEndList();}3)在视图类中添加成员函数DrawWithOpenGL()重绘导入模型.4)在视图类中响应OnPaint()函数,并在该函数下调用DrawWithOpenGL()函数显示3DS模型.编译运行程序即可得到如图2所示的 6轴机器人模型. 由图2可知:由于采用创建显示列表的方法分别导入机器人的各个关节,容易对每个关节实施控制,所以导入的机器人模型不存在失真. 但是该方法操作比较复杂,要求编程者对3DS模型结构有较好的了解,并且有一定的VC++基础.由3DS文件类的读入方法导入的3DS模型能很容易地实现平移、旋转、缩放和拾取等人机交互控制.模型图平移采用函数glTranslatef(m_xTranslation, m_yTranslation,m_zTranslation)实现,其中3个参数对应3个坐标轴. 模型图旋转采用函数glRotatef(m_Rotation,x,y,z),其中m_Rotation表示旋转角度,x、y、z的取值为0或1[4],取1表示该轴即为旋转轴. 例如:glRotatef(30.0f,1.0f,0.0f,0.0f)表示绕x轴旋转30º. 通过平移与旋转可对图2中机器人模型的各个关节进行控制,实现如图3所示的效果. 为实现实时控制,采用鼠标右键与Ctrl键组合实现旋转控制,鼠标右键与Shif键组合实现平移控制. 其实现过程如下:1)定义一个Bool型变量m_RButtonDown,判断鼠标右键是否按下:变量为真表示按下,为假表示松开.2)定义一个Cpoint变量存取鼠标右键按下的位置,该点的位置与鼠标平移后松开的位置即可表示为旋转与平移控制函数的参数(由于通过响应鼠标按下的消息所获得的点是x,y平面内的二维点,而平移函数中z轴方向的参数是没有办法获得的,所以通过鼠标右键移动只能使导入的3DS模型在x,y平面内移动).3)通过if语句:if(m_ReftButtonDown&&(nFlags&MK_SHIFT/MK_CTRL))判断是旋转控制还是平移控制.模型图缩放采用函数glScalef(m_xScaling,m_yScaling,m_zScaling)实现,其中3个参数对应于3个坐标轴的缩放比例. 采用一个Slider控件控制缩放,缩放函数的参数可通过Slider控件的移动获得,一般将函数glScalef(m_xScaling,m_yScaling,m_zScaling)中的3个参数设为大小一样.在OpenGL程序中拾取是在投影变换(Projection Transformation)阶段利用投影变换中归一化视体操作来实现的. 拾取时,我们用一个选择框来选择物体;设置模型图拾取控制函数gluPickMatrix (x,y,width,height,viewport[4]),其中x,y是鼠标点击到窗口上的坐标,width和height就是以(x,y)为中心的拾取框的宽度和高度,viewport是当前窗口的大小;初始化名称堆栈函数glSelectBuffer (SIZE,selectBuf),SIZE表示堆栈大小,selectBuf表示堆栈名称,初始化对象名称函数glInitNames(),加载对象名称glLoadName(GLuint name),name为整型数,表示加载对象名称. 具体实现模型图拾取控制的流程如图4所示.将3DS模型导入OpenGl软件中,降低了OpenGl复杂建模的难度,可以得到较真实的三维复杂物体模型. 采用在OpenGL程序中引入3DS数据模型文件的方法得到了较好的三维效果,同时可以进行人机交互处理,成果可用于机器人仿真软件开发、3D游戏开发等领域.【相关文献】[1] 李新,李姗姗. 3DS模型在OpenGL中的读取和重绘[J]. 首都师范大学学报:自然科学版,2008, 29(2): 101-104.[2]OpenGL体系结构审核委员会. OpenGL编程指南[M]. 4版. 邓郑祥. 北京:人民邮电出版社,2005.[3]WRIGHT R S, APCHAK J B. OpenGL超级宝典[M]. 徐波. 北京:人民邮电出版社,2005.[4] 张正波,牟彦,黄华,等. OpenGL实现3DS文件中的模型自由旋转[J]. 计算机工程与应用,2005, 41(13): 98-100.。

OpenGL中交互式任意旋转三维场景的实现

OpenGL中交互式任意旋转三维场景的实现

由三维物体生成二维 图形 时需要在世界坐标系 中指定观
察点 、 观察参考点 以及一个表示视线 向上 方向的矢 量 , 这些要 素构成 一个观察坐标 系 , 以表示对象 与观察 者的位 置关系 , 用
也叫做视 点坐标系 。
函数 的前三个 参数 指定 观察 点 ( 视点 )y ee的位 置 , 中间 三个 参 数 指 定 观 察 参 考 点 cn r的位 置 , 后 三个 参 数 et e 最 指定视线向上的方向 u 。 p
个视变换 , 函数声明如下 : 其
vi lL oA ( du l ee , du l ee,G dul yz odg ok tGL obe yx GL obe yy L o beee, u
’ GL o b e c n e x GL o b e c n e ' GL o b e c n ez d u l e tr, d u l e tr, / d u l e t r
最佳选择 , WX Z表 示世 界 坐标 系 ,X Z表 示观 察 坐标 以 Y EY 系 ,X Z O Y 表示局部坐标 系 , 么在观 察 坐标 系下 , 三种 坐 那 这
22 g LoA 函 数 . l ok t u
个坐标 系 , 对象 自身定位于其 中 , 坐标系就是局部坐标 该 这个
系, 用来描述对象的形状 。
2 )世界 坐标系

旦 指定 了单个 物体 的形状 , 我们 就可 以把它放 到场景
g LoA 函数是 一个 O eG l ok t u p n L实用库 函数 , 它定义 了一
图 1 三种坐标系的关系
采用 的交互式输入设备 ( 鼠标 ) 如 不具备 三维 输入能力 , 因此
不能直接 得到三维空 间中的任意轴并利用 gR te () lo t a 来旋 转场景。本文将讨 论在 O eG pn L中利用 鼠标如何简 单有效地 实现三维场景的任 意旋转。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第24卷第10期 计算机应用与软件Vol 124No .102007年10月 Computer App licati ons and Soft w are Oct .2007O penG L 实现3D 模型的交互控制孙妮芳 杨志强 陈 诚 何 斌 龚佩曾(同济大学计算机系 上海 200092)收稿日期:2006-12-04。

孙妮芳,硕士生,主研领域:虚拟现实技术。

摘 要 简述了3DS 文件的结构,以及在OpenG L 中如何读入和显示3DS 文件的模型,并着重讲述了利用OpenG L 编程接口对场景中的这些模型进行选择、拾取,通过鼠标拖动对这些模型进行交互操作。

关键词 OpenG L 选择 拾取 交互操作CO NTROL THE 3D MOD EL S I NTERACT I VELY I N O PENGLSun N ifang Yang Zhiqiang Chen Cheng He B in Gong Peizeng(D epart m ent of Co m puter ,Tongji U niversity,Shanghai 200092,China )Abstract The structure of 3DS For mat File is outlined,and the way t o read and show the models of 3DS For mat File in OpenG L is p resen 2ted .It is exp lained in detail how the interactive contr ol of the models with the select mode and the feedback mode is realized .Keywords OpenG L Select Picking I nteractive0 引 言虚拟实验是当今教育改革比较热门的话题之一,通常意义上讲的虚拟实验建立在真实实验的基础之上,对实验所使用的元器件、,实验者通过鼠标点击与拖曳、键盘操作,可以像对真实元器件一样对虚拟实验设备进行操作,从而完成整个虚拟实验过程。

交互技术是建立虚拟实验要解决的最基本和最重要的问题,交互不仅可以向用户演示信息,同时允许用户向程序传递一些控制信息,比如用户可以通过键盘、鼠标等外设来控制程序的运行。

OpenG L 作为一个三维工具软件包,在三维交互编程等方面提供了比较完善的机制。

比如,通过OpenG L 的选择、反馈模式比较容易实现通过鼠标键盘进行交互。

目前,已经有不少论文和书籍比较详细地阐述了在OpenG L 中通过选择、拾取和反馈实现对三维物体的交互操作。

但对读入和显示多个3DS 文件的模型的交互操作却介绍得比较少。

本文根据这一情况并结合实际,在虚拟装机系统中,对场景中的多个元器件模型的交互操作进行详细介绍。

1 3D S 文件介绍3DS 文件存储了模型的材质信息和几何信息,材质信息主要包括材质的名称,材质的纹理贴图所对应的文件名以及材质的颜色等;几何信息主要包括顶点的数目,每个顶点的坐标,三角面的数目,每个三角面上3个顶点的索引,此三角面是否可见等。

3DS 文件由许多块组成,每个块包括信息类别和下一个块的相对位置。

块的信息类别用I D 表示,它描述了该块的数据信息。

下一个块的相对位置指出了下一个块相对于该块起始位置的偏移字节数。

在块结构中,始终用前2个字节保存I D 号,接下来的4个字节保存块的长度,块的实际内容则用(块长度)6个字节保存。

块的内容又可能包含子块。

在OpenG L 中读入3DS 文件的模型的方法有很多,由于本文的程序是在VC ++环境下开发的,所以采用了编写一个类来加载3DS 文件的方法。

这样的类很多书籍和网站都有提供,只需进行简单的修改就可以使用,比如修改模型的位置信息以实现模型的移动,增加模型的旋转经度和纬度信息以实现模型的旋转。

2 O penGL 的交互技术在虚拟装机系统中,要求与场景本身进行更多的交互操作,这种交互除了菜单和对话框实现外,在很多情况下是用鼠标来进行的。

OpenG L 的一大功能就是提供了实现交互技术的机制。

OpenG L 的交互技术是通过选择、拾取和反馈操作来实现的。

2.1 选 择选择允许在窗口内部的某个位置用鼠标进行点击,并确定它所点击的是哪个物体。

选择是OpenG L 的一种操作模式,选择模式不会改变帧缓存区的内容,退出选择模式时,OpenG L 返回与视景体相交的图元列表,它列出了位于视景体内或与视景体相交的图元,每个图元产生一个选择命中的记录,对应名称堆栈中的当前内容。

・绘制模式 进入选择模式前,调用函数gl Render M ode (),其原型为:gl Render M ode (G Lenu m mode )。

控制应用程序当前所处的模式,即绘图、选择和反馈模式,相应的mode 的取值为G L_RE NDER 、G L _SE LECT 或G L_FEE DBACK 。

208 计算机应用与软件2007年・创建名称堆栈 名称堆栈的内容可以用来确定用户选择的物体,所以它在选择操作中具有非常重要的作用。

首先,用glI nit N a mes()函数初始化名称堆栈,即清除名称堆栈。

然后,在发出各模型绘图命令的同时,用glPush Name()函数将物体名称压入堆栈。

这名称是整数,OpenG L可以包含64个名称。

操作堆栈的函数有:glPush Na me()函数,将名称压入堆栈;glPopNa me()函数,将名称从堆栈中弹出;gl L oad Na me()函数,用不同的名称替换最顶层堆栈的名称。

・命中记录 命中记录即位于选择物体内或与选择物体相交图元的选中标志。

在选择模式下,操纵名称堆栈或调用gl2 Render M ode()函数,OpenG L将命中记录写入选择数组中。

对于由多个图元构成的物体,构成物体的各个图元共享同一个名称。

每一个命中记录是由三个部分组成:①当命中记录时,名称堆栈中的名称数目;②自上一个命中记录以来,所有与物体相交的图元顶点的最大和最小窗口坐标Z值;③命中发生时,名称堆栈中的内容,最底层的元素在堆栈的最顶层。

在OpenG L中使用选择机制,必须执行下面几个步骤:(1)用glSelect B uffer()命令定义用来返回命中记录的数组;(2)调用gl Render M ode(G L_SE LECT)函数进入选择模式;(3)用glI nit N a mes()初始化名称堆栈,即清空名称堆栈,然后调用glPush Name()命令将名称压入堆栈;(4)定义选择使用的选择题,它通常与最初用来绘制场景的视景体不同,因此有可能需要用glPush Matrix()和glPop M atrix ()命令保存并恢复当前视景体的状态;(5)交替发出图元绘制命令和操纵名称堆栈命令gl L oad2 Na me(),以便每一个图元均被指定一个合适的名字。

(6)终止选择模式,处理返回的选择数据,即命中记录。

2.2 拾 取拾取是选择模式的一种扩展,通常用它来拾取光标附近的物体。

为了用拾取操作实现以上功能,进入选择模式后,用指定的拾取矩阵同投影矩阵一起把绘图限制在一个小的视口区域内,通常在光标附近,此时在光标附近的物体就会产生选择命中。

使用这种方式,就可以确定哪个物体绘制在光标附近。

拾取操作和选择操作之间的主要区别是:(1)拾取操作通常由输入装置激发,例如可以用鼠标的点击来激发;(2)可以使用实用库中的函数gluPick Matrix(),把指定的投影矩阵加到当前矩阵堆栈中。

函数原型如下:void gluPick Ma2 trix(Gldouble x,Gldouble y,Gldouble z,Gldouble width,Gldouble high,Glint vie wport[4]);2.3 反 馈和选择一样,反馈也是一种渲染模式,它并不会以屏幕像素的形式产生输出。

相反,它的信息被写入到反馈缓冲区中,提示场景将如何被渲染。

这个信息包括了用窗口坐标表示的经过转换的点数据、根据光照计算产生的颜色数据以及纹理数据。

反馈操作的步骤如下:(1)调用glFeedback Buffer()函数指定存储反馈信息的数组,该函数中的变量描述了数组的数据类型和写入数组中的数据量。

(2)调用gl Render M ode(G L_FEE DBACK)函数,进入反馈模式。

(3)绘制图元。

绘图时,可以多次调用glPassThr ough()函数,为返回的反馈数据插入标记,便于程序分析。

(4)调用gl Render M ode()函数,设置其参数为G L_RE N2 DER,退出反馈模式,gl Render M ode()返回的整数值是反馈数组中存储的数据个数。

(5)分析、处理反馈数组中的数据。

3 VC++编程实现对场景中多个三维模型的交互 关键的程序代码如下:(1)初始化模型static t3DModel g_3DModel[2];//定义模型数组CLoad3DS3m_3DS=ne w CLoad3DS;//3D模型定义m_3DS->I nit(″neicun2.3DS″,0);//第一个模型(2)渲染函数gl L oadNa me(0);//给第一个三维模型命名m_3DS>show3DS(0,g_3DModel[0].Positi on.x,g_3DModel[0].Po2 siti on.y,g_3DModel[0].Positi on.z,0.6,g_3DModel[0].l ongitude,g_ 3DModel[0].latitude);//显示第一个3DS文件中模型(3)选择函数hits=gl Render M ode(G L_RENDER);//收集鼠标单击if(hits<=0)//如果选择发生 return-1;return select B uf[(hits-1)34+3];(4)平移函数,修改三维模型沿x,y,z轴平移的量g_3DModel[hits].Positi on.x+=m_xTranslati on;//沿x轴的平移量g_3DModel[hits].Positi on.y+=m_yTranslati on;//沿y轴的平移量(5)旋转函数,修改三维模型沿经度和纬度旋转的量g_3DModel[hits].l ongitude-=theta;//沿经度旋转的量g_3DModel[hits].latitude+=phi;//沿纬度旋转的量(6)On LButt on Down函数m_left m ousedown=TRUE;//将鼠标左健按下的状态设为TRUE m_Ldownpos=point;//保存鼠标左健按下的位置(7)OnRButt on Down函数m_R ight m ousedown=TRUE;//将鼠标右健按下的状态设为TRUE m_Rdownpos=point;//保存鼠标右健按下的位置(8)On Mouse Move函数if(m_left m ousedown)//如果鼠标左健按下的标志为真,则计算三维模型位置的变化量{m_xTranslati on=point.x-m_Ldownpos.x;m_yTranslati on=point.y-m_Ldownpos.y;hits=DoSelect(m_Ldownpos.x,m_Ldownpos.y);//收集鼠标左健选中了哪个三维模型if(hits!=-1){s witch(hits){default:Translati on(hits);//调用平移函数break;}}}if(m_R ight m ousedown)//如果鼠标右健按下的标志为真,则计算三维模型旋转的变化量{theta=point.y-m_Rdownpos.y;//根据鼠标器的移动改变旋转的纬度phi=point.x-m_Rdownpos.x;//根据鼠标器的移动改变旋转的经度第10期 孙妮芳等:OpenG L 实现3D 模型的交互控制209 hits =DoSelect (m_Rdownpos .x,m_Rdownpos .y );//收集鼠标右健选中了哪个三维模型if (hits!=-1){s witch (hits ){default:Rotate (hits );//调用旋转函数break;}}}(9)OnLButt on Up 函数m_left m ousedown =F ALSE;//将鼠标左健按下的状态设为F ALSEm_Ldownpos =point;//保存鼠标左健的位置(10)OnRButt on Up 函数m_R ight m ousedown =F ALSE;//将鼠标右健按下的状态设为F ALSE m_Rdownpos =point;//保存鼠标右健的位置(11)在On D ra w 函数中调用渲染场景的函数RenderScene ();//渲染场景4 实验结果用编写的类实现读入和显示3DS 文件中的电脑元器件模型,如图1所示。

相关文档
最新文档