- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Direct3D中实现图元的鼠标拾取
BY 重剑,2004.5.28 重剑空间?
索引:
1、什么是拾取,拾取能做什么?
2、拾取操作的步骤和实现
??? 2.1.? 变换并获得通过视点和屏幕上点击点的射线矢量(Dir)
2.1.1 确定鼠标选取点的屏幕坐标
2.1.2 得到Dir在观察坐标空间内的表示
2.1.3 转换Dir到世界坐标空间,并得到观察点在世界坐标系中的坐标
??? 2.2 ? 使用射线矢量对场景中的所有三角形图元求交,获得三角形索引值和重心坐标。
2.2.1 D3D扩展函数实现求交
2.2.2射线三角面相交的数学算法
2.2.3? 拾取完成根据获得的中心坐标计算我们关心的常见量
3、结束及声明
4、参考文献
补充:重心坐标的概念
3DD3D中实现图元的鼠标拾取。为了讨论简单,本文假定读者理解D3D 坐标变换流程和基本的图形学知识,如果阅读有困难请参考相关资料。
1、什么是拾取,拾取能做什么?
^_^。
2、拾取操作的步骤和实现
??? 从数学角度来看,我们只要得到射线的方向矢量和射线的出射点,我们就具备了判断射线与空间一个三角面是否相交的条件,本文主要讨论如何获得这些条件,并描述了射线三角面相交判断算法和D3D的通常实现方法。???
根据拾取操作的处理顺序,大概可以依次分为以下几个步骤
2.1.? Dir)
详细介绍之前,为了大家方便理解,我们要先简单说一下d3d坐标转换的大概流程,如下图:
?
所以我们要通过一系列的反变换,得到我们关心的值在世界坐标中的表示。
2.1.1 确定鼠标选取点的屏幕坐标
Windows给我们提供了API来完成屏幕坐标的获取,使用GetCursorPos获得鼠标指针位置,然后再利用ScreenToClient转换坐标到客户区坐标系(以窗口视区左上角为坐标原点,单位为像素),设该坐标为(POINT screenPt)。
2.1.2 得到Dir在观察坐标空间内的表示
Dir是一条从观察坐标原点出发的射线,所以我们只需要再确定一个该射线经过的点,就可以得到它在观察坐标系中的表示。假设我们要求的射线上的另外一点为该射线与透视投影平截头体近剪切面的交点,针对最普遍的透视投影而言,透视投影平截头体经投影变换后,变成一个1/2立方体(请允许我这么叫^_^,因为它的大小为一个正方体的一半,x,y方向边长为2,z方向为1)如图:
?
投影坐标系以近剪切面中心为坐标原点,该立方体从z轴负向看过去与图形程序视区相对应,最终近剪切面(前剪切面)上一点与屏幕坐标之间的对应关系如下图所示:
?
根据比例关系,screenPt与投影空间上的点projPt之间的关系为
假设图形程序窗口的宽为screenWidth,高为screenHeight,
projPt.x = (screenPt.x-screenWidth/2)/screenWidth*2; (公式1)
projPt.y = (screenPt.y-screenHeight/2)/screenHeight*2; (公式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*ProjMatri
您可能关注的文档
最近下载
- 标准的客户投诉8D分析报告.pdf VIP
- 医院检验科主任竞聘演讲稿PPT.pptx
- 腰痛病中医护理常规.pptx
- EQCS-1205-2017 电气和电子装备环境通用技术规范 机械特性.pdf VIP
- 煤矿井下巷道喷浆、硬化工程-施工组织技术方案.docx
- 马秀慧创造“绿色太阳”奇女子.doc VIP
- 2022年《陕西省实用性村庄规划编制技术要点》.pdf VIP
- 第二单元第2课《花鸟为伴》课件-2025-2026学年人美版(2024)初中美术八年级上册+.pptx VIP
- 惠普商务系列黑苹果日常elite pro zbook教程.pdf VIP
- 迎全运倡文明演讲稿2分钟PPT.pptx VIP
原创力文档


文档评论(0)