directx射线法拾取d物体数学原理【DOC精选】.docVIP

directx射线法拾取d物体数学原理【DOC精选】.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
directx射线法拾取d物体数学原理【DOC精选】

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个单位量的大小。这样我们把屏幕坐标转化为这个单位坐标的公式如下 假设屏幕高宽不一致,这样单位坐标系内,屏幕坐标的表示法如下: #define WIDTH?????????? 640.0f #define HEIGHT????????? 480.0f #define WIDTH_DIV_2????? (WIDTH*0.5f) #define HEIGHT_DIV_2???? (HEIGHT*0.5f) #define ASPECT??????????? 1.3333f dx=(x/WIDTH_DIV_2-1.0f)/ASPECT; dy=1.0f-y/HEIGHT_DIV_2; 建立射线的原理 有了这个坐标表示,我们还得了解这个坐标系有什么意义,为什么要转化成这样? 根据前边我们提到的,投影矩阵是以一个近平面和一个远平面构成的投影, 屏幕上显示的就是近平面和远平面投射后的一个叠加,然后一个像素一个像素的标绘出来。 这样从y轴往下看,就是一个三角形 这样看, x=z*tan(FOV/2) 加上我们刚才转化的坐标,我们可以得出, x=z*tan(FOV/2)* (x/WIDTH_DIV_2-1.0f)/ASPECT 同理y; 这样我们通过屏幕坐标可以根据z的值得到近平面上的点和远平面上的点了,也就是就能形成一条射线。 p1=D3DVECTOR(dx*NEAR,dy*NEAR,NEAR); p2=D3DVECTOR(dx*FAR,dy*FAR,FAR); 示例代码 #define NEAR 10.0f #define FAR 4000.0f #define FOV 0.8f #define WIDTH 640.0f #define HEIGHT 480.0f #define WIDTH_DIV_2 (WIDTH*0.5f) #define HEIGHT_DIV_2 (HEIGHT*0.5f) #define ASPECT 1.3333f void calcRay(int x,int y,D3DVECTOR p1,D3DVECTOR p2) { float dx,dy; D3DMATRIX invMatrix,viewMatrix; dx=tanf(FOV*0.5f)*(x/WIDTH_DIV_2-1

文档评论(0)

taotao0b + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档