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

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenGL实现3D模型的交互控制

  1 3DS文件介绍   3DS文件存储了模型的材质信息和几何信息,材质信息主 要包括材质的名称,材质的纹理贴图所对应的文件名以及材质 的颜色等;几何信息主要包括顶点的数目,每个顶点的坐标,三 角面的数目,每个三角面上3个顶点的索引,此三角面是否可见等。   3DS文件由许多块组成,每个块包括信息类别和下一个块的相对位置。块的信息类别用ID表示,它描述了该块的数据信息。下一个块的相对位置指出了下一个块相对于该块起始位置的偏移字节数。在块结构中,始终用前2个字节保存D号,接 下来的4个字节保存块的长度,块的实际内容则用(块长度)6个字节保存。块的内容又可能包含子块。   在OpenGL中读入3DS文件的模型的方法有很多,由于本 文的程序是在VC + +环境下开发的,所以采用了编写一个类来 加载3DS文件的方法。这样的类很多书籍和网站都有提供,只 需进行简单的修改就可以使用,比如修改模型的位置信息以实现模型的移动,增加模型的旋转经度和纬度信息以实现模型的旋转。   1 OpenGL的交互技术   在虚拟装机系统中,要求与场景本身进行更多的交互操作,这种交互除了菜单和对话框实现外,在很多情况下是用鼠标来 进行的。OperGL的一大功能就是提供了实现交互技术的机制。 OperGL的交互技术是通过选择、拾取和反馈操作来实现的。   2 1选择   选择允许在窗口内部的某个位置用鼠标进行点击,并确定它所点击的是哪个物体。选择是OpenGL的一种操作模式,选 择模式不会改变帧缓存区的内容,退出选择模式时,OperGL返 回与视景体相交的图元列表,它列出了位于视景体内或与视景体相交的图元,每个图元产生一个选择命中的记录,对应名称堆 栈中的当前内容。   绘制模式 进入选择模式前,调用函数gR endeM ode (),其原型为:gRendeMode(GLmum mode)。控制应用程序当 前所处的模式,即绘图、选择和反馈模式,相应的mode的取值为 GL—RENDER、GL—SELECT或 GL—FEEDBACK。   ?创建名称堆栈 名称堆栈的内容可以用来确定用户选 择的物体,所以它在选择操作中具有非常重要的作用。首先,用 gUnitNaneS()函数初始化名称堆栈,即清除名称堆栈。然后,在 发出各模型绘图命???的同时,用gPuthName()函数将物体名称 压入堆栈。这名称是整数,OpenGL可以包含64个名称。   操作堆栈的函数有:   gIPushName()函数,将名称压入堆栈;   gPcpNam e()函数,将名称从堆栈中弹出;   gLoadName()函数,用不同的名称替换最顶层堆栈的名称。   /淀义模型数组 //3D模型定义 /第一个模型   /給第一个三维模型命名   ?命中记录命中记录即位于选择物体内或与选择物体 相交图元的选中标志。在选择模式下,操纵名称堆栈或调用gt RendeMode()函数,OpenGL将命中记录写入选择数组中。对 于由多个图元构成的物体,构成物体的各个图元共享同一个名称。   每一个命中记录是由三个部分组成:①当命中记录时,名称 堆栈中的名称数目;②自上一个命中记录以来,所有与物体相交 的图元顶点的最大和最小窗口坐标Z值;③命中发生时,名称堆 栈中的内容,最底层的元素在堆栈的最顶层。   在OpenGL中使用选择机制,必须执行下面几个步骤:   (1) 用gLSeledBuffcr()命令定义用来返回命中记录的数组;   (2) 调用gRemieM(xle(GL_SELECT)函数进入选择模式;   (3) 用gUniNameS()初始化名称堆栈,即清空名称堆栈,然 后调用gIPushName()命令将名称压入堆栈;   (4) 定义选择使用的选择题,它通常与最初用来绘制场景 的视景体不同,因此有可能需要用gPushMatrk()和gIPopiatrk ()命令保存并恢复当前视景体的状态;   (5) 交替发出图元绘制命令和操纵名称堆栈命令gLoad- Name(),以便每一个图元均被指定一个合适的名字。   (6) 终止选择模式,处理返回的选择数据,即命中记录。   2 2拾取   拾取是选择模式的一种扩展,通常用它来拾取光标附近的 物体。为了用拾取操作实现以上功能,进入选择模式后,用指定 的拾取矩阵同投影矩阵一起把绘图限制在一个小的视口区域 内,通常在光标附近,此时在光标附近的物体就会产生选择命中。使用这种方式,就可以确定哪个物体绘制在光标附近。   拾取操作和选择操作之间的主要区别是:   (1) 三维模型位置的变化量   拾取操作通常由输入装置激发,例如可以用鼠标的点 击来激发;   (2) 维模型   可以使用实用库中的函数gluPickMatrk(),把指定的 投影矩阵加到

您可能关注的文档

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档