DirectX 3D_基础之拾取 屏幕到投影窗口的变换 对射线进行变换 射线/物体相交判断

本文介绍了3D编程中的拾取技术,用于处理用户在屏幕上点击时判断击中哪个3D物体。通过四个步骤实现:将屏幕点转换到投影窗口,计算拾取射线,将射线和物体变换到同一坐标系,最后进行射线与物体的相交判断。具体涉及到屏幕到投影窗口的变换公式和射线的计算方法,以及射线与物体相交的测试算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           每日一语:

       

          最近,自己又有点浮躁,想的事情多了,自己的心里起了一些波澜。究其原因,还是自己太急了,无法保证自己的平常心,自己喜欢比较,但比较又不彻底。可能又陷入了,羡慕嫉妒恨,这很不好,这也说明,自己的心智还不太成熟。还是应该一步一步的来,唯有坚持,才是出路。自己应该收拾心情,宁静致远,继续积淀自己的技术。厚积薄发,总有一天,我也会破茧成蝶,飞向天空。我应该为此坚信不已。

       

           正文:

 

           拾取:

 

           假设用户在屏幕上单击,击中的位置为点s = (x,y),我们从图中看,用户选中了茶壶。但是,仅给出点s,应用程序还无法立即判断出茶壶是否被击中。所以,针对这类问题,我们需要采用一项称为“拾取”的技术。

 

           我们知道,茶壶和屏幕点s之间的一种联系是茶壶被投影到了一个包含了s的区域中。更准确的说,茶壶被投影到了一个投影窗口中一个包含点p(点p位于投影窗口中)的区域中,其中点p对应于屏幕中的点s。由于该问题与3D物体极其投影有关。
 
           我们看到,如果自原点发出一条拾取射线,该射线将与那些其投影包围了点p的物体(即茶壶)相交。所以,一旦计算出了拾取射线,我们就可对场景中的每个物体进行遍历,并逐个测试射线是否与其相交。与射线相交的物体即为用户所拾取的物体。

 

          上面的例子是针对茶壶来说的。通常,我们可在屏幕上的任意位置单击。单击之后,计算出拾取射线,然后再对场景中的每个物体进行遍历,并检测是否与该射线相交。与射线相交的物体即为用户所拾取的物体。但是,射线也有可能不与任何物体相交。

 

           拾取技术在许多游戏和3D程序中都得到了广泛的应用。例如,玩家经常需要通过单击鼠标与场景中各种各样的物体进行交互。玩家可以通过单击敌人而向其开火,也可以单击某些道具将其捡起。为了使游戏程序能做出正确的响应,就需要知道被拾取的物体以及它在3D空间中的位置。拾取技术就是专门用来解决这类问题的。

 

           我们一般将拾取分解为以下4个步骤:

 

           1,给定所单击的屏幕点s,求出它在投影窗口中的对应点p.

 

           2, 计算拾取射线。即自坐标原点发出且通过点p的那条射线。

 

           3,将拾取射线和物体模型交换至同一坐标系中。

 

           4,进行物体/射线的相交判断。相交的物体即为用户所拾取的屏幕对象。

 
            屏幕到投影窗口的变换:

 

            第一步需要将屏幕点到投影窗口中。视口变换的矩阵为:
 
                   Width/2                   0                     0                 0
 
                      0                  -Height/2                 0                 0

                      0                         0            MaxZ-MinZ             0

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值