ArcBall原理解析
来源:互联网 发布:气味图书馆淘宝 编辑:程序博客网 时间:2024/06/03 03:36
鼠标在桌面上的二维运动反映为光标在屏幕上的二维运动。当所处理的对象是一个二维形体时,鼠标的二维运动可以一一映射到二维形体上,从而方便地实现几乎所有需要的操作。但是当交互所关注的对象是一个三维物体时,二维屏幕与三维形体之间的矛盾就曝露出来了,ArcBall算法可以解决此矛盾。ArcBall是一种允许用户使用鼠标调整方位的三维交互技术。ArcBall的设计不平常在于,在考虑数学基础的同时,将操作反馈很好地结合起来,解决了鼠标调整空间方位的难题。和其他的一些技术相比,在通用的旋转控制器方面,ArcBall更容易使用,也更容易操作,且具有更强的功能。使用ArcBall作为鼠标三维交互控制器,其最大的特点是能很容易计算旋转轴和旋转角度。除外,能把窗口的二维空间转化为三维单位球空间,能让模型沿着Z轴或者其他轴进行平移等等。
ArcBall主要实现了,用户通过在窗口中拖动鼠标来旋转观察目标。可以想象成一个单位半球位于窗口中心,该单位半球的圆心为原点,当X*X+Y*Y<1时,Z=sqrt(1-X*X-Y*Y),X*X+Y*Y>=1时,Z=0。
鼠标按下时产生起始点,松开时产生结束点,这两点可经过相关算法转化为半球空间上的两点,设这两点与圆心所构成的角度为the弧度。当此两点都落在半球时(Z>0),则其旋转轴与这两点和圆心所构成的平面垂直,其旋转的角度为2倍the弧度;当鼠标的起始点和结束点都落在半球外时(Z=0),则其旋转轴为Z轴,旋转角度为同样为2倍the弧度。
由此根据ArcBall的原理,我们可以知道ArcBall是由最初的窗口空间转换为单位球空间,然后再由单位球空间转换为模型空间(变换矩阵)。窗口空间到单位球空间的转换是把窗口两点的坐标单位化为球面上的两点转换为半球面上的两点,算法如下:
pt.x = -(screen.x – width/2)/(radius* width/2); //单位球原点在中心,取负号能获得与窗口同向pt.y = (screen.y – height/2)/(radius* height/2);r = pt.x*pt.x + pt.y*pt.y;IF r > 1.0 THENs = 1.0/Sqrt[r];pt.x = s*pt.x;pt.y = s*pt.y;pt.z = 0.0;ELSE pt.z = Sqrt[1.0 - r];
单位球空间到模型空间转换可以计算出旋转轴和旋转角度,从而得到变换矩阵。该转换可以通过四元数来实现。一个联合的四元数q=[v, w]=[x, y, z, w]由两个部分组成,一个是数量w,它等于cosθ/2,其中θ是旋转的角度,一个是向量v,它等于沿着旋转轴的向量的sinθ/2倍。两个四元数运算的结果就是它们旋转组合的结果,这样旋转组合操作就可以采用四元数叉乘来表示。ArcBall获取转换四元数的计算公式如下:
[q.x, q.y, q.z] = V3_Cross[p0, p1];q.w = V3_Dot[p0, p1];TM = QuatToMatrix(q);
其中q表示四元数,p0和p1表示旋转的起始点和结束点(可以通过转换一获得);V3_Cross表示向量的叉积,它记录了旋转的轴的方向;V3_Dot表示向量的点积,它记录了旋转的角度;TM表示旋转矩阵,QuatToMatrix把四元数转换为矩阵。
此外通过ArcBall也可以让鼠标平移模型,该算法较简单,这里不再介绍。
- ArcBall原理解析
- ArcBall坐标旋转三维物体原理
- ArcBall二维控制三维旋转
- ArcBall二维控制三维旋转
- quagga 的原理解析 zebra原理解析
- quagga 的原理解析 zebra原理解析
- json解析及解析原理
- PullToRefresh原理解析,pulltorefresh解析
- SNIFF原理解析
- 编译原理解析
- Ajax技术原理解析
- DDoS攻击原理解析
- Ajax技术原理解析
- Lucene原理解析
- Spring_AOP原理解析
- DOM解析原理
- CSRF攻击原理解析
- JTA(XA)原理解析
- 给数组排序
- android的frameworks层键盘事件处理流程分析
- 指针扫盲--复杂指针解析
- android体系结构
- 2011.11.3 poj1860 Currency Exchange 单源最短路径 Bellman-Ford算法 解题报告
- ArcBall原理解析
- sizeof 和 strlen (32位.64位)
- Frame框架编程技术详解
- Source Insight的一些技巧
- 编程:阿拉伯数字转为钱数@递归方法(如123,转为一百二十三)
- 如何在 Eclipse 中显示代码的行号 .
- 片上总线Wishbone 学习(五)总线周期之复位操作
- [How-To]如何使用GNU Make 简化Google Closure Compiler的使用
- 编程:冒泡,选择,归并,快速