本文主要是介绍Cesium中的相机—方向余弦阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前面在讨论两个不同坐标系之间的转换时都是通过欧拉旋转或者四元素来定义的。今天直接给出方向余弦阵的定义和用途。
方向余弦的定义
方向余弦是指在解析几何里,一个向量的三个方向余弦分别是这向量与三个坐标轴之间的角度的余弦。
如下图中,矢量A与坐标系三个轴 i , j , k i,j,k i,j,k的夹角为 α , β , γ \alpha,\beta,\gamma α,β,γ,则矢量A的方向余弦就是:
[ cos ( α ) , cos ( β ) , cos ( γ ) ] [\cos(\alpha),\cos(\beta),\cos(\gamma)] [cos(α),cos(β),cos(γ)]
方向余弦矩阵
方向余弦矩阵是由两组不同的标准正交基的基底向量之间的方向余弦所形成的矩阵。方向余弦矩阵可以用来表达一组标准正交基与另一组标准正交基之间的关系。
使用 i b , j b , k b i_b,j_b,k_b ib,jb,kb表示直角坐标系 o x b y b z b ( b 系 ) ox_by_bz_b(b系) oxbybzb(b系)的三个坐标轴的基向量,用 i i , j i , k i i_i,j_i,k_i ii,ji,ki表示直角坐标系 o x i y i z i ( i 系 ) ox_iy_iz_i(i系) oxiyizi(i系)的三个坐标轴的基向量,则 i b , j b , k b i_b,j_b,k_b ib,jb,kb(单位向量)分别可用 i i , j i , k i i_i,j_i,k_i ii,ji,ki表示:
{ i b = ( i b ⋅ i i ) i i + ( i b ⋅ j i ) j i + ( i b ⋅ k i ) k i j b = ( j b ⋅ i i ) i i + ( j b ⋅ j i ) j i + ( j b ⋅ k i ) k i k b = ( k b ⋅ i i ) i i + ( k b ⋅ j i ) j i + ( k b ⋅ k i ) k i ( 1 ) \left\{\begin{matrix} i_b=(i_b\cdot i_i)i_i+(i_b\cdot j_i)j_i+(i_b\cdot k_i)k_i\\ j_b=(j_b\cdot i_i)i_i+(j_b\cdot j_i)j_i+(j_b\cdot k_i)k_i\\ k_b=(k_b\cdot i_i)i_i+(k_b\cdot j_i)j_i+(k_b\cdot k_i)k_i\\ \end{matrix}\right. \qquad(1) ⎩⎨⎧ib=(ib⋅ii)ii+(ib⋅ji)ji+(ib⋅ki)kijb=(jb⋅ii)ii+(jb⋅ji)ji+(jb⋅ki)kikb=(kb⋅ii)ii+(kb⋅ji)ji+(kb⋅ki)ki(1)
上式中,
[ ( i b ⋅ i i ) , ( i b ⋅ j i ) , ( i b ⋅ k i ) ] [(i_b\cdot i_i),(i_b\cdot j_i),(i_b\cdot k_i)] [(ib⋅ii),(ib⋅ji),(ib⋅ki)]为单位矢量 i b i_b ib 在坐标系 o x i y i z i ox_iy_iz_i oxiyizi的方向余弦;
[ ( j b ⋅ i i ) , ( j b ⋅ j i ) , ( j b ⋅ k i ) ] [(j_b\cdot i_i),(j_b\cdot j_i),(j_b\cdot k_i)] [(jb⋅ii),(jb⋅ji),(jb⋅ki)]为单位矢量 j b j_b jb 在坐标系 o x i y i z i ox_iy_iz_i oxiyizi的方向余弦;
[ ( k b ⋅ i i ) , ( k b ⋅ j i ) , ( k b ⋅ k i ) ] [(k_b\cdot i_i),(k_b\cdot j_i),(k_b\cdot k_i)] [(kb⋅ii),(kb⋅ji),(kb⋅ki)]为单位矢量 k b k_b kb 在坐标系 o x i y i z i ox_iy_iz_i oxiyizi 的方向余弦。
将 i b , j b , k b i_b,j_b,k_b ib,jb,kb分别在坐标系 o x i y i z i ox_iy_iz_i oxiyizi的方向余弦组成矩阵 M M M(注意,按列组成):
M = [ i b ⋅ i i j b ⋅ i i k b ⋅ i i i b ⋅ j i j b ⋅ j i k b ⋅ j i i b ⋅ k i j b ⋅ k i k b ⋅ k i ] ( 2 ) M=\begin{bmatrix} i_b\cdot i_i &j_b\cdot i_i &k_b\cdot i_i\\ i_b\cdot j_i &j_b\cdot j_i &k_b\cdot j_i\\ i_b\cdot k_i &j_b\cdot k_i &k_b\cdot k_i \end{bmatrix} \qquad(2) M=⎣⎡ib⋅iiib⋅jiib⋅kijb⋅iijb⋅jijb⋅kikb⋅iikb⋅jikb⋅ki⎦⎤(2)
则矩阵 M M M即为b系到i系的坐标变换矩阵(推导过程略)。
假设点P在b系中的坐标为 [ x b , y b , z b ] T \begin{bmatrix} x_b,y_b,z_b\end{bmatrix}^{T} [xb,yb,zb]T,在i系中的坐标为 [ x i , y i , z i ] T \begin{bmatrix} x_i,y_i,z_i\end{bmatrix}^{T} [xi,yi,zi]T,则两者通过坐标旋转矩阵 M M M联系:
[ x i y i z i ] = M ⋅ [ x b y b z b ] ( 3 ) \begin{bmatrix} x_i\\y_i \\z_i \end{bmatrix}= M\cdot\begin{bmatrix} x_b \\y_b \\z_b \end{bmatrix} \qquad(3) ⎣⎡xiyizi⎦⎤=M⋅⎣⎡xbybzb⎦⎤(3)
方向余弦的应用
之前我们通过欧拉旋转或者四元素的方式得到两个坐标系之间的坐标变换矩阵 M M M,而现在我们多了一种方法得到 M M M。
假设上式中, i i i系为原始坐标系, b b b系为相机坐标系,那么我只要知道了相机坐标系(b系)的三个坐标轴的基向量 i b , j b , k b i_b,j_b,k_b ib,jb,kb在 i i i系中的坐标(方向余弦,式1),就可以得到坐标变换矩阵 M M M(式2)。实际上只要知道两个基向量即可,剩下的用前两个基向量叉乘即可。
这篇关于Cesium中的相机—方向余弦阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!