Direct3D中实现图元的鼠标拾取
详解软件中的拾取(选择)功能

详解软件中的拾取(选择)功能注:本文针对软件研发,全文约2500字模型视图里的拾取(选择)操作,是工业软件(设计仿真)里上层应用的一个基本功能,属于下图中“交互系统”的一部分。
比如在三维模型视图里,我们可以选中一个对象赋材料;选中面或边,赋荷载和边界条件;选中两个对象执行布尔运算;编辑一条NURBS曲线时,选择一个控制点进行拖动等等。
拿到一款软件,首先体验拾取交互功能,每种软件的交互操作不太一样,好的拾取交互能简化操作,提高工作效率。
开源CAD软件FreeCAD里提供了对多种软件交互模式的切换。
如下图:1.基础功能从研发角度看,功能完全的拾取通常包括如下内容:1. 拾取一个三维对象(二维对象可以视为三维的一种特殊情况)2. 拾取三维几何对象上的面,线和点3. 点选(单选),即鼠标点一下选中对象4. 点选(多选),一般按住Ctrl+单选,可以选中多个对象5. 框选,按住鼠标拖动画出一个方框,方框内的选中。
框选又可以分为部分框选选中,和全部框选才算选中两种6. 反选,即物体选中后,再次执行选中操作即设置为不选中7. 拾取通常不会单独发生,会有其它事件触发,比如模型创建,对象高亮显示8. 当模型有前后遮挡,需要选中被挡模型9. 有过滤器,可以使用过滤器选中特定属性的对象10. 对外提供统一的拾取接口11. 处理大模型时,要解决性能瓶颈问题,参考工业软件研发中处理超大模型(4)(点击链接查看)2.拾取原理:根据软件技术选型,拾取原理有以下几种:1.在创建模型的时候,将模型和屏幕像素建立映射关系,当进行拾取时,计算鼠标所在像素位置,再查找映射关系。
这种操作偏底层,一般是渲染引擎做的事情,比如OPENGL里的模板测试。
2.如果仅使用渲染数据,在视图上,从鼠标位置垂直视图发射一条射线,计算射线和视图对象的位置关系,相交则代表拾取到。
3.操作系统处理鼠标事件时,鼠标的坐标位置一般是屏幕坐标(局部坐标),也就是像素值,当使用了三维几何内核时,可以将位置坐标转为世界坐标,也就是真实坐标,从鼠标所在世界坐标位置发出垂直视图的射线,计算和真实模型位置的相对位置关系,如果相交则代表拾取到。
图形拾取

