版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、TrackBall模式Trackball模式是跟踪球模式,具体来说,就是物体的中心位置不变,而改变视点的位置,从而使模型随着鼠标的移动绕着中心位置旋转。对于鼠标移动需要计算相应的视点(照相机)的运动情况,在osg中,通过TrackballManipulator:calcMovement()来实现,并且对于不同的鼠标事件,分别进行如下的操作:1 按下鼠标的左键,则旋转照相机。2 按下鼠标中间键或者同时按下鼠标的左键和与右键,则改变物体的中心位置,也即对物体进行平移操作。3 按下鼠标的右键,则对模型进行缩放。在按下鼠标的左键从而旋转照相机时,这里主要模拟了一个跟踪球技术,球的半径理想情况下应该基于
2、旋转中心到鼠标所指的物体上某点的距离,但是为了简化处理,一般情况下,球的半径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
3、,旋转的弧度为:t = |(P2- P1)| / (2.0*TRACKBALLSIZE),为了避免产生某些不可操纵的结果,必须先将t规范到(-1,1)之间,再将其转化为角度angles,然后将照相机绕着axis旋转angles的角度,从而实现了对照相机的旋转操作。在osg的实现中,该跟踪球并不是一个正规的球体,而是进行了一定的变形,在中心附近是一个半径为TRACKBALLSIZE的球体,而在离中心达到一定距离时(小于球的半径TRACKBALLSIZE),该球体被扭曲成了四个双曲面。在Trackball模式的具体实现时,有许多细节问题,如1首先需要将世界坐标系转化到视点坐标系,这可以通过先将中心
4、平移到视点后根据照相机的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
5、中,由bool TrackballManipulator:isMouseMoving()实现。3需要有一个函数接收不同的鼠标和键盘事件,从而做出相应的处理。在osg中,由bool TrackballManipulator:handle(const GUIEventAdapter& ea,GUIActionAdapter& us) 实现,如果事件被正确处理,返回true,否则返回false。其中GUIEventAdapter接受来自GUI的更新事件,GUIActionAdapter则是对这些GUI事件的回应。QuaternionThe quaternions are member
6、s 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
7、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 general class of hypercomplex numbers discovered by Hamilton. While the quaternions are not commutative, they
8、 are associative, and they form a group known as the quaternion group. By analogy with the complex numbers being representable as a sum of real and imaginary parts, , a quaternion can also be written as a linear combination (2)The quaternion is implemented as Quaterniona, b, c, d in the Mathematica
9、add-on package AlgebraQuaternions (which can be loaded with the command <<Algebra). Note, however, that NonCommutativeMultiply (i.e., *) must be used for multiplication of these objects rather than usual multiplication (i.e., *). The quaternions can be represented using complex matrices (3)whe
10、re z and w are complex numbers, a, b, c, and d are real, and is the complex conjugate of z. A quaternion can be represented using Quaterniona, b, c, d in the Mathematica add-on package AlgebraQuaternions (which can be loaded with the command <<Algebra), where a, b, c, and d are explicit real n
11、umbers. Quaternions can also be represented using the complex matrices (4) (5) (6) (7)(Arfken 1985, p. 185). Note that here is used to denote the identity matrix, not . The matrices are closely related to the Pauli spin matrices , , , combined with the identity matrix. From
12、 the above definitions, it follows that (8)(9)(10)Therefore , , and are three essentially different solutions of the matrix equation (11)which could be considered the square roots of the negative identity matrix. A linear combination of basis quaternions with integer coefficients is sometimes called
13、 a Hamiltonian integer. In , the basis of the quaternions can be given by (12) (13) (14) (15)The quaternions satisfy the following identities, sometimes known as Hamilton's rules, (16)(17)(18)(19)They have the following multiplication table. 1ijk11ijkii-1kjj-1ikkj-1The
14、 quaternions ± 1, , , and form a non-Abelian group of order eight (with multiplication as the group operation). The quaternions can be written in the form (20)The quaternion conjugate is given by (21)The sum of two quaternions is then (22)and the product of two quaternions is
15、 (23)The quaternion norm is therefore defined by (24)In this notation, the quaternions are closely related to four-vectors. Quaternions can be interpreted as a scalar plus a vector by writing (25)where . In this notation, quaternion multiplication has the particularly simple form (2
16、6)Division is uniquely defined (except by zero), so quaternions form a division algebra. The inverse of a quaternion is given by (27)and the norm is multiplicative (28)In fact, the product of two quaternion norms immediately gives the Euler four-square identity. A rotation about the unit vector by a
17、n angle can be computed using the quaternion (29)(Arvo 1994, Hearn and Baker 1996). The components of this quaternion are called Euler parameters. After rotation, a point is then given by (30)since . A concatenation of two rotations, first and then , can be computed using the identity 给定一个单位四元数,它对应一
18、个旋转,该旋转角度,旋转轴为即由对应的单位向量。给定义一个旋转角度,单位旋转轴,其对应一个四元数为。给出单位四元数和旋转的一一对应,下面将说明旋转的合成和旋转的结果都可以由四元数的运算来得到。1 旋转结果由四元数来计算任给一个向量,其绕单位轴旋转后的结果向量是什么呢?设对应一个四元数为,对应的四元数为,而旋转对应的四元数为,则,其中为的共轭。2 旋转的合成由四元数来计算给一个向量,它先绕单位轴旋转角度,再绕单位轴旋转角度,则两次旋转可以由两个四元数的乘积来得到。绕任意一个轴旋转,对应的矩阵如下:rotation matrix becomes (12)where the elements of
19、the matrix are (13)Here, Einstein summation has been used, is the Kronecker delta, and is the permutation symbol. Written out explicitly, the matrix elements are (14)(15)(16)(17)(18)(19)(20)(21)其中就是旋转对应的四元数。用矢量形式来表示旋转:Rotation FormulaA formula which transforms a given coordinate system by rotating i
20、t through a counterclockwise angle about an axis . This formula is used implicitly to transform objects in VRML (virtual reality markup language) using the command Rotation angle nx ny nz Phi. Referring to the above figure (Goldstein 1980), the equation for the "fixed" vector in the transf
21、ormed coordinate system (i.e., the above figure corresponds to an alias transformation), is (1) (2) (3)(Goldstein 1980; Varshalovich et al. 1988, p. 24). The angle and unit normal may also be expressed as Euler angles. In terms of the Euler parameters, DriveManipulator结构原理及功能说明当打开场景,按
22、键盘“3”键是,场景处于DriveManipulator漫游模式状态,形象的理解:处于DriveManipulator漫游模式下,就好象一个虚拟人在场景里面行走一样。一类结构SpeedControlMode: enum SpeedControlMode USE_MOUSE_Y_FOR_SPEED, USE_MOUSE_BUTTONS_FOR_SPEED ;用户按键盘“A”键时,使用USE_MOUSE_BUTTONS_FOR_SPEED模式,在该模式漫游时,鼠标左键为加速键;中键按下为停止漫游,或者左右键同时按下;鼠标右键为减速。用户如果按键盘“Q”键时,使用USE_MOUSE_Y_FOR_SP
23、EED模式,在这种模式下漫游,鼠标左、中、右键功能相同,向前为加速、向后为减速。void addMouseEvent(const GUIEventAdapter& ea) osg:ref_ptr<const GUIEventAdapter> _ga_t1; osg:ref_ptr<const GUIEventAdapter> _ga_t0;系统定义两个GUIEventAdapter对象,相当于双缓冲功能DriveManipulator:calcMovement()1 判断有没有鼠标事件2 判断速度控制模式,默认为USE_MOUSE_BUTTONS_FOR_SPE
24、ED模式3 确定照相机的方向4 完成碰撞检测virtual const char* className() const return "Drive" 继承基类方法,得到类的名称DriveManipulator:computePosition(const osg:Vec3d& eye,const osg:Vec3d& center,const osg:Vec3d& up) 视图变换,确定照相机的位置和方向DriveManipulator:DriveManipulator()构造函数,主要初始化漫游初始速度、漫游结点的高度、相机结点的包围盒以及漫游速度控
25、制模式DriveManipulator:flushMouseEventStack() 清空鼠标事件堆栈、也即使osg:ref_ptr<const GUIEventAdapter> _ga_t1;osg:ref_ptr<const GUIEventAdapter> _ga_t0;指向空指针(_ga_t1 = NULL; _ga_t0 = NULL;)osg:Matrixd DriveManipulator:getInverseMatrix() const 获得反转矩阵,主要完成OSG和openGL之间的坐标转换osg:Matrixd DriveManipulator:ge
26、tMatrix() const 获取视点矩阵const osg:Node* DriveManipulator:getNode() const 获取照相机的结点void DriveManipulator:getUsage(osg:ApplicationUsage& usage) const 获取鼠标和键盘的操控使用说明bool DriveManipulator:handle(const GUIEventAdapter& ea,GUIActionAdapter& us)handle方法主要获取外来事件响应相应的操作,在OSG里主要有以下处理事件:PUSH:当鼠标键推动时,实
27、现场景的漫游RELEASE:继续PUSH后的操作,实现场景漫游DRAG:功能和PUSH 一样MOVE:功能和PUSH 一样KEYDOWN:主要获取空格、A、Q键,空格键按下、调用home()方法、回到场景的初始状态、清空事件堆栈,禁止连续更新场景;A键按下,使用USE_MOUSE_BUTTONS_FOR_SPEED模式;Q键按下,使用USE_MOUSE_Y_FOR_SPEED模式。FRAME:主要更新场景RESIZE:当窗口大小变化时的响应状态,起功能和home()相似,唯一不同,相机结点不要重新获取 void DriveManipulator:home(const GUIEventAdapt
28、er& ea,GUIActionAdapter& us) DriveManipulator:computeHomePosition()当用户按空格键时,回到漫游的初时状态,主要完成下面事情:1 获取结点,通过IntersecVisitor确定漫游结点在场景中的初始位置2 请求绘制场景3 重新获取鼠标位置4 清空事件堆栈void DriveManipulator:init(const GUIEventAdapter& ea,GUIActionAdapter& us)当窗口大小变化时响应,主要完成下面事情:1 清空事件堆栈2 禁止场景连续更新3 通过Intersec
29、Visitor初始化漫游结点在场景中的位置virtual void setByInverseMatrix(const osg:Matrixd& matrix) setByMatrix(osg:Matrixd:inverse(matrix); 设置反转矩阵void DriveManipulator:setByMatrix(const osg:Matrixd& matrix) 设置矩阵void DriveManipulator:setNode(osg:Node* node) 获取结点的包围盒,提供给碰撞检测屏幕的中心(0,0)点在中间。屏幕左下角最小,右上角最大。照相机新的的朝向,
30、主要根据鼠标位置及照相机原有的朝向来变化。pitch,roll,yaw均是作用于改变_ratation的值,即改变照相机的朝向,而物体的移动方向是照相机移动方向的反方向。其中sv,lv,up即对于照相机的局部坐标系。Pitch:可以形象的认为是抬头和低头,根据鼠标的Y值大小,决定pitch正负。 double pitch = -inDegrees(dy*75.0f*dt); pitch_rotate.makeRotate(pitch,sv.x(),sv.y(),sv.z();/ 绕sv旋转一个角度鼠标在中心上方,Y值为正,pitch为负,照相机镜头向下转(逆向),表现为物体向上转(正向)。鼠标
31、在中心下方,Y值为负,pitch为正,照相机镜头向上转(正向),表现为物体向下(逆向)。Roll:照相机的侧身。根据鼠标的X值大小,决定roll正负。 double roll = inDegrees(dx*50.0f*dt);roll_rotate.makeRotate(roll,lv.x(),lv.y(),lv.z();/绕lv旋转一个角度鼠标在中心右方,X值为正,roll为正,照相机镜头向右转,表现为物体向左转。鼠标在中心左方,X值为负,roll为负,照相机镜头向左转,表现为物体向右转。Yaw: 照相机的转角。根据照相机原有的自身坐标系sv,lv,up,决定yaw的正负,绕着Z轴转。 do
32、uble bank = asinf(sv *getUpVector(cf); double yaw = inRadians(bank)*dt; osg:Quat yaw_rotate; yaw_rotate.makeRotate(yaw,getUpVector(cf);/注意:这里是绕着osg的z轴转当照相机的自身坐标系sv(x)方向与osg的z轴夹角为锐角,bank值为正,照相机绕Z轴正向转,表现为物体从右面(逆向)绕到照相机后面去。 若为钝角,则相反。Yaw的改变是由sv的改变而引起的,sv方向的改变是由于roll的变化引起的,pitch的改变不影响yaw的变化。所以表现为:若yaw有效,
33、当照相机侧身时,会同时转身。 lv *= (_velocity*dt);_velocity是在lv方向上的,即照相机(视点位置)移动在lv方向上。_rotation变化,首先pitch,再roll,最后yaw,即照相机局部坐标系(sv,lv,up)在改变。另外,即使鼠标不动,dt也是有值的,即两帧之间的刷新时间,所以只要鼠标不在(0,)点,就算鼠标不动,物体也会移动。问题:为什么在判断鼠标事件的时候用的是ga_t1? unsigned int buttonMask = _ga_t1->getButtonMask();Flight模式当打开场景,按键盘“2”键切换到Flight漫游模式状态
34、,采用Flight模式就像驾驶飞机观察场景,默认情况下:1 按下鼠标左键,相机加速向前移动2 按下鼠标右键,相机减速,当速度等于0时相机开始向后倒退3 按下鼠标中间键 或者鼠标左右键同时按下为停止。工作流程:一、运行程序时首先调用各个漫游模式的构造函数和setNode()函数,进行初始化,获取结点的包围盒,二、当切换到Flight模式时:首先,调用setByMatrix()通过该函数的参数设置视点位置,确定相机的视图矩阵(主要体现在旋转角度上)。接着,调用init()进行初始化,设置漫游初始速度,清空事件堆栈,设置鼠标初始位置等,通过handle()方法捕获鼠标和键盘事件、根据相应的事件来确定
35、相机的移动方式,主要工作的流程:1 确定照相机的初始位置和方向,初始状态下相机位于原点,相机朝向为Z的负方向,相机向上的方向为Y的方向。2 漫游速度控制:通过对_velocity参数的控制实现对漫游速度和漫游方向的改变,利用_velocity += dt*(_acceleration+_velocity)控制漫游加速,dt为鼠标按下的持续时间,持续时间越长漫游速度越快;减速操作也是类似。由此可知,当_velocity>0时,向着视线的方向行进;当_velocity<0时,向视线相反的方向倒退;而其为0时,则相机静止在场景中。 3 照相机旋转角度控制:使用NO_AUTOMATIC_Y
36、AW模式,只计算相机的旋转角度,不考虑飞行时的倾斜角度,使用YAW_AUTOMATICALLY_WHEN_BANKED模式,不仅需要计算相机的旋转角度,还要考虑飞行时的倾斜角度。4 相机移动检测:通过判断鼠标是否移动来决定相机是否移动,若进行了操作,如推,拉,更改窗口大小等操作后,由calcMovement()计算得相机已经移动了,则照相机看到的为新的场景;5 随时间不断的改变视线(lv*=(_velocity*dt) 和视点_eye+=lv的位置,更新相机的旋转角度。当按空格键时,调用home(),整个场景回到初始位置。一类结构YawControlMode: enum YawControlM
37、ode YAW_AUTOMATICALLY_WHEN_BANKED, NO_AUTOMATIC_YAW ;用户按键盘“A”键时,使用NO_AUTOMATIC_YAW模式,只计算相机的旋转角度,不考虑飞行时的倾斜角度。用户如果按键盘“Q”键时,使用YAW_AUTOMATICALLY_WHEN_BANKED模式,不仅需要计算相机的旋转角度,还要考虑飞行时的倾斜角度,该模式是默认的飞行漫游模式。void addMouseEvent(const GUIEventAdapter& ea) osg:ref_ptr<const GUIEventAdapter> _ga_t1; osg:r
38、ef_ptr<const GUIEventAdapter> _ga_t0;系统定义两个GUIEventAdapter对象,相当于双缓冲功能FlightManipulator:calcMovement()5 计算飞行时的漫游速度6 计算相机的旋转角度,默认为YAW_AUTOMATICALLY_WHEN_BANKED模式7 确定照相机的方向FlightManipulator:computePosition(const osg:Vec3d& eye,const osg:Vec3d& center,const osg:Vec3d& up) 视图变换,确定照相机的位置和方向FlightManipulator:FlightManipulator()构造函数,主要初始化漫游初始速度、相机结点的包围盒以及相机视角模式FlightManipulator:flushMouseEventStack() 清空鼠标事件堆栈、也即使osg:ref_ptr<const GUIEventAdapter> _
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全监控系统值机人员、维护人员职责
- 2024年陕西客运员证是考什么内容
- 2024年福州客运从业资格证考试试题库及答案解析
- 2024年浙江客运资格证考几个科目
- 2024年鹤岗申请客运从业资格证版试题
- 2024年江苏客运资格证急救止血法
- 2024年葫芦岛客运从业资格证理论考试答案
- 2024年山西客运从业资格证试题下载
- 物理-浙江省湖州、衢州、丽水2024年11月三地市高三教学质量检测试卷试题和答案
- 吉首大学《环境保护法学》2021-2022学年期末试卷
- 天津市红桥区2024-2025学年八年级上期中-生物试卷
- 期中试卷(第1-3单元)(试题)-2024-2025学年三年级上册数学沪教版
- 急救小知识科普讲座
- GB/T 11017.2-2024额定电压66 kV(Um=72.5 kV)和110 kV(Um=126 kV)交联聚乙烯绝缘电力电缆及其附件第2部分:电缆
- 生 物2024-2025学年人教版生物七年级上册期中模拟生物试卷
- 5.4+环境参与调节植物的生命活动课件高二上学期生物人教版(2019)选择性必修1
- 北京市人民大学附属中学2025届数学高二上期末统考模拟试题含解析
- 7.2 共建美好集体(课件)-2024-2025学年七年级道德与法治上册 统编版
- 2023-2024学年全国初中八年级上历史人教版期中考试试卷(含答案解析)
- 万达入职在线测评题
- 2024年人教版小学四年级科学(上册)期中试卷附答案
评论
0/150
提交评论