版权声明:转载请注明出处 https://blog.csdn.net/weixin_39918693/article/details/88780127
个人觉得本章的标题应该是射线检测
拾取(Picking)问题
与3D物体及其投影有关
通常,我们可在屏幕上的任意位置单击。单击之后,计算出拾取射线,然后再对场景中的每个物体进行遍历,并检测是否与该射线相交。与射线相交的物体即为用户所拾取的东西
拾取技术
在许多游戏和3D程序中都得到了广泛的应用
我们可将拾取分解为以下4个步骤
:
- 1、求出
屏幕点s
在投影窗口中的对应点p
- 2、计算
拾取射线
- 3、将拾取射线和物体模型
变换至同一坐标系中
- 4、进行物体/射线的
相交判断
相交的物体即为用户所拾取的屏幕对象
1、屏幕到投影窗口的变换
拾取变换
之后,z坐标
并不作为2D图像的一部分进行存储,而是被保存在深度缓存
中
视口的X和Y成员都为0(一般情况下均如此)??????
利用视口变换的逆变换
来计算s点对应的投影窗口上的p点
由于投影矩阵已对投影窗口中的点进行了比例变换以模拟不同的视场,即呈现出近大远小的效果,所以需要进行比例变换的逆变换
2、拾取射线的计算
使用射线的参数方程
即可,十分简单
3、对射线进行变换
我们计算所得的拾取射线是在观察坐标系
中描述的。为了进行射线/物体相交测试,射线和物体必须位于同一坐标系中
我们不打算将所有的物体都变换至观察坐标系中,因为将射线变换至世界坐标系甚至某个物体的局部坐标系往往更容易
借助变换矩阵对射线的起点和方向分别进行变换
,就实现了射线的变换
起点
是按照点来变换的;方向
是按照向量来变换的
4、射线/物体相交判定
考虑到性能因素,在进行相交判定的时候,我们用外接体近似代替实际的物体以减少计算量
拾取射线可能会与多个物体相交。但只有距离摄像机最近的那个物体被拾取,因为距离摄像机较近的物体遮挡了位于其后的物体
相交判定方程的解的不同类型表示不同的意义
拾取射线的起点与观察坐标系的原点重合
,且经过用户所单击的屏幕点