三维拾取

3D中的坐标系统

3D系统中有各种各样的坐标系,如世界坐标系,相机坐标系,屏幕坐标系等。总的来讲,一种是全局坐标系,比如世界坐标系;一种是局部坐标系,它是相对于某种参照物为原点的坐标系,如相机坐标系。

  • 世界坐标系:三维世界的全局坐标系
  • 相机坐标系:以相机为原点,相机朝向为坐标轴的局部坐标系
  • 屏幕坐标系:三维模型投影到2D屏幕上的坐标系,鼠标坐标就在屏幕坐标系中
  • 父节点坐标系:三维场景树中,以父节点为原点的坐标系

  • 三维拾取

    三维拾取,一般是指用户通过鼠标坐标,发射一条朝向屏幕内部的射线,来拾取三维场景中的物体。鼠标坐标在屏幕坐标系中,三维物体在世界坐标系中。首先需要把它们统一到同一个坐标系中,然后再进行求交计算。

  • 转换到屏幕坐标系:可以把模型通过矩阵变换M,变换到屏幕坐标系中,然后再和鼠标坐标求交。一般M=projectM * viewM * worldM,其中worldM是模型在世界坐标系中的变换矩阵,viewM相机坐标系中的视图矩阵,projectM是相机坐标系中投影矩阵。这三个矩阵可以通过gluProject函数得到,一些三维渲染引擎里也有api可以查询这些矩阵。
  • 转换到世界坐标系:也可以把鼠标发射的射线转换到世界坐标系,与三维模型进行求交计算。这个变换过程和上面是相反的。
  • 三维拾取常常需要实时响应,这就要求拾取的实现是高效的。一般常见的思路,是快速排出掉不可能相交的物体,排除的越多,计算的就越快。