三维图形绕坐标轴连续旋转的算法与实现
第29卷第6期2007年12月沈 阳 工 业 大 学 学 报
Journal of Shenyang University of Technology
Vol 129No 16Dec. 2007
文章编号:1000-1646(2007) 06-0696-03
三维图形绕坐标轴连续旋转的算法与实现
魏 东, 李冬梅, 黄有群
(沈阳工业大学信息科学与工程学院, 沈阳110023)
摘 要:在三维图形处理软件中, 界面交互方法, 这需要知道三个轴和三个角度, , 案, 转轴和旋转角度, . , 比采用四元数连乘方法, , 便于用户界面交互. :; 算法; 旋转轴; 旋转角度: 文献标识码:A
Algorithm and implementation of continuous rotation of
three 2dimensional graphic around coordinate axis
WEI Dong , L I Dong 2mei , HUAN G Y ou 2qun
(School of Information Science and Engineering , Shenyang University of Technology , Shenyang 110023, China )
Abstract :While realizing continuous rotation of the entit y by 3D graphic software , user is used to adopt interface interaction approach where the entity rotates around three axes respectively. That needs three rotation axes and three rotation angles , and is hard in programming realization. Aiming at the problem , a new method was proposed to realize convenient continuous rotation of the entit y. In the method , three formulae are given to calculate a rotation axis and a rotation angle according to the angles of the entity rotation around three coordinates axis and their sequence , and the calculated axis and the angle used to realize rotation of the entity. Compared with the method of continuous quaternion multiplication , the proposed approach has higher calculating speed and is facility in programming realization as well as user interface interaction.
K ey w ords :continuous graphic rotation ; rotation matrix ; algorithm ; rotation axis ; rotation angle
在很多图形应用软件特别是三维图形应用软件中, 旋转变换可以用不同的方法描述. 例如, 用欧拉角的方法描述; 用方向余弦方法描述; 用绕3个坐标轴旋转的方法描述等[1-2]. 使用人员一般习惯采用分别绕x 、y 、z 3个坐标轴旋转的方式得到最终的结果. 这时可以采用多个旋转矩阵相乘得到[3], 也可以采用四元数连乘的方法得到[4].
但是, 在软件开发过程中, 经常使用Open G L 图形引擎、VRML 或JAVA3D 等作为开发基础, Open G L 和VRML 在实现旋转时必须知道旋转
收稿日期:2006-09-04.
基金项目:沈阳市科技局重点资助项目([1**********]8) .
轴和旋转角度, 然后使用Open G L 中的G lrotate [5]或VRML 中的Transform 来实现[6]. 而JAVA3D 则可采用矩阵或四元数来实现. 在实现绕坐标轴连续旋转时需要多次调用相应的函数, 这样在编程实现时就相对麻烦一些. 尤其对于以
VRML 为基础的软件, 会出现多个Transform 嵌套, 使得VRML 文件变大, 不利于网络传输. 对于一个实
β、γ角的情况, 体分别绕x 、y 、z 轴分别旋转α、
β、γ得到一个旋转轴和一个旋是否可以根据α、
转角度, 回答是肯定的, 这样多次旋转就可以通过
作者简介:魏 东(1968-) , 男, 山东利津人, 副教授, 硕士, 主要从事计算机图形学等方面的研究.
第6期魏 东, 等:三维图形绕坐标轴连续旋转的算法与实现 697
一次旋转来完成.
文献[7]提出了采用四元数连乘的方法, 即通过代表多个任意旋转轴及角度的四元数连乘得到一个四元数, 再从该四元数中提取旋转轴和旋转角度. 这是因为在使用Open G L 图形引擎或VRML 编程时, 它们不支持四元数, 所以必须依
量, 因此完全可以只依据绕3个坐标轴的旋转角度, 直接采用下面讨论的3个公式计算出旋转轴和旋转角度, 而不必采用四元数连乘的方法, 从而避免四元数运算中的向量运算及过多的乘法运算, 减少编程实现的复杂程度, 提高程序的运行速度, 同时满足用户的操作习惯.
据通过四元数计算出旋转轴和角度. 这需要对角度进行除法、乘法运算, 并对四元数进行相应的向量运算.
1, y 轴旋转β角, 角度, 有旋转矩阵R x , R y ,
转轴, 方式. , R z , 则有R xyz =R z R y R x , 计算后得
-αγ+cos γsin βsin αsin γsin α+cos γsin βcos α
R xyz γcos γcos α+sin γsin βsin α-cos γsin α+sin γsin βcos (1)
-sin βcos βsin αcos βcos α 同理, 当实体按不同坐标轴顺序先后旋转时可
得R xzy 、R yz x 、R yxz , R zyx , R z xy 共六种旋转矩阵. 另
2
C +A x (1-C )
外, 当一个实体绕任意轴旋转时, 设旋转轴为A (A x , A y , A z ) , 旋转角度是θ, 则旋转矩阵为[8]
A x A z (1-C ) +A y S A y A z (1-C ) -A x S
2
C +A z (1-C )
A x A y (1-C ) -A z S
2
C +A y (1-C )
RA =A x A y (1-C ) +A z S A x A z (1-C ) -A y S
(2)
A y A z (1-C ) +A x S
式中:C =cos θ; S =sin θ.
现令旋转轴A 为单位矢量, 则有A 2x +A 2y +
A z =1. 这样矩阵RA 中正对角线之和为1-2C. 对
2
相应的, 对于其它5种情况也有类似结果.
对上述6种情况得到的等式总结如下:设k , m , n 分别是{x , y , z }中之一, 则A k 为A x , A y , A z 其中之一
, αk 是实体绕A k 旋转的角αn 是实体绕其它两个坐标轴旋转时的角度, αm 、
αm 、αn 按k 、度, 即αm 、n 与x , y , z 的对应关系k 、β、γ中的一个. 分别取α、
当实体按三个坐标轴先后旋转时, 如果A k 所代表的坐标轴是旋转次序中的第二个旋转轴, 则2A k S =cos αm cos αn sin αk ±
sin αm sin αn +sin αk
(7)
于上述六种情况就有RA 等价于其中之一, RA =
R , R ∈{R xyz , R xzy , R yzx , R yxz , R zyx , R zxy }, 这样导致相等矩阵中对应元素相等, 则有以下规律:
1) 矩阵正对角线元素之和相等, 即RA [1, 1]+RA [2, 2]+RA [3, 3]=R [1, 1]+R [2, 2]+R [3, 3].可计算出
1-2C =cos γcos β+cos γcos α+
(3) cos βcos α±sin γsin βsin α
其中±的取值可根据实体按3个坐标轴旋转的先后顺序, 为x 、y 、z ; y 、z 、x ; z 、x 、y 时符号取+, 反之取-. 由此, 可求出旋转角度θ, 并可计算
S.
当3个坐标轴的先后顺序为x 、y 、z ; y 、z 、x ; z 、x 、y 时符号取+, 反之取-. 如果A k 所代表的坐标轴不是旋转次序中的第二个旋转轴, 则
2A k S =sin αk cos αm +sin αk cos αn ±
cos αk sin αm sin αn
z 、x 、y 时符号取-, 反之取+.
(8)
2) 对等号两边的矩阵分别计算RA [i , j ]-RA [j , i ]=R [i , j ]-R [j , i ], 当i =2, j =1时
可求出2A z S ; 当i =1, j =3时可求出2A y S ; 当
i =3, j =2时可求出2A x S 从而得到旋转轴. 例
当3个坐标轴的先后顺序为x 、y 、z ; y 、z 、x , 3) 另外, 对于实体只绕两个坐标轴旋转的情
如, 当RA =R xyz 得到
2A z S =sin γcos β+sin γcos α-cos γsin βsin α
2A x S =cos βsin α+cos γsin α-sin γsin βcos α
(6) (4)
况, 也按上述方法分析得到如下结果:
如果实体是绕两个坐标轴先后旋转, 则设剩
余的坐标轴为第三个实体绕之旋转的坐标轴, 同时设旋转角度为0, 再按公式(3) , (7) , (8) 求出旋转轴和旋转角度. 另外, 如果用户在旋转过程中对
2A y S =cos γsin βcos α+sin γsin α+sin β(5)
698 沈 阳 工 业 大 学 学 报第29卷
某个轴出现多次旋转, 则采用加法直接合成一个
旋转角度, 然后再参与到计算中去.
2 应用实例
有了上述的算法基础, 就可以根据实体绕三个或两个坐标轴旋转的角度计算出一个旋转轴和旋转角度. 计算过程按以下步骤.
1) 依据公式(3) 和旋转轴顺序计算出C 值; 2) 依据C =cos θ转角度, 再计算出S =sin θ;
3) . 需要19次乘法、4次除法及相应的加减法和三角函数运算. 因此, 在这种情况下, 本方法有较高的运算速度.
在实际应用中, 当系统与用户交互时, 用户采用绕3个坐标轴旋转1个实体的方法, 可以计算出1个旋转轴和1个旋转角度, 用这个旋转轴和旋转角度来代替3, 适用于, 便于用户交互. 软.
:
[1]徐宏文, 陈东祥, 王金敏. 画法解析几何[M ].天津:
天津大学出版社,1993.
(XU Hong 2wen , CHEN Dong 2xiang , WAN G Jin 2min. Brush work analytic geometry [M ].Tianjin :Tianjin U 2niversity Press ,1993. ) [2]龙泽斌. 几何变换[M ].长沙:湖南科学技术出版社,
1984.
(LON G Ze 2bin. G eometry transform [M ].Changsha :Hunan Science Technology Press ,1984. ) .
[3]孙家广. 计算机图形学[M ].北京:清华大学出版社,
1998:371-373.
(SUN Jia 2guang. Computer graphics [M ].Beijing :Ts 2inghua University Press ,1998:371-373. )
[4]Hearn D , Baker M P. Computer graphics C version
[M ].Prentice 2Hell International Inc ,1998:419-420. [5]乔林, 费广正, 杜林. Open G L 程序设计[M ].北京:清
华大学出版社,2000.
(Q IAO Lin , FEI Guang 2zheng ,DU Lin. Open G L pro 2gramming [M ].Beijing :Tsinghua University Press , 2000. )
[6]黄铁军, 柳键. VRML 国际标准与应用指南[M ].北
京:电子工业出版社,1999.
(HUAN G Tie 2jun ,L IU Jian. VRML international stan 2dard and application tutorial [M ].Beijing :Publishing House of Electronics Industry ,1999. )
[7]陈国华. 三维连续图形变换的一类算法与实现[J].
中国图象图形学报,2001,6A (12) :1240-1243.
(CHEN Guo 2hua. On three 2dimensional continuous graphic transformations calculation and implementation [J].Journal of Image and Graphics , 2001, 6A (12) :1240-1243. ) [8]Eric Lengyel. 3D 游戏与计算机图形学中的数学方法
[M ].北京:清华大学出版社,2004.
(Eric Lengyel. Mathematics for 3D game and computer graphic [
M ].Beijing :Tsinghua University Press , 2004. )
(责任编辑:邓美艳 英文审校:王溪波)
第三个, (8) ±; 如果是第二个则采用公式() 并判断±, 计算出3个坐标值. 在取得实体的旋转轴和旋转角度后, 就可以直接使用该轴和角度进行程序的运算.
图1是以采用VB 以VRML 为基础实现的一个立方体旋转的例程, 左边是先后按3个坐标轴旋转得到的结果, 即采用3
个Transform 节点, 通过嵌套实现立方体的旋转; 右边是采用计算后的旋转轴和旋转角度得到的结果, 利用一个Transform 来实现立方体旋转的结果. 同时, 显示求得的旋转轴和旋转角度, 如图1中下部所示.
图1 求旋转轴和旋转角度的例图
Fig 11 Illustration of computing rotation
axis and rotation angel
3 结 论
在绕3个坐标轴旋转的情况下, 四元数连乘
的方法[7]需要41次乘法、6次除法及相应的加减法和三角函数运算, 而直接采用上述公式计算则