文档详情

第三章常见的鼠标键盘交互方法..doc

发布:2017-01-11约1.35万字共17页下载文档
文本预览下载声明
TrackBall模式 Trackball模式是跟踪球模式,具体来说,就是物体的中心位置不变,而改变视点的位置,从而使模型随着鼠标的移动绕着中心位置旋转。 对于鼠标移动需要计算相应的视点(照相机)的运动情况,在osg中,通过TrackballManipulator::calcMovement()来实现,并且对于不同的鼠标事件,分别进行如下的操作: 按下鼠标的左键,则旋转照相机。 按下鼠标中间键或者同时按下鼠标的左键和与右键,则改变物体的中心位置,也即对物体进行平移操作。 按下鼠标的右键,则对模型进行缩放。 在按下鼠标的左键从而旋转照相机时,这里主要模拟了一个跟踪球技术,球的半径理想情况下应该基于旋转中心到鼠标所指的物体上某点的距离,但是为了简化处理,一般情况下,球的半径TRACKBALLSIZE可以预先给定,也能达到比较好的模拟效果。具体实现过程如下: 首先分别记录两次鼠标事件的坐标的(x1,y1)和(x2,y2),根据x坐标的最小值Xmin和最大值Xmax,以及y坐标的最小值Ymin和最大值Ymax,对(x1,y1)和(x2,y2)坐标进行规范化,转化到(-1,1)之间,不妨假设新的坐标点为p1和p2,然后通过将p1和p2投影到跟踪球上,从而获取相应的z坐标。这样,以球的中心为起始点,计算出的球上的两个点为终点,可以确定两个向量,不妨记作P1和P2,那么旋转轴axis = P2^ P1,旋转的弧度为:t = ||(P2- P1)|| / (2.0*TRACKBALLSIZE),为了避免产生某些不可操纵的结果,必须先将t规范到(-1,1)之间,再将其转化为角度angles,然后将照相机绕着axis旋转angles的角度,从而实现了对照相机的旋转操作。 在osg的实现中,该跟踪球并不是一个正规的球体,而是进行了一定的变形,在中心附近是一个半径为TRACKBALLSIZE的球体,而在离中心达到一定距离时(小于球的半径TRACKBALLSIZE),该球体被扭曲成了四个双曲面。 在Trackball模式的具体实现时,有许多细节问题,如 1.首先需要将世界坐标系转化到视点坐标系,这可以通过先将中心平移到视点后根据照相机的up、物体的中心以及视点重新确立坐标系。在osg中,由void TrackballManipulator::computePosition(const osg::Vec3 eye,const osg::Vec3 center,const osg::Vec3 up)实现。 2.模型的旋转通过鼠标控制,因此需要判断鼠标是否移动,具体实现时,可以预先自定义一个速率v,分别记录下连续两次鼠标事件的时间和位置,计算出间隔的时间t和移动的距离s,如果s v * t,就可以认为鼠标移动,并根据鼠标的具体事件(如按下的是左键、右键等)进行相应的操作。在osg中,由bool TrackballManipulator::isMouseMoving()实现。 3.需要有一个函数接收不同的鼠标和键盘事件,从而做出相应的处理。在osg中,由bool TrackballManipulator::handle(const GUIEventAdapter ea,GUIActionAdapter us) 实现,如果事件被正确处理,返回true,否则返回false。其中GUIEventAdapter接受来自GUI的更新事件,GUIActionAdapter则是对这些GUI事件的回应。 Quaternion The quaternions are members of a noncommutative division algebra first invented by William Rowan Hamilton. The idea for quaternions occurred to him while he was walking along the Royal Canal on his way to a meeting of the Irish Academy, and Hamilton was so pleased with his discovery that he scratched the fundamental formula of quaternion algebra, (1) into the stone of the Brougham bridge (Mishchenko and Solovyov 2000). The set of quaternions is denoted , H, or , and the quaternions are a single example of a more gener
显示全部
相似文档