教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 综合文档 >

基于Opengl的屏幕对象拾取 毕业论文(4)

来源:网络收集 时间:2026-08-10
导读: 判断线段与包围盒相对位置的算法流程如图5所示。 图 5 向量法判断线段和包围盒相对位置算法流程图 根据拾取对象的不同,线段和相关对象求交的方法和过程存在差别。设要和拾取对象求交的线段为AB,针对不同的情况,

判断线段与包围盒相对位置的算法流程如图5所示。

图 5 向量法判断线段和包围盒相对位置算法流程图

根据拾取对象的不同,线段和相关对象求交的方法和过程存在差别。设要和拾取对象求交的线段为AB,针对不同的情况,下面对两种求交过程分别加以描述。 (1)拾取对象为点

当拾取对象为点时,求交的实质就是以AB为轴线,以一个很小的浮点数tolerance(tolerance一般小于0.001)为半径做一个圆柱,在这个圆柱内离视点最近的点就是所求的交点。具体做法是将实体的每一个顶点向AB投影,并求出投影点在线段AB上的参数坐标。在0到1的范围内,参数坐标的值越小,说明该点离视点越近。如果我们发现了某个实体顶点比当前的最近点离视点更近且该点到AB所在直线的距离小于tolerance,则把该点记录为当前的最近点。当所有的点处理完毕,当前的最近点就是该实体和线段AB的交点。 (2)拾取对象为直线或复合线

13

复合线一般指由多个直线段相连接所构成的单元体,在本文所述的三维图形浏览器系统中,曲线如NURBS曲线、圆弧等都存储为复合线的形式。对于线状图元,比较常用的方法是通过计算点线距离来进行拾取,这种方法简单易懂,易于实现。但当拾取曲线、复杂折线等图元时,计算量会非常大。为此提出一种新的改进算法,其具体操作步骤如下: ①以拾取点为中心、两倍拾取精度(在本文中拾取精度一般为象素宽度的2~5倍)为边长,绘制一个以背景色为填充色的正方形作为“测试窗口”。 如图6所示

图 6 测试窗口

②重绘图形对象。如果图元进入拾取范围,则必然在“测试区”中留下轨迹,重绘图形对象的目的是为了恢复可能被“测试窗口”遮蔽的图形对象。

③循环读取“测试窗口”中象素点颜色。当发现象素点颜色有别于背景色时,终止读点,标识拾取成功。若未发现有别于背景色的象素点时,则继续进行下一个图元的检测。如图7所示

图 7 测试区中的轨迹

3.2 基于GPU的重绘式拾取技术 基本思路:

重绘式拾取法是在OpenGL绘图模式下,通过2次绘图来拾取并显示物体。第1次绘图为虚拟绘 图,通过在OpenGL帧缓存中绘制一些辅助图形来帮助选取物体。这些辅助图形对于系统使用者是不 可见的,因此在确定所选物体之后要将辅助图形从帧缓存中清除掉才能进行第2次绘图。第2次绘 图为实际绘图,所绘图形为系统使用者看到的真实图形。

在GPU上实现三维图元拾取的方法有两种,第一种方法与场景几何无关,第二种方法是场景几 何依赖。下面介绍第一种方法:

场景几何无关方法的应用一直受到限制:它需要GPU的可编程能力,需要ShaderModel2.0和浮点型纹理支持;其次是因为每次出发拾取程序的时候都要在后台绘制一张表面,等同于重复绘制了两次场景,不适合频繁连续的拾取动作。

该方法的核心是把图元的几何信息、指针等相关信息作为它的颜色渲染到后台的一张Render Target型表面上对应帧缓冲做一次特殊的“渲染”。在渲染后只要读取表面上相应像素坐标的颜色值就可以得知它相对应图元的信息。整个算法分为在CPU上和在GPU上的两部分。在CPU上C++程序的任务是建立一个后台的表面,然后调用GPU上的程序对物体进行特殊的RTT(Rallderto Texture,渲染到纹理),再根据渲染结果读取表面某坐标的颜色并还原信息。具体实现时考虑到纹理有pow of two和non—pow of two之别,屏幕分辨率一般不为pow of two,因此可以考虑采用渲染到表面(RRS),用Direct3D9中的CreateRenderTarget()创建一个Render Target型表面,CPU上的主要流程如下:

