地形射线查询,也可以叫地形拾取(Terrain picking),在射线与地形碰撞检测中用到,最近用到了介绍一个简单方法。
通过摄像机沿鼠标方向发出的射线,算出射线与地形的交点。这个不同于地形的高度查询,如果知道射线和地形交点的x,z坐标那Y坐标太容易了。
地形按四叉划分成多个层级的块,射线和包围盒依次判断相交性,还需要注意射线包含在地形块内的情况。一般来说可以如果地形高度图分辨率不是特别大可以不用细分,超大场景和很大场景的就需要了,控制查询数量在一个范围内。如果细分了那射线可以截断使用和包围盒的“相交近点”作为射线起点,“相交远点”作为终点,起点和终点间的范围就是需查询部分。
记录下,与射线相交的地形划分的最小块单位,最好按照与射线距离由近到远的顺序排放。
依次遍历存下的小块,在每个块内在xz平面,沿射线方向,步进计算射线与地形相交的格子,可以用中点画线算法,格子内三角形与射线判断相交性,求的交点。
不过中点画线算法,实际算出的是最邻近射线的地形顶点,并非地形单位格子。
在这种情况下只要找出沿射线方向,包含该顶点的三角形,
计算射线覆盖哪些地形格子,可以用简单的方法求出射线和x轴和z轴的交点,交点所在格子就是射线所覆盖的格子。只要取得格子的左下角坐标就能构造出对应三角形,需要注意的是在第1象限和第3象限中浮点数规整到整数的时候是向下取整,但是在第2象限和第4象限中情况不一样,覆盖格子的坐标是浮点数向上取整再-1,不难象限将第2和第4象限的情况,需要像第1象限一样向原点取整。
如此这样就就可以求的射线所覆盖格子的格子的左下角坐标,再对xz轴都+1就可以用4个点构造出该格子的两个三角形,计算三角形和射线相交就可以了,注意的是三角形的顶点组织方式必须要和对应地形网格三角形组织一样,不然会有误差。
中点画线算法一般都说的是斜率0<k<1的范围,需要扩展到任意范围,只要修改下一般教学ppt内代码的增量值和条件部分就可以了。
求交点的高度图都是正数范围不存在“真正的2,3,4象限”,只是射线的方向是对应那几种情况,实际坐标范围都是在二维数组的下标范围(第1象限)内。
不只是计算射线和地形的交点,最好是线段和地形的交点更有用处,例如:游戏中某些发射物体在移动过程中的检测,取两帧之间的位移向量来计算更好,范围小少花费判断时间。
先简单记录下免得搞忘了,改天附说明图。嘿嘿