图形拾取
定义图形拾取及两种使用方法. 1-5a.定义图形拾取及两种使用方法 定义图形拾取及两种使用方法
Objective
图形拾取 为使用鼠标在图形窗口中拾取模型图元及坐标定位. 为使用鼠标在图形窗口中拾取模型图元及坐标定位
Definition
使用: 使用 • 拾取坐标 - 定位一个新点(关键点或节点)的坐标 定位一个新点(关键点或节点)的坐标. • 检索拾取 - 拾取已经存在的模型元素 拾取已经存在的模型元素.
图形拾取( 图形拾取(续)
1-5b. 显示拾取菜单.
Objective
在主菜单中选择带“ 在主菜单中选择带“+”号结尾的菜单,将会弹出图形拾取菜单. 号结尾的菜单,将会弹出图形拾取菜单
对于两键鼠标可以用Shift加鼠标右键代替 相当于 加鼠标右键代替) 中键 (对于两键鼠标可以用 对于两键鼠标可以用 加鼠标右键代替 拾取图形拾取菜单中的APPLY. 拾取图形拾取菜单中的 在拾取和取消之间切换. 右键 在拾取和取消之间切换Leabharlann 练习 - 图形选取 (续)
2. 更改分析文件名: 更改分析文件名: Utility Menu: File > Change Jobname ... a. 输入文件名. 输入文件名 b. 选择 选择OK.
a.
每条线选择一对关键点. 每条线选择一对关键点
b. 选择 OK 或 Cancel 关闭对话框 关闭对话框. Utility Menu: Plot > Lines
练习 - 图形选取 (续)
5. 删除部分创建的线及连接线的关键点. 删除部分创建的线及连接线的关键点 Main Menu: Preprocessor > -ModelingDelete > Line and Below
使用OpenGL实现三维坐标的鼠标拣选

OpenGL红宝书中提出了一种方法,使用后缓存来处理选择,个人觉得其完全可以替代标准选择机制。
使用方法与标准选择机制比较类似,不同的是其使用颜色来标记物体,每一组对象使用不同的颜色值,当发生选择时将场景以标记颜色在后缓存渲染一遍,然后读取帧缓存中所点选的点的颜色值(获取到颜色后不应交换前后缓存,而应直接清空后缓存以免该单色场景被显示出来),由该颜色值即可以得出被选中的是哪个对象。
和标准选择机制相比,这种方法同样需要重复渲染一次,但是由于其使用的是颜色标记,可以利用顶点缓存来显著地提高渲染速度,这是标准选择机制所无法做到的。
另外,因为读取的是像素数据而不是图元数据,拾取到的像素已经经过了Alpha测试和深度测试,所以也不会出现选取到没有光栅化的完全透明的物体或被遮挡物体的现象。
而在现在的标准24位颜色深度设备情况下,该方法能够标识256*256*256=16777216个不同的对象,这作为一般应用已经足够了。
使用OpenGL实现三维坐标的鼠标拣选Implementation of RIP(Ray-Intersection-Penetration)3D Coordinates Mouse Selection Using OpenGL顾露(武汉理工大学计算机系中科院智能设计与智能制造研究所湖北武汉 430070)摘要(Abstract):本文提出并实现一种用于三维坐标拣选的RIP(Ray-Intersection-Penetration)方法。
介绍了如何在已经渲染至窗口的三维场景中,使用鼠标或者相关设备拣选特定三维对象的方法。
此方法对于正交投影或透视投影均有效,相对于OpenGL自带的选择与反馈机制,本方法无论是拣选精度还是算法实现效率均高出许多,是一种比较通用的解决方案。
关键词(Keywords)正交投影(Ortho-Projection)、透视投影(Perspective-Projection)世界坐标系、屏幕坐标系、三维拣选、OpenGL一、简介(Introduction)OpenGL是一种比较“纯粹”的3D图形API,一般仅用于三维图形的渲染,对于特定领域的开发者(如游戏开发者)而言,如果选择使用OpenGL进行开发,类似碰撞检测的机制就都需要自行编写了。
Unity3d用鼠标拾取模型的顶点

Unity3d⽤⿏标拾取模型的顶点Unity3d ⽤⿏标拾取模型的顶点第⼀节近来想做⼀个东西,想实现3D MAX的部份功能,第⼀步⽤⿏标拾取模型的顶点,那么⾸先要做的是获取⿏标发出的射线与模型的碰撞点!先截个图,⽤到了Physics.Raycast⽅法,就是射线检测碰撞的⽅法!RaycastHit hit;Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out hit, 100)){Debug.Log();if ( == "Sphere") return;spheretransform.position = hit.point;}那么要注意⼏个问题:1.场景中的摄像机必须是主摄像机主摄像机是什么意思呢?就是摄像机的tag是MainCamera2. Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);Camera.ScreenPointToRay()⽅法其实就是“通过2D屏幕坐标在3D空间中拾取”,我们的3D场景经过摄像机的投影,变成了2D图像,显⽰在了屏幕上,那么通过逆运算,就可以换算出⿏标点的位置的3D位置,从⽽可以进⼀步选取3D场景中的物体!当然这个摄像机是离不开的,是那个摄像机渲染的当前场景,就要⽤哪个摄像机进⾏ScreenPointToRay()来进⾏运算!先说⼀下射线,射线是什么东西呢?Ray,Ray有两个字段,origin和direction,其中origin就是摄像的起始点,direction是射线的⽅向!Physics.Raycast(Ray ray,out RaycastHit,float distance)第⼀个参数就是⼀条射线,就是判断射线与其它物体的碰撞!碰撞之后会返回RaycastHit信息,distance是射线发出的距离(我理解的对不对,望兄弟们指教!)通过Physics.Raycast()可以out出⼀个参数(形参),RaycastHit,这个可以获取到碰撞点RaycastHit.point;那么为了明显的看到它,我⽤了⼀个红⾊材质的球体,球体要⼩⼀些,不断设置球体的位置为碰撞点的位置,⼤家就很容易看到结果对不对!在调试的过程中,我发现红⾊的球不断的向屏幕移动过来,不解到底是什么原因,后来分析是因为,射线不断的红球发⽣了碰撞,碰撞点在球的表⾯,所以球就不断向屏幕外移动,所以要加⼀句if ( == "Sphere") return;4.我附上“通过2D屏幕坐标在3D空间中拾取”的理论⽂章⽤XNA语⾔描述 最近在做到和3D模型的拾取有关的东西,找到了这篇不错的⽂章,加上⾃⼰的修改,基本解决了⿏标点击3D模型获取3D模型的坐标点的问题。
directx射线法拾取3d物体数学原理

