2019-08-10
前段时间群里有人问OSG的正交投影怎么实现,似乎不熟悉的同学都陷入错误的思考方式,从而难以把问题想明白。其实,这个功能很简单。只要想明白了,就会豁然开朗,也能对类似的问题有所帮助。OSG内置的manipulator都是为透视投影准备的。但是,CAD程序多数情况下需要使用正交投影。OSG抽象了一个Manipulator类型,鼠标、键盘驱动camera进行交互浏览。其继承层次如下 :
GUIEventHandler CameraManipulator StandardManipulator OrbitManipulator TrackballManipulator
所以,我们需要继承osgGA::StandardManipulator,实现一个新的manipulator。对于三维场景的操作,主要有三个:zoom、rotate、pan(平移)。要实现正交投影的manipulator,主要也是实现这三个操作的逻辑。这里要提一下,要明确一点,缩放是滑轮驱动的,关于缩放系数,只能自己决定;拖拽、平移,由窗口坐标系的像素单位移动引起,所以,需要把像素距离转换为三维世界的距离。