鼠标点击拾取事件触发下面流程: (1)建立一张新的临时纹理;

14

(2)将当前设备屏幕的内容存入缓冲中,将设备的渲染对象设为该临时纹理; (3)做好渲染前的准备,包括从fx文件中读入effect; (4)对于每个几何对象在GPU通过Shader进行特殊渲染; (5)还原设备信息,设备的渲染对象指向帧缓冲; (6)获取临时纹理上拾取区域的像素; (7)将获得的像素按定义的格式解码。 图8说明了上述整个流程。

图 8 GPU拾取流程

下面定义Vertex Shader的输出内容,定义了一个包括坐标和颜色的结构(struct)。其中,pos用于顶点转换,color用于顶点信息存储。 Struct VSResult {

Float4 pos:POSITION; Float4 color:TEXCOORDO };

在Vertex Shader中,输入某点的局部坐标,把坐标的值编码成一个颜色的RGB值后作为输出颜色的RGB值,同时将输入坐标向量左乘世界矩阵、观察矩阵、投影矩阵后得到最终输出的坐标值。在Pixel Shader中,将物体指针信息作为颜色的Alpha值,加上Vertex Shader输出的颜色,输出为最终的渲染颜色。

在单个几何图元中,不同顶点有不同的坐标,在Vertex Shader中,根据坐标信息进行顶点转换,同时将坐标信息作为颜色值存入VSResult中。主要如下: VSResult Vs_main{ float3 pos:POSITION } {

VSResult ret;

ret.color=float4(pos,1.of);

float4 worldpos=mul(float4(pos,1),worldmatrix);

15

ret.pos=mul(worldpos,ViewProjection); return ret; }

对于ret.color,前3个RGB值表示输入的位置坐标;而第4个Alpha值用作存储其他信息,暂时填入1.Of,后文将填充图元的指针。 3.3 各种拾取技术比较 各种拾取技术比较表如下:

表 2 各种拾取技术比较

OpenGL的选择机制 原理 先把场景画进帧缓冲,然后进入选择模式并重新绘制这个场景。当退出选择模式时,OpenGL返回一个图元(premitives)清单,图元可能被视见体(viewing volume)分割。每个被视见体图元引出一资选择命中(hit)。确切的说,图元清单是作为一个取整数值的名字(integer-valued names)数组和相关的数据-命中记录(hit record)-对应名字栈(name stack)的当前内容。当在选择模式下发布图元绘制命令时向名字栈中加入名字就可建立起名字栈。当名字清单被返回后,可以用它来确定屏幕上的哪个图元可能被用户选中了。 获取屏幕坐标并转换成图形系统的视口坐标,根据不同图形API(应用程序编程接口)的实现给该点加上适当的深度值(如OpenGL标准的深度值介于0-1),反算出该拾取点的世界空间坐标,并由视点向此点引一条射线,在三维空间中对射线和物体进行求交。 优点 此算法简单 局限性 名字堆栈容量有限,不能处理大规模场景中的拾取。 射线拾取方法 对拾取对象为点或简单的选择体较为方便,速度快。 (1)因它假设所有的图形变换矩阵必须可逆,经过一系列的逆运算可得到图像空间某点的三维坐标,但实际上这些矩阵并非总是可逆; (2)对于复杂的选择体,判断物体是否在选择体内部的算法极其复杂。从而使整个处理过程耗时巨大,且如此复杂的算法也会给整个系统的实现带来一定难度。

在OpenGL绘图模式下,通过2(1)没有采用OpenGL选择机制。整个拾取过程都在OpenGL的绘图模式下16

重绘式拾取法 次绘图来拾取并显示物体。第1次绘图为虚拟绘图,通过在OpenGL帧缓存中绘制一些辅助图形来帮助选取物体。这些辅助图形对于系统使用者是不可见的,因此在确定所选物体之后要将辅助图形从帧缓存中清除掉才能进行第2次绘图。第2次绘图为实际绘图,所绘图形为系统使用者看到的真实图形。 完成,因此不必要为每个物体命名。同时,避免了在绘图模式 …… 此处隐藏:1803字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于Opengl的屏幕对象拾取 毕业论文(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/403874.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)