专题7选择场景中的角色.ppt_第1页
专题7选择场景中的角色.ppt_第2页
专题7选择场景中的角色.ppt_第3页
专题7选择场景中的角色.ppt_第4页
专题7选择场景中的角色.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

专题7 选择场景中的角色,抛砖引玉,抛砖引玉,抛砖引玉,抛砖引玉,专题7 选择场景中的角色,学习目标: 学习怎样实现拾取算法,弄懂它如何工作,主要掌握如下四个方面: 1) 能够获得屏幕中的点S,找到它所对应的投影窗口上的点P. 2)掌握如何计算拾取射线. 3)熟练掌握将射线与模型变换到同一坐标系中 4)掌握如何判断物体与射线相交 能够在程序中灵活运用拾取(重点),窗口的转换 拾取射线的计算 射线与物体坐标系的统一 射线与物体相交的计算 实例,专题授课要点,窗口的转换,确定鼠标选取点的屏幕坐标 (使用Windows API中的GetCursorPos函数) 将屏幕上的点转换到透影窗口上 通过视口变换矩阵 可以将将投影窗口 上的点P(px,py,pz) 通过窗口变换产生 屏幕上的点,同样 已知点,通过逆变 换也就可以得到点P,拾取射线的计算,在观察坐标系中,拾取射线是一条从观察坐标原点出发的射线,所以我们只需要再确定一个该射线经过的点,就可以得到它在观察坐标系中的表示。假设我们要求的射线上的另外一点为该射线与透视投影平截头体近剪切面的交点,针对最普遍的透视投影而言,透视投影平截头体经投影变换后,变成半个立方体如图:,拾取射线的计算,投影坐标系以近剪切面中心为坐标原点,该立方体从z轴负向看过去与图形程序视区相对应,最终近剪切面(前剪切面)上一点与屏幕坐标之间的对应关系如下图所示:,拾取射线的计算,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, ,拾取射线的代码实现,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( ,统一射线与物体坐标系,我们前面所计算出来的拾取射线是在视图空间中描述的为了完成相交计算我们还需要将物体与射线放到同一坐标系中,统一射线与物体坐标系,void TransformRay(Ray* ray, D3DXMATRIX* T) / transform the rays origin, w = 1. D3DXVec3TransformCoord( ,射线与物体的相交计算,方法:利用D3D提供的扩展函数D3DXIntersect,射线与物体的相交计算,lpMesh指向一个ID3DXBaseMesh的对象,最简单的方式是从.x文件获得,描述了要进行相交检测的三角面元集合的信息,具体规范参阅direct9 SDK pRayPos 指向射线发出点 pRayDir 指向前面我们辛辛苦苦求出的射线方向的向量 pHit 当检测到相交图元时,指向一个true,不与任何图元相交则为假 pU 用于返回重心坐标U分量 pV返回重心坐标V分量 pDist 返回射线发出点到相交点的长度 注意:以上红色字体部分均指最近的一个返回结果(即*pDist最小) ppAllHits用于如果存在多个相交三角面返回相交的所有结果 pCountOfHits 返回共有多少个三角形与该射线相交,射线与物体的相交计算,方法(了解) 使用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);,射线与物体的相交计算,bool RaySphereIntTest(Ray* ray, BoundingSphere* sphere) D3DXVECTOR3 v = ray-_origin - sphere-_center; float b = 2.0f * D3DXVec3Dot( ,实例:拾取立方体,步骤: 第步:绘制立方体 第步:实现屏幕到投影窗口的变换 第步:计算拾取射线 第步:将射线与立方体统一到同一坐标系 第步:判断射线与立方体相交情况,实例:拾取立方体,实现效果图:,拾取课堂练习,练习拾取一个圆柱体,效果如下图所示:,实例:拾取游戏角色,选择怪兽,选中后在怪兽身上显示闪烁光标,表示怪兽

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论