directx射线法拾取3d物体数学原理directx射线法拾取3d物体数学原理(1)--原创通过2D屏幕坐标在3D空间中拾取需要的场合Directx提供了固定流水线和可编程流水线,他们都是为了实现一个目标,就是把3d模型如何投射到2d屏幕坐标上,这个过程,相关文档都有了详细的介绍,今天我们来看一下他的逆向过程,比如,你如何按下鼠标选中一个离你最近的3D 物体,如何让你的手枪打了一枪击中了远处的一个敌人的脑袋,cs中我们都玩过,那么如何判断的呢,我们就要从2D屏幕到3d屏幕的转化说开去。
为什么使用射线法一般常规思考,我们从3d的渲染流水线逆向就应该获取到3d中的对应位置,可是我们的屏幕是2D的,仅有x,y 如何表示3d中的z呢,这是个问题,不过,不要怕,我们在流水线中也考虑了这个投影的问题,当3d的物体投射到屏幕上时,我们指定了两个参数,一个是Near,一个是,far,一般在设置投射矩阵时,使用如下函数:D3DXMATRIX * D3DXMatrixPerspectiveFovLH(D3DXMATRIX *pOut,FLOAT fovy,FLOAT Aspect,FLOAT zn,FLOAT zf);这个函数最终形成的矩阵是这样子的xScale 0 0 0 0 yScale 0 0 0 0 zf/(zf-zn) 1 0 0 -zn*zf/(zf-zn) 0 其中: yScale = cot(fovY/2)xScale = yScale / Aspect通过这个函数把3d的已经渲染好的物体,投射在屏幕上。
我们现在已知屏幕上 (x,y),就是说我们能通过x,y找到z为zn,zf两个值时,屏幕上x,y对应的3d空间中的点坐标。
这就是形成一条空间射线的两个点的理论基础。
接下来又有了新问题,我们如何将屏幕中的(x,y)转化为空间中的坐标呢, 如何把屏幕的坐标转化为空间中的坐标屏幕的坐标系是这样的:左上角是0,0 右下角是w,h;而我们3d投影后形成2D坐标系是,中间(0,0),这里我们把投影后的2D坐标系标准化,转化成单位矩形(-1,-1)到(1,1),就是以中心往上下左右各给出1个单位量的大小。
(完整word版)3DOne简易操作教程(3)

