网络游戏脚本编程(副本).pptVIP

  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文档。上传文档
查看更多
网络游戏脚本编程 专业教程 北京汇众益智科技有限公司 什么是拾取,拾取能做什么? * 鼠标拾取 拾取操作指当我们在屏幕上用鼠标点击某个图元,应用程序能返回该图元的一个标志或某些相关信息。 有这些信息就得到该图元的控制权,我们可以删除,可以编辑,可以任意对待该图元 拾取操作的原理 拾取算法的思想很简单:得到鼠标点击处的屏幕坐标,通过投影矩阵和观察矩阵把该坐标转换为通过视点和鼠标点击点的一条射入场景的光线,该光线如果与场景模型的三角形相交(本文只处理三角形图元),则获取该相交三角形的信息。 从数学角度来看,我们只要得到射线的方向矢量和射线的出射点,我们就具备了判断射线与空间一个三角面是否相交的条件 坐标系变换 d3d坐标系转换的流程,如下图: 所以我们要通过一系列的反变换,得到我们关心的值在世界坐标中的表示。 确定鼠标选取点的屏幕坐标 Windows API提供了函数来完成屏幕坐标的获取,使用GetCursorPos获得鼠标指针位置,然后再利用ScreenToClient转换到客户区坐标系(以窗口视区左上角为坐标原点),设该坐标为(POINT screenPt)。 得到该点在投影空间内的表示 透视投影变换,就是view 空间到project 空间的带透视性质的坐标变换 变换之后必须保证view空间中所有处于可视范围内的点统统落在project空间的可视区域内 透视投影内部原理 view空间中的可见范围就是常说的视平截体(view frustum)。如图, view空间中可视范围 从view空间的x正半轴看过去是下图这个样子: 上下边界为y = ± z * tan(fov/2) project空间的可视范围。这个空间应当是处于我们所见到的屏幕上。实际上将屏幕表面视作project空间的xoy平面,再加一条垂直屏幕向里的z轴,这样就构成了我们想要的坐标系。现在我们可以用视口(view port)的大小来描述这个可视范围了。比如说全屏幕640*480的分辨率,原点在屏幕中心,那我们得到的可视区域为一个长方体,它如下图所示: 将project空间的可视范围定义为x∈[-1,1], y∈[-1,1], z∈[0,1]的一个立方体 从project空间的x正半轴看看我们的视区范围: 这个区域的上下边界为y’=±1 ProjMatrix = = 根据比例关系,screenPt与投影空间上的点projPt之间的关系为 假设图形程序窗口的宽为screenWidth,高为screenHeight, projPt.x = (screenPt.x-screenWidth/2)/screenWidth*2; projPt.y = (screenPt.y-screenHeight/2)/screenHeight*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; ProjMatrix = = 所以, (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._m11 projPt.y*projPt.w = viewPt.y*ProjMatrix._m22 projPt.z*projPt.w = viewPt.z*Q-QZn (注意projPt.z = 0) projPt.w = viewPt.z; 解得 viewPt.x = projPt.x*Zn/ ProjMatrix._m11; viewPt.y = pro

文档评论(0)

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

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

1亿VIP精品文档

相关文档