每日一语:
最近,自己又有点浮躁,想的事情多了,自己的心里起了一些波澜。究其原因,还是自己太急了,无法保证自己的平常心,自己喜欢比较,但比较又不彻底。可能又陷入了,羡慕嫉妒恨,这很不好,这也说明,自己的心智还不太成熟。还是应该一步一步的来,唯有坚持,才是出路。自己应该收拾心情,宁静致远,继续积淀自己的技术。厚积薄发,总有一天,我也会破茧成蝶,飞向天空。我应该为此坚信不已。
正文:
拾取:
假设用户在屏幕上单击,击中的位置为点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