3DOne简易操作教程(3):鼠标键盘篇在上文《3DOne简易操作教程(2):图形交互篇》中,小编给大家介绍了3DOne 丰富的图形交互功能,用户能够实现快速修改图形大小,对图形进行快速移动和翻转,令操作更便利。
同时,在用3DOne进行设计的过程中,还能用鼠标键盘实现快速操作,现在本文将为你介绍:1、灵活的鼠标拾取(1)直接选择选择边后:即时弹出屏显菜单/Minibar,菜单提供圆角、倒角、拔模、对齐移动命令。
边上即时附着半径DDD手柄,手柄提供默认值,用户可以即时拖拉修改。
选择面后:即时弹出屏显菜单/Minibar,菜单提供拉伸、面偏移、面移动、对齐移动材质命令,面上附着对应命令的DDD手柄。
选择体后:即时弹出屏显菜单/Minibar,菜单提供移动、缩放等功能。
(2)遮挡选择对已有对象点击,既不释放鼠标,也不移动鼠标,则界面会提供此位置所有可以选择的对象类别,方便用户选择被遮挡对象。
这就是Pick from list功能,只是命令的启动仿123D的做法,其启动方式也可以是,鼠标在某对象上提供1s后,鼠标自动切换到Pick from list功能,在此时点击,系统也会自动提供该列表。
(3)Shift PickShift Pick边,意思是选择相切的边。
Shift Pick面,则是选择能形成一个可识别的特征面。
(4)Alt Pick用于选择该鼠标位置上第2个合法对象。
(5)默认可选对象类型默认鼠标可选对象类型包括All, Sketch, Curve, Edge, Face, Shape。
2、快捷的键盘操作(1)Ctrl + C, Ctrl + V支持对体的复制和粘贴。
(2)Delete支持零件环境对体对象、草图整体的直接删除,其他对象如边、面不支持删除。
支持草图环境内草图几何标注的删除。
(3)Ctrl + 方向键实现视图旋转。
(4)Ctrl + Home = Align Plane。
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拾取操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Direct3D中实现图元的鼠标拾取查看文章 Direct3D中实现图元的鼠标拾取2007-05-05 15:463D交互图形应用程序中,常常要用鼠标去选择图形,其实现的机制基于鼠标拾取算法。
本文主要讲述如何在D3D中实现图元的鼠标拾取。
为了讨论简单,本文假定读者理解D3D 坐标变换流程和基本的图形学知识,如果阅读有困难请参考相关资料。
1、什么是拾取,拾取能做什么,首先,拾取操作指当我们在屏幕上用鼠标点击某个图元应用程序能返回该图元的一个标志和某些相关信息。
有图形程序设计经验的人都知道,有这些信息就表示我们有了对该图元的控制权,我们可以删除,可以编辑,可以任意对待该图元,至于你到底想干什么,就是阁下自己的事了^_^。
2、拾取操作的步骤和实现拾取算法的思想很简单:得到鼠标点击处的屏幕坐标,通过投影矩阵和观察矩阵把该坐标转换为通过视点和鼠标点击点的一条射入场景的光线,该光线如果与场景模型的三角形相交(本文只处理三角形图元),则获取该相交三角形的信息。
本文讲述的方法除可以得到三角形的一个索引号以外还可以得到相交点的重心坐标。
从数学角度来看,我们只要得到射线的方向矢量和射线的出射点,我们就具备了判断射线与空间一个三角面是否相交的条件,本文主要讨论如何获得这些条件,并描述了射线三角面相交判断算法和D3D的通常实现方法。
根据拾取操作的处理顺序,大概可以依次分为以下几个步骤2.1( 变换并获得通过视点和屏幕上点击点的射线矢量(Dir) 详细介绍之前,为了大家方便理解,我们要先简单说一下d3d坐标转换的大概流程,如下图:所以我们要通过一系列的反变换,得到我们关心的值在世界坐标中的表示。
2.1.1 确定鼠标选取点的屏幕坐标这一步是非常简单的Windows给我们提供了API来完成屏幕坐标的获取,使用GetCursorPos获得鼠标指针位置,然后再利用ScreenToClient转换坐标到客户区坐标系(以窗口视区左上角为坐标原点,单位为像素),设该坐标为(POINT screenPt)。
2.1.2 得到Dir在观察坐标空间内的表示在观察坐标系中,Dir是一条从观察坐标原点出发的射线,所以我们只需要再确定一个该射线经过的点,就可以得到它在观察坐标系中的表示。
假设我们要求的射线上的另外一点为该射线与透视投影平截头体近剪切面的交点,针对最普遍的透视投影而言,透视投影平截头体经投影变换后,变成一个1/2立方体(请允许我这么叫^_^,因为它的大小为一个正方体的一半,x,y方向边长为2,z方向为1)如图:投影坐标系以近剪切面中心为坐标原点,该立方体从z轴负向看过去与图形程序视区相对应,最终近剪切面(前剪切面)上一点与屏幕坐标之间的对应关系如下图所示:projPt.y = (screenPt.y-screenHeight/2)/screenHeight*2; (公式2) projPt.z =0;(实际该值可任意取,不影响最终结果。
为了处理简单,我们取改值为0,表示该点取在近剪切面上)得到projPt后,我们需要做的是把该点坐标从投影空间转换到观察空间(view space),根据透视投影的定义,可假设点(projPt.x,projPt.y,projPt.z)对应的其次坐标为 (projPt.x*projPt.w,projPt.y*projPt.w,projPt.z*projPt.w,projPt.w)我们可以通过 GetTransform( D3DTS_PROJECTION, &ProjMatrix)函数获得投影矩阵ProjMatrix,则根据观察空间到投影空间的变换关系则(projPt.x*projPt.w,projPt.y*projPt.w,projPt.z*projPt.w,projPt.w)= (viewPt.x,viewPt.y,viewPt.z, 1)*pProjMatrx;根据定义和图形学原理根据比例关系,screenPt与投影空间上的点projPt之间的关系为假设图形程序窗口的宽为screenWidth,高为screenHeight,projPt.x = (screenPt.x-screenWidth/2)/screenWidth*2; (公式1) 所以, (projPt.x*projPt.w,projPt.y*projPt.w,projPt.z*projPt.w,projPt.w) = ( viewPt.x*ProjMatrix._m11,viewPt.y*ProjMatrix._m22,viewPt.z*Q-QZn,viewPt.z)所以projPt.x*projPt.w = viewPt.x*ProjMatrix._m11projPt.y*projPt.w = viewPt.y*ProjMatrix._m22projPt.z*projPt.w = viewPt.z*Q-QZn (注意projPt.z = 0) projPt.w = viewPt.z;解得viewPt.x = projPt.x*Zn/ ProjMatrix._m11;viewPt.y = projPt.y*Zn/ ProjMatrix._m22;viewPt.z = Zn;好了,到这里为止我们终于求出了射线与近剪切面交点在观察坐标系中的坐标,现在我们拥有了射线的出发点(0,0,0)和射线方向上另外一点(viewPt.x,viewPt.y,viewPt.z),则该射线的方向矢量在观察空间中的表示可确定为(viewPt.x-0,viewPt.y-0,viewPt.z-0),化简一下三个分量同除近剪切面z坐标Zn,该方向矢量可写作DIRview = (projPt.x/projMatrix._m11,projPt.y/projMatrix._m22,1) 代入公式1,公式2DIRview.x = (2*screenPt.x/screenWidth-1)/projMatrix._m11; DIRview.y = (2*screenPt.y/screenHeight-1)/projMatrix._m22; DIRview.z = 1;其中screenWidth和screenHeight可以通过图像显示的backBuffer的目标表面(D3DSURFACE_DESC)来获得,该表面在程序初始化时由用户创建。
2.1.3 转换Dir到世界坐标空间,并得到观察点在世界坐标系中的坐标由于最终的运算要在世界坐标空间中进行,所以我们还需要把矢量DIRview从观察空间转换为世界坐标空间中的矢量DIRworld。
因为DIRview = DIRworld*ViewMatrix;其中ViewMatrix为观察矩阵,在D3D中可以用函数GetTransform( D3DTS_VIEW, &ViewMatrix )得到。
所以DIRworld = DIRview * inverse_ViewMatrix,其中inverse_ViewMatrix 为 ViewMatrix的逆矩阵。
观察点在观察坐标系中坐标为OriginView(0,0,0,1),所以其在世界坐标系中的坐标同样可以利用ViewMatrix矩阵,反变换至世界坐标系中,事实上我们可以很简单的判断出,其在世界坐标系中的表示为: OriginWorld =(inverse_ViewMatrix._41,inverse_ViewMatrix._42,inverse_ViewMatrix._43,1);到这里为止,判断射线与三角面是否相交的条件就完全具备了。
2.2 使用射线矢量对场景中的所有三角形图元求交,获得三角形索引值和重心坐标。
这一步骤地实现由两种途径:第一种方法非常简单,利用D3D提供的扩展函数D3DXIntersect可以轻松搞定一切。
见2.1第二种方法就是我们根据空间解析几何的知识,自己来完成射线三角形的求交算法。
一般来讲,应用上用第一种方法就足够了,但是我们如果要深入的话,必须理解相交检测的数学算法,这样才能自由的扩展,面对不同的需求,内容见2.2 下面分别讲解两种实现途径:2.2.1 D3D扩展函数实现求交这种方法很简单也很好用,对于应用来说应尽力是用这种方式来实现,毕竟效率比自己写得要高得多。
实际上其实没什么好讲的,大概讲一下函数D3DXIntersect吧 D3D SDK该函数声明如下HRESULT D3DXIntersect(LPD3DXBASEMESH pMesh,CONST D3DXVECTOR3 *pRayPos,CONST D3DXVECTOR3 *pRayDir,BOOL *pHit,DWORD *pFaceIndex,FLOAT *pU,FLOAT *pV,FLOAT *pDist,LPD3DXBUFFER *ppAllHits,DWORD *pCountOfHits);l pMesh指向一个ID3DXBaseMesh的对象,最简单的方式是从.x文件获得,描述了要进行相交检测的三角面元集合的信息,具体规范参阅direct9 SDK l pRayPos 指向射线发出点l pRayDir 指向前面我们辛辛苦苦求出的射线方向的向量 l pHit 当检测到相交图元时,指向一个true,不与任何图元相交则为假l pU 用于返回重心坐标U分量l pV返回重心坐标V分量l pDist 返回射线发出点到相交点的长度注意:以上红色字体部分均指最近的一个返回结果(即*pDist最小) l ppAllHits用于如果存在多个相交三角面返回相交的所有结果 l pCountOfHits 返回共有多少个三角形与该射线相交补充:重心坐标的概念其中pU和pV用到了重心坐标的概念,下面稍作描述一个三角形有三个顶点,在迪卡尔坐标系中假设表示为V1(x1,y1,z1),V2(x2,y2,z2),V3(x3,y3,z3),则三角形内任意一点的坐标可以表示为 pV = V1 + U(V2-V1) + V(V3-V1),所以已知三个顶点坐标的情况下,任意一点可用坐标(U,V)来表示,其中参数U控制V2在结果中占多大的权值,参数V 控制V3占多大权值,最终1,U,V控制V1占多大权值,这种坐标定义方式就叫重心坐标。
2..2.2射线三角面相交的数学算法使用d3d扩展函数,毕竟有时不能满足具体需求,掌握了该方法,我们才能够获得最大的控制自由度,任意修改算法。
已知条件: 射线源点orginPoint,三角形三个顶点 v1,v2,v3,射线方向 Dir (均以三维坐标向量形式表示)算法目的: 判断射线与三角形是否相交,如果相交求出交点的重心坐标(U,V)和射线原点到交点的距离T。