python三维数组旋转_【转】【矩阵】三维坐标旋转矩阵算法⼀般来说,⽅阵能描述任意线性变换。线性变换保留了直线和平⾏线,但原点没有移动。线性变换保留直线的同时,其他的⼏何性质如长度、⾓度、⾯积和体 积可能被变换改变了。从⾮技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系。
矩阵是怎样变换向量的
向量在⼏何上能被解释成⼀系列与轴平⾏的位移,⼀般来说,任意向量v都能写成“扩展”形式:
另⼀种略有差别的形式为:
注意右边的单位向量就是x,y,z轴,这⾥只是将概念数学化,向量的每个坐标都表明了平⾏于相应坐标轴的有向位移。
让我们将上⾯的向量和重写⼀遍,这次分别将p、q、r定 义为指向+x,+y和+z⽅向的单位向量,如下所⽰:
v = xp + yq + zr
现在,向量v就被表⽰成向量p,q,r的 线性变换了,向量p,q,r称作基向量。这⾥ 基向量是笛卡尔坐标
轴,但事实上,⼀个坐标系能⽤任意3个基向量定义,当然这三个基向量要线性⽆关(也就是不在同⼀平⾯上)。以p、q、r为 ⾏构建⼀个3 x 3矩阵M,可得到如下矩阵:
⽤⼀个向量乘以该矩阵,得到:
如果把矩阵的⾏解释为坐标系的基向量,那么乘以该矩阵就相当于执⾏了⼀次坐标转换,如果aM=b, 我们就可以说,M将a转换到b。
从这点看,术语“转换”和“乘法”是等价的。
坦率地说,矩阵并不神秘,它只是⽤⼀种紧凑的⽅式来表达坐标转换所需的数**算。进⼀步,⽤线性代数操作矩阵,是⼀种进⾏简单转换或导出更复杂转换 的简便⽅法。
矩阵的形式:
基向量[1, 0, 0], [0, 1, 0], [0, 0, 1]乘以任意矩阵M:
⽤基向量[1, 0, 0]乘以M时,结果是M的第1⾏。其他两⾏也有同样 的结果,这是⼀个关键的发现:矩阵的每⼀⾏都能解释为转换后的基向量。
这个强有⼒的概念有两条重要性质:
1、有了⼀种简单的⽅法来形象化解释矩阵所代表的变换。
2、有了反向建⽴矩阵的可能 ---- 给出⼀个期望的变换(如旋转、缩放等),能够构造⼀个矩阵代表此变换。我们所要做的⼀切就是计算基向量的变换,然后将变换后的基向量填⼊矩阵。
⾸先来看看2D例⼦,⼀个2 x 2矩阵:
这个矩阵代表的变换是什么?⾸先,从矩阵中抽出基向量p和q:
p = [2  1]
q = [-1  2]
图7.1以“原”基向量(x轴,y轴)为参考,在笛卡尔平⾯中展⽰了这些向量。
如图7.1所⽰,x基向量变换⾄上⾯的p向量,y基向量变换⾄q向量。所以 2D中想象矩阵的⽅法就是想象由⾏向量构成的“L”形状。这个例⼦中,能够很清楚的看到,M代表的部分变换是逆时针旋 转26度。
当然,所有向量都被线性变换所影响,不只是基向量,从“L”形状能够得到变换最直观的印象,把基向量
构成的整个2D平⾏四边形画完整有助于进⼀步看 到变换对其他向量的影响,如图7.2所⽰:
平⾏四边形称作“偏转盒”,在盒⼦中画⼀个物体有助于理解,如图 7.3 所⽰:
很明显,矩阵M不仅旋转坐标系,还会拉伸它。
这种技术也能应⽤到3D转换中。2D中有两个基向量,构成"L"型;3D中有三个基向量,它们形成⼀个”三脚架“。⾸先,让我们展⽰出⼀个转换前的 物品。图7.4展⽰了⼀个茶壶,⼀个⽴⽅体。基向量在”单位“向量处。
(为了不使图形混乱,没有标出z轴基向量[0, 0, 1],它被茶壶和⽴⽅体挡住了。)
现在,考虑以下3D变换矩阵:
从矩阵的⾏中抽出基向量,能想象出该矩阵所代表的变换。变换后的基向量、⽴⽅体、茶壶如图7.5所⽰:
这个变换包含z轴顺时针旋转45度和不规则缩放,使得茶壶⽐以前”⾼“。注意,变换并没有影响到z轴,因为矩阵的第三⾏是[0, 0 , 1]。
我们可以通过让⽐例因⼦k按⽐例放⼤或缩⼩来缩放物体。如果在各⽅向应⽤同⽐例的缩放,并且沿原点“膨胀”物体,那么就是均匀缩放。均匀缩放可以保 持物体的⾓度和⽐例不变。如果长度增加或减⼩因⼦k,则⾯积增加或减⼩k^2。在3D中,体积将增加或减⼩ k^3。
如果需要“挤压”或"拉伸"物体,在不同的⽅向应⽤不同的因⼦即可,这称作⾮均匀缩放。⾮均匀缩放时,物体⾓度将发⽣变化。视各⽅向缩放因⼦的不 同,长度、⾯积、体积的变化因⼦也各不相同。
如果|k|<1,物体将“变短”;如果|k|>1,物体将“变长”,如果k = 0,就是正交投影,如果k < 0就是镜像。
应⽤⾮均匀缩放的效果类似于切变,事实上,⾮均匀缩放和切变和很难区分的。
沿坐标轴的缩放
最简单的缩放⽅法是沿着每个坐标轴应⽤单独的缩放因⼦,缩放是沿着垂直的轴(2D中)或平⾯(3D中)进⾏的。如果每个轴的缩放因⼦相同,就是均匀 缩放,否则是⾮均匀缩放。
2D中有两个不同的缩放因⼦,Kx和Ky,图8.13展⽰了应⽤不同缩放因⼦后的情况。
凭直觉就可知道,基向量p,q由相应的缩放因⼦单独影响:
p' = Kxp = Kx [1  0] = [Kx  0]
q' = Kyq = Ky [0  1] = [0  Ky]
⽤基向量构造矩阵,结果如公式8.6所⽰:
对于3D,需要增加第三个缩放因⼦Kz,3D缩放矩阵如公式8.7所⽰:
沿任意⽅向缩放
我们可以不依赖于坐标系⽽沿任意⽅向进⾏缩放,设n为平⾏于缩放⽅向的单位向量,k为缩放因⼦,缩放沿穿过原点 并平⾏于n的直线(2D 中)或平⾯(3D中)进⾏。
我们需要推导出⼀个表达式,给定向量v,可以通过v,n和 k来计算v'。为了做到这⼀点,将v分解为两个分量,v|| 和v⊥,分别平⾏于n和垂直于n,并满⾜v =v|| + v⊥。v||是v在n上 的投影,由 (v . n)n 可以得到 v||。 因为v⊥垂直于n,它不会被缩放操作影响。因
此,v' = v||' + v⊥,剩下的问题就是怎样得到v||'。 由于v||平⾏于缩放⽅向,v||'可以由公式kv|| 得出,如图8.14所⽰:
总结已知向量并进⾏代换,得到:
既然我们知道了怎样对任意向量进⾏缩放,当然也就可以计算缩放后的基向量。这⾥只详细列出2D中的⼀个基向量的求法,其余的基向量依次类推。我们只 给出其结果(注意下⾯采⽤列向量形式只是为了使等式的形式好看⼀些。)
通过基向量构造矩阵,得到以单位向量n为缩放⽅向,k为因⼦的缩放矩阵,如公式8.8所⽰:
3D中,基向量为:
以单位向量n为缩放⽅向,k为因⼦的3D缩放矩阵如公式8.9所⽰:
⼀般来说,投影意味着降维操作,有⼀种投影⽅法是在某个⽅向上⽤0作为缩放因⼦。这种情况下,所有点都被拉平⾄垂直的轴(2D)或平⾯(3D)上。 这种类型的投影称作正交投影(或者平⾏投影),因为从原来的点到投影点的直线相互平⾏。
向坐标轴或平⾯投影
最简单的投影⽅式是向坐标轴(2D)或平⾯(3D)投影,如图8.15所⽰:
向坐标轴或平⾯投影在实际变换中不常发⽣,⼤多数情况是向低维的变换赋值,且要抛弃维数时。例如,将3D点赋值给2D点,抛弃z分量,只复制x和 y。
通过使垂直⽅向上的缩放因⼦为零,就能向坐标轴或平⾯投影。考虑到完整性,下⾯列出这些变换矩阵,见公式8.10 - 8.14。
向任意直线或平⾯投影
也能向任意直线或平⾯投影,像往常⼀样,由于不考虑平移,这些直线或平⾯必须通过原点。投影由垂直于直线或平⾯的单位向量n定 义。
通过使该⽅向的缩放因⼦为0能够导出向任意⽅向投影的矩阵,2D中的情况如公式8.15所⽰:
记住这⾥n垂直于投影直线,⽽不是平⾏。3D中,向垂直于n的平⾯投影的矩 阵如公式8.16所⽰:
镜像
镜像(也叫做反射)是⼀种变换,其作⽤是将物体沿直线(2D中)或平⾯(3D中)“翻折”,图8.16展⽰了镜像的效果。
使缩放因⼦为-1能够很容易地实现镜像变换,设n为2D单位向量,公式8.17所⽰的矩阵将沿通过原点且垂直于n的 反射轴来进⾏镜像变换。
3D中,⽤反射平⾯代替直线。公式8.18中的矩阵将沿通过原点且垂直于n的平⾯来进⾏镜像变换:
注意⼀个物体只能“镜像”⼀次,如果再次镜像(当沿不同的轴或平⾯的时候),物体将翻回“正⾯”(⽤⼀张纸来想象),这和在原位置旋转物体的效果⼀ 样。
切变
python获取数组长度切变是⼀种坐标系“扭曲”变换,⾮均匀地拉伸它。切变的时候⾓度会发⽣变化,但令⼈惊奇的是⾯积和体积却保持不变。基本思想是将某⼀坐标的乘积加到 另⼀个上。例如,2D中将y乘以某个因⼦然后加到x上,得到 x' = x + sy,如图8.17所⽰:
实现这个切变变换的矩阵为:
变换的组合
设想世界中有⼀个任意⽅向、任意位置的物体,我们要把它渲染到任意⽅向、任意位置的摄像机中。为了做到这⼀点,必须将物体的所有顶点从物体坐标系变 换到世界坐标系,接着再从世界坐标系变换到摄像机坐标系。其中的数学变换总结如下:
矩阵乘法满⾜结合律,所以我们能⽤⼀个矩阵直接从物体坐标系变换到摄像机坐标系:
这样就能在渲染的循环外先将所有矩阵组合起来,使循环内作矩阵乘法的时候只需要和⼀个矩阵相乘即可(物体有很多顶点,省⼀次矩阵乘法就会提⾼不少效 率),如下:
所以矩阵组合从代数⾓度看是利⽤了矩阵乘法的结合律。矩阵的⾏向量就是变换后的基向量,这在多个变换的情况下也是成⽴的。考虑矩阵乘法AB, 结果中的每⼀⾏都是A中相应的⾏与矩阵B相乘的结果。换⾔之,设a1, a2, a3为A的⾏,矩阵乘法能够写为:
这使得结论更加清晰,AB结果中的⾏向量确实是对A的基向量进⾏B变 换的结果。
变换分类
变换的类别并不是互斥的,也不存在⼀定的“次序”或“层次”使得某⼀类⽐另⼀类多或少⼀些限制。
当讨论⼀般意义上的变换时,我们将使⽤类似的术语:映射或函数。在最⼀般的意义上,映射就是⼀种简单的规则,接受输⼊,产⽣输出。我们把从a到b的F映 射记作F(a) = b。
线性变换
在数学上,如果满⾜下式,那么映射F(a)就是线性的:
F(a + b) = F(a) + F(b)  以及  F(ka) = kF(a)
如果映射F保持了基本运算:加法和数量乘,那么就可以称该映射为线性的。在这种情况下,将两个向
量相加然后再进⾏变换得到的结果和先分别进⾏变换再 将变换后的向量相加得到的结果相同。同样,将⼀个向量数量乘再进⾏变换和先进⾏变换再数量乘的结果也是⼀样的。
这个线性变换的定义有两条重要的引理:
(1) 映射F(a) = aM,当M为 任意⽅阵时,说映是⼀个线性变换,这是因为:
F(a + b) = (a + b)M = aM + bM = F(a) + F(b)
F(ka) = (ka)M = k(aM) = kF(a)
(2) 零向量的任意线性变换的结果仍然是零向量。(如果F(0) = a,a ≠ 0。那么F不可能是线性变换。因为F(k0) = a,但F(k0) ≠
kF(0)), 因此线性变换不会导致平移(原点位置上不会变化)。
在某些⽂献中,线性变换的定义是平⾏线变换后仍然是平⾏线。⼤多数情况下它是对的,但有⼀个⼩⼩的例外:投影(当⼀条直线投影后变成⼀个点,能认为 这个点 平⾏于什么?)除了这点理论上的例外,这种定义是正确的。线性变换可能造成“拉伸”,但直线不会”弯折“,所以平⾏线仍然保持平⾏。
仿射变换
仿射变换是指线性变换后接着平移。因此仿射变换的集合是线性变换的超集,任何线性变换都是仿射变换,但不是所有仿射变换都是线性变换。
任何具有形式 v' = vM + b的 变换都是仿射变换。
可逆变换
如果存在⼀个逆变换可以”撤销“原变换,那么该变换是可逆的。换句话说,如果存在逆变换G,使得G(F(a)) = a,对于任意a,映射F(a)是可逆的。
存在⾮仿射变换的可逆变换,但暂不考虑它们。现在,我们集中精⼒于检测⼀个仿射变换是否可逆。⼀个仿射变换就是⼀个线性变换加上平移,显然,可以⽤ 相反的量”撤销“平移部分,所以问题变为⼀个线性变换是否可逆。
显然,除了投影以外,其他变换都能”撤销“。当物体被投影时,某⼀维有⽤的信息被抛弃了,⽽这些信息时不可能恢复的。因此,所有基本变换除了投影都 是可逆的。
因为任意线性变换都能表达为矩阵,所以求逆变换等价于求矩阵的逆。如果矩阵是奇异的,则变换不可逆;可逆矩阵的⾏列式不为0。
等⾓变换
如果变换前后两向量夹⾓的⼤⼩和⽅向都不改变,该变换是等⾓的。只有平移,旋转和均匀缩放是等⾓变换。等⾓变换将会保持⽐例不变,镜像并不是等⾓变 换,因为尽管两向量夹⾓的⼤⼩不变,但夹⾓的⽅向改变了。所有等⾓变换都是仿射和可逆的。
正交变换
术语“正交”⽤来描述具有某种性质的矩阵。正交变换的基本思想是轴保持互相垂直,⽽且不进⾏缩放变换。
平移、旋转和镜像是仅有的正交变换。长度、⾓度、⾯积和体积都保持不变。(尽管如此,但因为镜像变换被认为是正交变换,所以⼀定要密切注意⾓度、⾯ 积和体积的准确定义)。
正交矩阵的⾏列式为1或者负1,所有正交矩阵都是仿射和可逆的。
刚体变换
刚体变换只改变物体的位置和⽅向,不包括形状。所有长度、⾓度、⾯积和体积都不变。平移和旋转是仅有的刚体变换,镜像并不被认为是刚体变换。刚体变 换也被称作正规变换,所有刚体变换都是正交、等⾓、可逆和仿射的,某些刚体变换旋转矩阵的⾏列式为1。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。