关于物体选择的一点思考

494 阅读2分钟

接上篇:光线投射

物体模式

思考:从鼠标坐标出发构造一根射线,判断与这根射线相交的物体?

想法:一个复杂的物体由n个几何物体或者不规则物体组合而成,每个物体的三角面片个数不同,坐标位置不同,所以在判断射线与物体相交的时候不能暴力遍历所有原子物体的三角面片,因为这样会导致计算量异常的庞大,严重影响交互和性能,所以一个解决办法就是针对每个原子物体构造一个包围盒,比如这样

image.png

但是只有这样是不够的,因为如果当一个物体很复杂时,原子物体也可以有很多,所以下一步的操作是进行组合,比如有一头牛模型,那么可以将牛模型分解成头,躯干,四肢,尾巴,而这些分解出来的模型就是由一些原子物体组成,比如头有耳朵,嘴巴,眼睛……,如果物体组合还不够,我们可以在组合内部进一步分解,直到分解到一个我们任何合适的组合

分解出来组合后,那么我们的计算就变得很容易,设计好一个物体的数据结构,比如

const geometry = {
  type''// 物体类型*
  boundingBox: {},  // 物体包围盒数据*
  children: [],  // 下属物体/组合
}

这样我们就只需要计算针对每个物体计算包围盒,先判断是否与包围盒相交,在判断children,递归计算,直到结束返回结果

点模式

上述物体选择通常做整体的操作,比如添加材质,位移,旋转,缩放等操作,另外一种操作就是控制点做局部的位移,缩放,旋转的操作,比如我们在某个复杂物体上有一个曲面

image.png 在这个曲面上我们移动了某个控制点进行了曲面拉伸操作,那么找到这个控制点就是我们要做的事,简易步骤

  1. 查找与鼠标相交的物体
  2. 查找这个物体中与鼠标相交的控制点
  3. 控制点操作
  4. 渲染

以上就是物体选择的一点思考,关于构造包围盒,鼠标发出的射线与包围盒相交计算会在后续文章中进行讲解