- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
抛砖引玉 抛砖引玉 抛砖引玉 抛砖引玉 专题7 选择场景中的角色 学习目标: 1. 学习怎样实现拾取算法,弄懂它如何工作,主要掌握如下四个方面: 1) 能够获得屏幕中的点S,找到它所对应的投影窗口上的点P. 2)掌握如何计算拾取射线. 3)熟练掌握将射线与模型变换到同一坐标系中 4)掌握如何判断物体与射线相交 2.能够在程序中灵活运用拾取(重点) 窗口的转换 拾取射线的计算 射线与物体坐标系的统一 射线与物体相交的计算 实例 窗口的转换 1.确定鼠标选取点的屏幕坐标 (使用Windows API中的GetCursorPos函数) 2.将屏幕上的点转换到透影窗口上 通过视口变换矩阵 可以将将投影窗口 上的点P(px,py,pz) 通过窗口变换产生 屏幕上的点S,同样 已知点S,通过逆变 换也就可以得到点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, proj)函数获得投影矩阵proj; 拾取射线的代码实现 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; } 统一射线与物体坐标系 我们前面所计算出来的拾取射线是在视图空间中描述的.为了完成相交计算我们还需要将物体与射线放到同一坐标系中. 统一射线与物体坐标系 void TransformRay(Ray* ray, D3DXMATRIX* T) { // transform the rays origin, w = 1. D3DXVec3TransformCoord( ray-_origin, ray-_origin, T); // transform the rays direction, w = 0. D3DXVec3TransformNormal( ray-_direction, ray-_direction, T); // normalize the direction D3DXVec3Normalize(ray-_direction, ray-_direction); } 射线与物体的相交计算 方法1:利用D3D提供的扩展函数D3DXIntersect 射线与物体的相交计算 lpMesh指向一个ID3DXBaseMesh的对象,最简单的方式是从.x文件获得,描述了要进行相交检测的三角面元集合的信息,具体规范参阅direct9 SDK pRayPos 指向射线发出点 pRayDir 指向前面我们辛辛苦苦求出的射线方向的向量 pHit 当检测到相交图元时,指向一个true,不与
文档评论(0)