




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专题选择场景中的角色第1页,课件共25页,创作于2023年2月抛砖引玉Copyright2008ByNeusoftGroup.Allrightsreserved第2页,课件共25页,创作于2023年2月抛砖引玉Copyright2008ByNeusoftGroup.Allrightsreserved第3页,课件共25页,创作于2023年2月抛砖引玉Copyright2008ByNeusoftGroup.Allrightsreserved第4页,课件共25页,创作于2023年2月抛砖引玉Copyright2008ByNeusoftGroup.Allrightsreserved第5页,课件共25页,创作于2023年2月
专题7选择场景中的角色学习目标:1.学习怎样实现拾取算法,弄懂它如何工作,主要掌握如下四个方面:1)能够获得屏幕中的点S,找到它所对应的投影窗口上的点P.2)掌握如何计算拾取射线.3)熟练掌握将射线与模型变换到同一坐标系中4)掌握如何判断物体与射线相交2.能够在程序中灵活运用拾取(重点)Copyright2008ByNeusoftGroup.Allrightsreserved第6页,课件共25页,创作于2023年2月Copyright2008ByNeusoftGroup.Allrightsreserved窗口的转换拾取射线的计算射线与物体坐标系的统一射线与物体相交的计算实例专题授课要点第7页,课件共25页,创作于2023年2月窗口的转换1.确定鼠标选取点的屏幕坐标(使用WindowsAPI中的GetCursorPos函数)2.将屏幕上的点转换到透影窗口上
通过视口变换矩阵可以将将投影窗口上的点P(px,py,pz)通过窗口变换产生屏幕上的点S,同样已知点S,通过逆变换也就可以得到点PCopyright2008ByNeusoftGroup.Allrightsreserved第8页,课件共25页,创作于2023年2月拾取射线的计算
在观察坐标系中,拾取射线是一条从观察坐标原点出发的射线,所以我们只需要再确定一个该射线经过的点,就可以得到它在观察坐标系中的表示。假设我们要求的射线上的另外一点为该射线与透视投影平截头体近剪切面的交点,针对最普遍的透视投影而言,透视投影平截头体经投影变换后,变成半个立方体如图:Copyright2008ByNeusoftGroup.Allrightsreserved第9页,课件共25页,创作于2023年2月拾取射线的计算
投影坐标系以近剪切面中心为坐标原点,该立方体从z轴负向看过去与图形程序视区相对应,最终近剪切面(前剪切面)上一点与屏幕坐标之间的对应关系如下图所示:
Copyright2008ByNeusoftGroup.Allrightsreserved第10页,课件共25页,创作于2023年2月拾取射线的计算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;Copyright2008ByNeusoftGroup.Allrightsreserved第11页,课件共25页,创作于2023年2月拾取射线的代码实现structRay{ D3DXVECTOR3_origin; D3DXVECTOR3_direction;};RayCalcPickingRay(intx,inty){ floatpx=0.0f; floatpy=0.0f; D3DVIEWPORT9vp; g_pD3DDevice->GetViewport(&vp); D3DXMATRIXproj; 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); Rayray; ray._origin=D3DXVECTOR3(0.0f,0.0f,0.0f); ray._direction=D3DXVECTOR3(px,py,1.0f); returnray;}Copyright2008ByNeusoftGroup.Allrightsreserved第12页,课件共25页,创作于2023年2月统一射线与物体坐标系我们前面所计算出来的拾取射线是在视图空间中描述的.为了完成相交计算我们还需要将物体与射线放到同一坐标系中.
Copyright2008ByNeusoftGroup.Allrightsreserved第13页,课件共25页,创作于2023年2月统一射线与物体坐标系voidTransformRay(Ray*ray,D3DXMATRIX*T){ //transformtheray'sorigin,w=1. D3DXVec3TransformCoord( &ray->_origin, &ray->_origin, T); //transformtheray'sdirection,w=0. D3DXVec3TransformNormal( &ray->_direction, &ray->_direction, T); //normalizethedirection D3DXVec3Normalize(&ray->_direction,&ray->_direction);}Copyright2008ByNeusoftGroup.Allrightsreserved第14页,课件共25页,创作于2023年2月射线与物体的相交计算方法1:利用D3D提供的扩展函数D3DXIntersectCopyright2008ByNeusoftGroup.AllrightsreservedHRESULTD3DXIntersect(LPD3DXBASEMESHpMesh,
CONSTD3DXVECTOR3*pRayPos,
CONSTD3DXVECTOR3*pRayDir,
BOOL*pHit,
DWORD*pFaceIndex,
FLOAT*pU,
FLOAT*pV,
FLOAT*pDist,
LPD3DXBUFFER*ppAllHits,
DWORD*pCountOfHits
);第15页,课件共25页,创作于2023年2月射线与物体的相交计算
lpMesh指向一个ID3DXBaseMesh的对象,最简单的方式是从.x文件获得,描述了要进行相交检测的三角面元集合的信息,具体规范参阅direct9SDKpRayPos指向射线发出点pRayDir指向前面我们辛辛苦苦求出的射线方向的向量pHit当检测到相交图元时,指向一个true,不与任何图元相交则为假pU用于返回重心坐标U分量pV返回重心坐标V分量pDist返回射线发出点到相交点的长度注意:以上红色字体部分均指最近的一个返回结果(即*pDist最小)ppAllHits用于如果存在多个相交三角面返回相交的所有结果pCountOfHits返回共有多少个三角形与该射线相交Copyright2008ByNeusoftGroup.Allrightsreserved第16页,课件共25页,创作于2023年2月射线与物体的相交计算方法2(了解)使用D3D扩展函数,毕竟有时不能满足具体需求,掌握了该方法,我们才能够获得最大的控制自由度,任意修改算法。已知条件:射线源点orginPoint,三角形三个顶点v1,v2,v3,射线方向Dir(均以三维坐标向量形式表示)算法目的:判断射线与三角形是否相交,如果相交求出交点的重心坐标(U,V)和射线原点到交点的距离T。我们可先假设射线与三角形相交则交点(注以下均为向量运算,*数乘,dot(X,Y)X,Y点乘,cross(X,Y)X,Y叉乘;U,V,T为标量)则:IntersectPoint=V1+U*(V2-V1)+V*(V3-V1);IntersectPoint=originPoint+T*Dir;
所以
orginPoint+T*Dir=V1+U*(V2-V1)+V*(V3-V1);Copyright2008ByNeusoftGroup.Allrightsreserved第17页,课件共25页,创作于2023年2月射线与物体的相交计算
boolRaySphereIntTest(Ray*ray,BoundingSphere*sphere){ D3DXVECTOR3v=ray->_origin-sphere->_center; floatb=2.0f*D3DXVec3Dot(&ray->_direction,&v); floatc=D3DXVec3Dot(&v,&v)-(sphere->_radius*sphere->_radius); //findthediscriminant floatdiscriminant=(b*b)-(4.0f*c); //testforimaginarynumber if(discriminant<0.0f) returnfalse; discriminant=sqrtf(discriminant); floats0=(-b+discriminant)/2.0f; floats1=(-b-discriminant)/2.0f; //ifasolutionis>=0,thenweintersectedthesphere if(s0>=0.0f||s1>=0.0f) returntrue; returnfalse;}Copyright2008ByNeusoftGroup.Allrightsreserved第18页,课件共25页,创作于2023年2月实例:拾取立方体步骤:第1步:绘制立方体第2步:实现屏幕到投影窗口的变换第3步:计算拾取射线第4步:将射线与立方体统一到同一坐标系第5步:判断射线与立方体相交情况Copyright2008ByNeusoftGroup.Allrightsreserved第19页,课件共25页,创作于2023年2月实例:拾取立方体实现效果图:Copyright2008ByNeusoftGroup.Allrightsreserved第20页,课件共25页,创作于2023年2月拾取课堂练习练习拾取一个圆柱体,效果如下图所示:Copyright2008ByNeusoftGroup.Allrightsreserved第21页,课件共25页,创作于2023年2月实例:拾取游戏角色选择怪兽,选中后在怪兽身上显示闪烁光标,表示怪兽已经拾取成功.Copyright2008ByNeusoftGroup.Allrightsreserved第22页,课件共25页,创作于2023年2月作业:1.绘制一个正四面体,并实现拾取2.导入前面所提供的Yodan.x文件,并实现对人物的拾取.Copyright2008ByNeusoftGroup.A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年逆流式颗粒饲料冷却器项目市场调查研究报告
- 2025年过滤滤袋项目市场调查研究报告
- 2025年手动单闸板电缆防喷器项目市场调查研究报告
- 技术跨界透视智能城市中数字孪生技术的知识产权走向
- 总装化造船生产均衡性的多维度解析与优化策略研究
- 小学课堂强化行为:理论实践与策略探究
- 宁夏煤炭利用效率及其影响因素的多维度剖析与提升策略研究
- 大鼠社交孤立诱发焦虑异常及其神经机制解析:基于多巴胺系统与脑区功能的研究
- 多重视角下英语电影片名汉译的策略与实践研究
- 2025年信息系统项目管理师考试项目知识应对计划试卷
- 2024年湖南省高考化学试卷真题(含答案解析)
- 《铰链四杆机构》(课件)
- 通信企业协会网络安全人员能力认证考试复习题库(含答案)
- 化学家门捷列夫课件
- 小学一年级体育教案全集
- 2024年新人教版七年级数学下册期末考试数学试卷-含答案
- 运动健康管理智慧树知到答案2024年上海师范大学
- 2024年广东省预防接种技能竞赛理论考试题库(含答案)
- GB/T 4706.24-2024家用和类似用途电器的安全第24部分:洗衣机的特殊要求
- DLT 1529-2016 配电自动化终端设备检测规程
- 2018年四川省中职学校技能大赛建筑CAD赛项 样题
评论
0/150
提交评论