深入探索3D拾取技术
基于3D视觉信息的机械手抓取机械零部件的关键技术研究
基于3D视觉信息的机械手抓取机械零部件的关键技术研究基于3D视觉信息的机械手抓取机械零部件的关键技术研究摘要:随着机械制造业的发展,自动化生产逐渐成为一种趋势。
机械手作为自动化生产中的重要组成部分,需要准确抓取各种机械零部件才能完成任务。
而在抓取过程中,靠单纯的机械控制效果有限,因此需要结合3D视觉信息进行技术研究。
本文主要介绍了基于3D视觉信息的机械手抓取机械零部件的关键技术以及在实际应用中的影响。
关键词:3D视觉信息;机械手;抓取;机械零部件一、引言机械制造工业是国民经济的重要组成部分,随着科学技术的发展,自动化生产已经成为一种趋势。
而在自动化生产中,机械手作为重要的执行机构,起着关键的作用。
机械手在完成各类任务时,需要准确地抓取机械零部件,因此抓取技术的研究变得尤为重要。
传统的机械手在抓取机械零部件时主要依赖力学夹爪的力学原理,但是在某些场景下,单纯的机械控制的效果往往有限。
例如,机械零部件形状复杂、表面粗糙或者尺寸过小,以及堆叠在一起等情况下,机械手的抓取准确度难以保证。
为了解决这些问题,3D视觉信息被引入到机械手抓取技术中,提高了抓取的准确度和稳定性。
二、基于3D视觉信息的机械手抓取技术1. 3D传感器的设置基于3D视觉信息的机械手抓取技术首先需要获取场景中物体的三维信息。
为了实现这一点,通常在机械手周围设置3D传感器。
3D传感器可以通过激光扫描、结构光或者立体视觉等技术来获取物体的三维模型。
采集到的三维模型可以用来进行后续的物体检测和定位。
2. 物体检测与识别在获取到三维模型之后,需要进行物体检测和识别。
物体检测和识别是基于机器学习或者深度学习的算法来实现的。
通过将采集到的三维点云数据与预设的物体库进行比对,可以识别出待抓取的机械零部件。
物体检测和识别的准确性对于后续的抓取任务非常重要。
3. 抓取规划和路径规划在识别出待抓取的机械零部件之后,需要进行抓取规划和路径规划。
抓取规划的目标是确定机械手的抓取点和抓取姿态。
Web3D引擎中三维图形对象拾取的算法与实现
pc igfn t no l t gf ueo jc i i l ne na p n suc b D e gn y i n c o f e ci g r bet s mpe tdo no e o reWe 3 n ieb k u i se n i me
J AVA lng a e a ug.
收稿 日期 :2 1- 8 2 0 00~ 3
基 金项 目:江 苏 省省 级科 技创 新与 成果转 化 专项 引导 资金 资助 项 目 ( B 20 30 1 ;南京 工业职 业 技术 学 院科研 基金 资助 项 目 S Z 0 90 4 )
Ke y wor :c mp e p ia i n; i k n D g r ; e a c c lr y i t re to l rt m ; ds o utra plc to p c i g 3 f u e hir r hia a n e s c i n ago i i h W e D ng n b3 e i e
文 章 编 号 :1 0 — 1 82 1)60 8 .7 0 30 5 (0 10 。0 20
中图 分类号 :T 9 .1 P3 1 4 文献标 识码 :A
TheA l o ihm n m pl m e a i n o c ng3 Fi ur yW e D g rt a dI e nt to fPiki D g eb b3 Eng ne i
21 0 1年
工 程 图 学 学 报
J oURNAL F ENGI ERI o NE NG GRAPHI CS
2 01 1 No. 6
第 6期
/ ± We 3 引擎 中三维 图形对象拾取 的算 bD
—
上; =
_ J ห้องสมุดไป่ตู้
3d拾取pick的原理
3d拾取pick的原理
3D拾取(Pick)是计算机图形学中的一个重要概念,它指的是
在3D场景中确定用户点击的位置所对应的物体或物体表面的过程。
这个过程涉及到很多复杂的计算和算法,下面我将从多个角度来解
释3D拾取的原理。
首先,3D拾取的原理涉及到射线与物体的相交检测。
当用户在
屏幕上点击鼠标时,屏幕坐标会被转换成世界坐标系中的一条射线。
这条射线会与3D场景中的物体进行相交检测,以确定用户点击的位
置所对应的物体。
其次,3D拾取还涉及到空间分割和碰撞检测。
为了提高效率,
3D场景通常会进行空间分割,比如使用包围盒或者四叉树等数据结
构来组织场景中的物体。
当进行拾取操作时,可以先对可能相交的
物体进行筛选,然后再进行详细的碰撞检测,以确定最终的拾取结果。
另外,还有基于像素的拾取方法。
在一些情况下,可以直接利
用像素的颜色信息来确定用户点击的位置所对应的物体。
这种方法
通常用于一些特殊的应用场景,比如在一些游戏中。
此外,还有基于物体属性的拾取方法。
在一些需要对物体进行特定操作的情况下,可以根据物体的属性来确定拾取结果。
比如在一个包含多个可交互物体的场景中,可以根据物体的标识符或者其他属性来进行拾取。
总的来说,3D拾取的原理涉及到射线与物体的相交检测、空间分割和碰撞检测、基于像素的拾取方法以及基于物体属性的拾取方法等多个方面。
这些原理和方法通常会结合使用,以实现准确高效的3D拾取操作。
三维模型的拾取方法研究与实现
1997年,Masaaki.Oka,Kyoya Tsutsui,Akio Ohba等人第一次采用了基于GPU的重绘式拾取技术在房子中拾取到了房子的主人与小孩子[6];
第三种是OpenGL内部含有的一种拾取的机制。在一九九二年的七月,1.0的OpenGL版本出现,随后SGI公司和微软公司联合制作了基于WINDOWS之下的OpenGL,此次的研发成果最大的好处就是之前在图形的工作站上运作的3D的图形类软件根本上也是能够适用于微机之上。在一九九五年1.1的版本出现,它在1.0的根底之上出现了许多的之前没有的功能,就像它的标志性功能:拾取机制,它是拓宽OpenGL的使用领域的“功臣〞,在随后的多年来出现的各个版本,使自带的拾取机制越来越完善,操作越来越方便,应用范围越来越广泛。
At first, this paper provides an introduction to the field of puter graphics including ray pick up method, the bounding box strategy based on DEM and redraw strategies based on gpu's basic introduction, this paper expounds the basic principle of its realization, and some parison, analyzes the advantages and disadvantages of each method. Second, focus on ray pick method are introduced, and use the OpenGL library withVCto achieve the three-dimensional model of rotation, translation, zoom in and pick up function. On this basis, and the bounding box strategy based on DEM (which is an improvement to the method of ray pick) are discussed in this paper. Finally, the experimental results are analyzed, and the 3d model of picking technology is prospected.
三维采集 室内场景 术语解释
三维采集室内场景术语解释一、引言随着科技的发展,三维采集技术在室内场景中的应用越来越广泛。
本文将对三维采集、室内场景以及相关术语进行解释和探讨,旨在帮助读者更好地理解和应用这一领域的知识。
二、三维采集2.1 三维采集的定义三维采集是指使用传感器和相应的软件工具,获取真实世界物体或场景的三维几何形状和纹理信息的过程。
通过三维采集,可以将真实世界中的物体或场景数字化,并在计算机中进行可视化、分析和处理。
2.2 三维采集的方法三维采集可以使用多种方法进行,常见的方法包括: - 激光扫描:利用激光测距原理,通过扫描激光束在物体表面的反射来获取物体的三维形状信息。
- 结构光:利用投射结构化光的方式,通过计算物体表面纹理的变化来获取物体的三维形状信息。
- 纹理映射:通过拍摄物体或场景的多张照片,并将这些照片上的纹理信息贴回到三维模型上,从而获取物体或场景的三维形状和纹理信息。
2.3 三维采集的应用领域三维采集技术在许多领域有着广泛的应用,包括但不限于: - 建筑和房地产:通过三维采集室内场景,可以进行虚拟漫游、室内设计和装修规划等工作。
- 文化遗产保护:通过三维采集文物和古迹,可以进行数字化保存、修复和展示。
- 游戏和动画制作:通过三维采集,可以获取真实世界物体或场景的形状和纹理信息,用于游戏和动画制作中的建模和渲染。
- 虚拟现实和增强现实:通过三维采集,可以构建虚拟现实和增强现实场景,提供更加沉浸式的体验。
三、室内场景3.1 室内场景的定义室内场景是指建筑物内部的空间环境,包括房间、走廊、楼梯、门窗等元素。
室内场景的特点是相对封闭、有限的空间范围,通常用于居住、工作、娱乐等活动。
3.2 室内场景的特点室内场景与室外场景相比,具有以下特点: - 有限的空间范围:室内场景通常被建筑物的墙壁、天花板和地板所限制,空间范围相对较小。
- 多样的功能需求:室内场景用于居住、工作、娱乐等多种活动,因此需要根据不同功能需求进行设计和布置。
三维场景中的景物拾取技术
三维场景中的景物拾取技术
夏怒
【期刊名称】《电脑知识与技术》
【年(卷),期】2008(004)028
【摘要】该文介绍一种3D场景中景物拾取的方法,此方法是基于OpenGL的,具有较强的通用性能,且巧妙的避开了复杂的图形学公式.
【总页数】2页(P196,199)
【作者】夏怒
【作者单位】东南大学,软件学院,江苏,南京,210007
【正文语种】中文
【中图分类】TP311
【相关文献】
1.基于DirectX的三维场景实体的拾取 [J], 郭艳霞;侯彤璞;杜园园
2.三维场景中基于视口空间的拾取算法 [J], 朱明亮;董冰;王祎;谢步瀛
3.三维场景中图形对象的拾取方法 [J], 王剑;陆国栋;谭建荣
4.三维场景地面坐标拾取的射线投影算法 [J], 李奇峰;郭同德
5.三维场景中的景物拾取技术 [J], 夏怒
因版权原因,仅展示原文概要,查看原文内容请购买。
三维场景中的景物拾取技术
1引 言
目前 许 多 优 秀 的 图形 能 为我 们 绘 制惟 妙惟 肖的虚 拟 现 实 场 景 . 面对 这 些 场 景 时 候 我们 除 了欣 赏 之 外 更 多 的 是 希 望能 与 T 具 在 之 互 动 , 为 编 程 人 员 我 们 可 以 使 用 代 码 轻 松 的 重 新 构 造 场 景 , 对 于 终 端 用 户 而 言 , 们 也 希 望 自己也 能 对 造 场 景 进 行 一 些 操 做 但 他 作 , 添 加 , 除 等 等 。对 于 这些 操 作 而 言 , 先 我 们要 做 的 是 能 让 用户 使 用 鼠标来 选 择 他 所 希 望操 作 的 对 象 , 就是 本 文 要讨 论 的 如 删 首 这 个重点: 拾取 , 是一 种 在 许 多 交互 性 程 序 中 有基 础 地 位 的操 作 , 这 是对 屏 幕 中对 象进 行 定 位 , 确 定 你所 选 择 的 是 哪个 物 体 。然 而 并 陔操作 给我 们 提 出 了一 些 难 题 , 先 , 们 需要 对 对 象 进 行 届定 。 首 我 其次 , 我们 必 须 对 “ 取 目标 ” 行定 义 。 就 需 要我 们 确 定 单击 的 拾 进 这 位 置 是存 构 成 对 象 的 图元 上 , 是 对 象 附 近 的位 置 以及 考 虑 如果 选取 点 落 在 两 个 以 上物 体 交 集部 分如 何 处 理 等 等 问题 本 文利 用 还 了 O eG p n L中 的选 择模 式进 行 有 效 的对 象判 别 和 拾取
一
2选 择 模 式
选 择 模 式 其 对 场景 对 象 进行 绘 制 , 与显 示 图像 不 同的 是 这 种模 式 下 的绘 制 并 不 存 储 到 正 在 被显 示 的颜 色 缓 存 中 去 。也 就 是 但
基于OpenGL三维拾取技术研究
基于OpenGL三维拾取技术研究刘彬孙永高明马克李晓诗(解放军信息工程大学测绘学院河南郑州陇海中路66号450052 )【摘要】在OpenGL环境中,三维场景是通过二维平面表现的,本文通过对这种表现原理的研究,介绍了“射线拾取法”和“包围盒法”两种算法,分析了其实现的原理,并介绍了相关的核心算法。
在此基础之上,又提出了一种适用于基于DEM的三维系统的改进算法,把三维空间中的拾取问题转化到了二维平面上,大大简化了拾取的抽象性和复杂性,提高了拾取的效率,更易于理解和实现。
【关键字】DEM OpenGL 拾取光标投影模型1. 引言在三维图形系统中,现实世界中的物体要依次通过模型视点变换,投影变换和视口变换才影射到屏幕窗口上的,而对物体的拾取操作,其实就是在二维屏幕上对三维空间中的物体的拾取技术。
2. 射线拾取技术射线拾取算法是判断由视点发出经屏幕光标的射线是否与目标物体相交。
其具体的实现实现方法如下所示:(1)确定射线的位置及方向,可以通过取得射线与远近两个裁减面的交点来确定。
(2)判断射线与拾取目标是否有交点,因为在射线上,任意一点可以表示为单位向量(L)与模(len)的乘积,所以交点可以表示为:X= P’+L*len ;又因为三角形内的任意一点都可以用变量u、v和其三个顶点坐标来确定,其中0<u<1 0<v<1、,0<u+v<1。
设三个顶点为T1,T2,T3则:X= T1 + u*( T2-T1) + v*( T3-T1) ;由此可以得出P’-T1 =-( L*len) + u*( T2-T1) + v*( T3-T1) ,即方程组:(-L.x)*len +( T2.x- T1.x)*u + (T3.x –T1.x )*v = P’.x -T1.x(-L.y)*len +( T2.y- T1.y)*u + (T3.y –T1.y )*v = P’.y -T1.y(-L.z)*len +( T2.z- T1.z)*u + (T3.z –T1.z )*v = P’.z -T1.z这是一个线性方程组,根据克拉姆法则,当满足条件:0<v<1,0<u<1, len>0, ,0<u+v<1 和【-L,T2-T1,T3-T1】不为零则射线和三角形相交。
计算机图形学人机交互中三维拾取方法的研究
进行 了研 究,并利 用 O p e n G L函数库 实现 了三维拾取 ,给 出了包围盒策略在 D E M应 用的实h u a n Wa t e r Co n s e r v a n c y Vo c a t i o n a l Co l l e g e, Ch e n g d u 6 1 2 2 3 1, Ch i n a )
Ab s t r a c t :T h i s p a p e r i n t r o d u c e s t h e b a s i c p r i n c i p l e o f 3 d p i c k u p ,w h i c h i s t h e h o t i s s u e o f c o mp u t e r g r a p h i c s .I s t u d i e d
实 世 界 物 体 的 采 样 以 及 一 系列 的 变 换 ,使 三 维 图 形 投 射 到 二 维 屏 幕 上 , 其 处 理 流 程 如 图 1所 示 。 其 中 ,取 景 变 换 是 指 将 物 体 由现实 世界 坐标 系变换 为通 过屏 幕观 察 的视 点坐标 系 , 几 何 变换 是 保 持 坐 标 系 不 变 ,对 物 体 进 行 平 移 、 缩 放 、旋 转 、 变 形 等 操 作 的 过 程 。 此 外 ,为 使 屏 幕 中显 示 的 图 像 与 现 实 世
关 键 词 :三 维拾 取 ; 射 线 拾 取 策 略 ;包 围盒 策 略 ; O p e n G L函数 库
I n Co mp u t e r Gr a p h i c s Hu ma n - c o mp u t e r I n t e r a c t i o n
3d拾取算法
统一射线与物体坐标系
void TransformRay(Ray* ray, D3DXMATRIX* T) {
// transform the ray's origin, w = 1. D3DXVec3TransformCoord(
&ray->_origin, &ray->_origin, T); // transform the ray's direction, w = 0. D3DXVec3TransformNormal( &ray->_direction, &ray->_direction, T); // normalize the direction D3DXVec3Normalize(&ray->_direction, &ray->_direction); }
抛砖引玉
. Copyright 2008 By Neusoft Group. All rights reserved
抛砖引玉
. Copyright 2008 By Neusoft Group. All rights reserved
专题7 选择场景中的角色
• 学习目标: 1. 学习怎样实现拾取算法,弄懂它如何工作,主要
. Copyright 2008 By Neusoft Group. All rights reserved
拾取射线的计算
投影坐标系以近剪切面中心为坐标原点,该立方体 从z轴负向看过去与图形程序视区相对应,最终近剪切面 (前剪切面)上一点与屏幕坐标之间的对应关系如下图所
示:
. Copyright 2008 By Neusoft Group. All rights reserved
3d拾取算法
拾取射线的代码实现
struct Ray { D3DXVECTOR3 _origin; D3DXVECTOR3 _direction; }; Ray CalcPickingRay(int x, int y) { float px = 0.0f; float py = 0.0f; D3DVIEWPORT9 vp; g_pD3DDevice->GetViewport(&vp); D3DXMATRIX proj; g_pD3DDevice->GetTransform(D3DTS_PROJECTION, &proj); px = ((( 2.0f*sx) / vp.Width) - 1.0f) / proj(0, 0); py = (((-2.0f*sy) / vp.Height) + 1.0f) / proj(1, 1); Ray ray; ray._origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f); ray._direction = D3DXVECTOR3(px, py, 1.0f); return ray; }
拾取射线的计算
• py = (sy-sHeight/2)/sHeight*2; (公式2) • pz =0;(实际该值可任意取,不影响最终结果。 为了处理简单,我们取改值为0,表示该点取在近 剪切面上)得到projPt后,我们需要做的是把该点 坐标从投影空间转换到观察空间(ViewSpace),根 据透视投影的定义, 可假设点(px,py,pz) 对应的齐次坐标为 (px*pw,py*pw,pz*pw,pw) 我们可以通过 GetTransform( D3DTS_PROJECTION, & proj) 函数获得投影矩阵proj;
计算机图形学人机交互中三维拾取方法的研究
Research on 3- d i m en s ion p ick - up of human - com puter in teraction in com puter graph ics
YAO J i2quan, L I X iao 2huo
(M echan ica l Eng ineering Co llege, L iaon ing T echn ica l U n iversity, Fux in 123000, 2 在 O penGL 利用射线实现拣取图元
- (f + n ) f - n
- 2f n f - n
0 0 - 1 0 式 ( 1) 中, ( l , b, - n ) 和 ( r , t, - n ) 指定近远裁剪面的 左上角和右下角的坐标值; 参数 n , f 分别表示视点 与近远裁剪面的距离Ζ
P = P × inverse - V iewM a t rix
( 2)
式 ( 2) 中, inverse- V iewM a t rix 为观察矩阵的矩阵Λ 观察点在观察坐标系中坐标为 O rig inV iew ( 0, 0, 1 ) , 所以其在世界坐标系中的坐标同样可以利用
近剪切面上把该点坐标从投影空间转换到观察空间viewspace可以通过gettransformd3dtspro2ectionprojmrix函数获得投影矩阵proj2rix根据观察空间到投影空间的变换关系rojptprojm得到观察点在世界坐标系中的坐标worldptrix为观察矩阵用函数gettransformd3dtsrix得到这样就得到了射线近裁剪面的交点同理可得到远裁剪面点的交点和视点从而获得射线方程4射线拾取方法与传统方法的对比从上述的拾取方法中可以看出传统的拾取方法只能判断基本图元的拾取需要重复渲染效率较低而射线拾取方法可以对图元的部分进行拾取例还可以求出其与选取图元准确的相交位置从而可以应用于精确而有特殊的拾取要求的场合并且无须对图元重复渲染3利用射线对图元求交实例根据判断对象是否与此线段相交即可判断对象是否被选中还可以通过进一步计算其交点位置来得到详细的交点信息这些计算均是常见的计算机图形学与三维数学计算比如线段与三角形求交线段与球体求交线段与柱体或锥体求交等等所有图元的投影到近裁剪面都形成一个点线或多边形而点线多边形可由射线方法得到而拾取方法可以简化为屏幕拾取位置点和点线多边形相交的判断以三角形为例其数学算法如图4所示图4示意三角形fig
基于3D Widgets三维交互快速拾取算法研究
基于3D Widgets三维交互快速拾取算法研究摘要:为解决图形、图像在三维交互及深度[10]信息处理过程中所存在的问题,提出了一种以3D Widgets为核心的三维交互框架,并研究了三维交互拾取的多种算法。
基于3D Widget[4]的拾取技术能提供给用户交互旋转和交互拾取的功能。
实验结果表明,该算法与已有的算法相比,将这些算法其应用在手术模拟三维交互系统中,可以提高用户使用的直观性,还有益于以后的功能扩展。
为后续的交互过程奠定基础。
本文的创新之处正是在此理论的基础上,将其应用在三维交互中具有重要的价值和意义。
关键词:3D Widgets;三维交互;快速拾取中图分类号:TP391.41 文献标识码:A文章编号:1007-9599 (2011) 17-0000-02Three-dimensional Interactive Quick Pick Algorithm Based on 3D WidgetsDong Hongying, Bian Jing(College of Computer Science and Technology,Changchun University, 130022,China)Abstract:To solve the problem existed in the process oftri-dimensional interactive and deep information processing with graphics and image, this paper bring forward a tri-dimensionalinteractive frame whose core is 3D Widgets.At the same time,several algorithms of the tri-dimensional interactivepick-up were researched. The pick-up technology based on 3D Widget can provide the functions of interactive circumrotate and interactive pick-up for users.The experiment result indicated that when contrasted with the existed algorithm and was applied in the system of operation simulation tri-dimensional interactive,the algorithm will advance the audio-visual quality for users and is availed for the further functions expanding.It will lay the foundation for the later interactive process. The innovation of this paper is applying it in the tri-dimensional interactive with the basic of this theory,and which is of important value and meaning.Keyword:3D Widgets;Tri-Dimensional Interactive;Quick Pick一、引言近年来,三维计算机图形绘制技术和三维人机交互技术得到了越来越广泛的发展和应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入探索3D拾取技术在游戏中,玩家需要通过点击2D屏幕来选择3D物体,这个过程就是拾取(picking)。
拾取是3D游戏必不可少的基本操作,它实现了玩家和游戏世界内对象的交互。
虽然拾取技术很基本,但它却迷惑了很多3D初学者。
很多朋友都问过我关于拾取的细节问题,这让我觉得很有必要具体探讨一下该技术。
其实,拾取之所以让很多开发者感到复杂,主要原因在于它跨域了流水线的多个阶段,并且是逆流水线上行。
另外,它是一个2D信息扩展到3D的过程,必须对信息做相应的扩展和额外的计算才能够得到正确的结果。
下面我门具体分析一下这个技术。
水流线主要阶段分析我们来直观地看一下从相机空间到viewport的变换相机空间中的一个顶点v,经过透视变换后进入了CVV中。
这个变换矩阵实际上完成了两个工作:1)将顶点从3D空间投影到2D的投影平面(Projection Plane)上。
2)将投影平面上的2D投影点通过线性插值变换到齐次裁剪空间CVV中。
这些变换都通过透视矩阵一次完成。
我之所以把这一步分解为两步,因为这对于分析拾取很重要。
顶点进入齐次裁剪空间并经过CVV裁剪,最终进行透视除法从4D齐次形式变回成3D形式。
然后经过一个线性插值(被封装在视口(viewport)变换中),变换到viewport中,多个点以三角形的形式经过光栅化后被玩家看到。
最后一步的点变换可以描述为:3)将CVV中的点通过线性插值变换到viewport中。
分析了这个变换过程之后,我们知道了从相机空间开始实际处理点位置信息的操作,就是上面的三个步骤。
这样,我们可以先把顶点从viewport中先变换回投影平面上,也就是我们可以先完成(2)和(3)的逆处理。
这里我们不用考虑裁剪和透视除法这些操作,因为反推的时候,处于视口中的点,已经是经过裁剪后留下的有效点了,必定处于CVV内,也必定处于projection plane内!而且从viewport逆变换到projection plane,点一直保持2D形式。
picking的开始是玩家在屏幕上点击一个位置——这实际上是在viewport中进行了点击。
我们通过响应玩家的点击事件,得到在viewport中的点击位置,记为P0(Xp0,Yp0)。
然后我们把p0从viewport中线性插值到CVV中,得到P1(Xp1,Yp1):上面的线性插值(如果对线性插值公式不熟悉,请参考《深入探索透视投影变换》一文中的线性插值部分)公式在x方向上计算出了CVV中的P1,y方向的公式同理。
接下来我们再把P1从CVV中变换到projection plane中,得到P2(Xp2,Yp2):y方向的计算同理。
P2就是viewport中玩家点击的点在projection plane上所对应的位置。
目前来看很好。
我们已经获得了相机空间中的投影平面上,玩家点击的位置。
但目前的点是一个2D点——它处于投影平面上。
玩家需要拾取的是一个3D对象,因此我们需要将2D信息拓展到3D中。
向3D世界拓展将2D的点信息拓展到3D空间进行picking,会使用射线(ray)进行。
ray就是一端固定,另一端无限延伸的线性模型。
如下图所示:在相机空间中,红线标明的就是用于picking的ray。
它的固定端就是eye的位置(也就是相机空间的原点),并且穿过我们刚刚求出来的projection plane上面的点P2。
射线向空间无限延伸,第一个穿过的polygon应该就是picking到的结果。
在图中,有两个polygon被picking到:绿色和黄色的。
其中黄色的polygon是第一个被穿过的,因此picking操作返回的结果就是这个polygon。
在实现中,我们一般有两种方式来表示一个ray:1struct Ray3D2{3 Point3D m_startingPos;4 Point3D m_penetratedPos;5};67struct Ray3D8{9 Point3D m_startingPos;10 Point3D m_direction;11};第一种方式标明了ray的起始点m_startingPos和任意一个穿过点m_penetrated。
第二种方式标明了ray的起始点m_startingPos和方向m_direction。
这两种方式可以很方便的相互转换。
在有了ray的表示法之后,我们要做的就是判断ray是否和各个polygon产生了相交——这实际上是一个射线和三角形的相交判断算法。
这种算法很普遍,很容易找到,这里我们不进行讨论。
最基本的拾取算法(相机空间中)如下所示;12extern float ray_triangle_intersection( const Ray3D& ray, const Polygon& polygon );1314GameObject* picking( const Point3D& P2, const std::vector< GameObject* >& objects )15{16 Ray3D ray;17 ray.m_startingPos = Point3D( 0, 0, 0 );18 ray.m_penetratedPos = P2;1920float minDistance = 10000.0; // Big enough21 GameObject* intersected = NULL;22for( int i = 0; i < objects.size(); ++i )23 {24 GameObject* obj = objects[i];25for( int j = 0; j < obj->number_polygons(); ++j )26 {27 Polygon* triangle = obj->get_polygon( j );28float distance = ray_triangle_intersection( ray, *triangle );29if( distance > 0.0 ) // Penetrated30 {31if( distance < minDistance )32 {33 minDistance = distance;34 intersected = obj;35 }36 }37 }38 }39return intersected;40}这个暴力算法首先生成了相机空间中的ray,然后遍历所有的游戏对象,并遍历每个游戏对象的每一个多边形,用ray_triangle_intersection函数做射线交叉判断,如果返回正值,则证明穿插并表示ray起始点到穿插的距离,负值则表示没有穿插。
函数判断每个穿插的多边形,保留最近的一个返回,如果没有任何穿插,则返回NULL。
这里值得一提的是关于判断的优化问题。
ray_triangle_intersection算法虽然可以优化,但对于一个规模较大的场景或者模型的polygon数量比较大的场景,通过这种暴力法遍历所有polygon,在效率上是不能够接受的。
需要采用以下两种方式进行优化:1)采用场景管理方法,用层次结构的方法提前剔除大量不在视线中的多边形。
只留下视线中的多边形。
2)以包围体为单位进行ray相交判断,而不是三角形。
比如包围盒、包围球等等,变成了ray和矩形、球体进行相交判断。
一个游戏对象一般都可以分解为多个包围体。
除了上面的方法,还有很多其他高级的方式可以用于这种优化,这通常和你的游戏场景管理方法和3D对象表示方法有关。
特别地,如果使用的是正交投影(Orthogonal Projection),则不需要使用ray,直接在平面上判断就可以了,这将退化为一个2D picking问题。
回到世界空间?接下来的问题会有一些策略性。
我们要决定的是picking在当前相机空间种进行还是在世界空间进行。
我们已经处理了相机空间中的picking,但有一个问题:在程序中,我们一般不会保留相机空间中每个3D物体的位置,因此在这种情况下,我们会采用两个办法之一:1)将ray用逆相机矩阵变换到世界空间中。
2)将物体用世界矩阵和相机矩阵变换到相机空间中进行picking,就如我们上面的处理方式。
但就算我们采用了第1种方式,我们也必须用世界矩阵变换一下模型,让他们从模型空间变换到世界空间中——这导致在这种picking方式下,我们既需要变换模型,又要变换ray(除非把ray一直变到模型空间中,这也行)。
但在一般的游戏中,我们会保留一个“模型-视图”矩阵——也就是世界矩阵和相机矩阵的归并,在这种情况下,采用第2种方式的代价比第1种要小——ray不需要任何变换。
值得注意的一点是,如果采用第一种方式,并且使用了上面所描述的ray的第2种表达结构,对于m_direction的变换,需要采用相机逆矩阵的逆转置,这和变换polygon的法线是同一个道理,对于此问题迷惑的读者可以搜索法线变换相关主题。
总结到目前位置,我们已经探讨了关于3D picking的主要理论方法。
很多图形API(比如OpenGL)都提供了相关的方法来简化picking操作,可能picking的阶段有所差异,或者进行了某些优化,或者CVV定义不同,而原理大同小异。
但一个统一的要求就是需要对流水线有一个细节层次上的认识,如此才能在不断变化的需求中找到合理的解决方案。
本文由棋牌游戏整理发布。