3D图形:矩阵与线性变换

由于OpenGLES的进度再度搁浅,所以准备从再次学习3D图形的深层次的知识,这一篇主要讲的是如何使用矩阵表示旋转、缩放、投影、镜像、切变,这些线性变换将会由浅入深,也算是为了后面的仿射变换做铺垫吧!接下来,我们一一看这些线性变换.

日常开发过程中旋转是一种很常见的图形变换,现在我们就对2D环境下和3D环境下的图像变换进行讲解说明.

假设现在物体现在就在原点位置,例如下图.

然后物体旋转角度为θ = 3/π,在旋转当中经常被认为逆时针为正方向,顺时针为负方向,那么对于基向量 p , q 是怎么变化的呢?如下图所示.这里我直接用绘图工具了,图片粗糙请见谅.

我们从图片中可以看到旋转后的新向量 p1 , q1 的值(当然了,实际上是根据三角函数计计算出来的),然后通过这两个值我们就可以构造出如下通用旋转矩阵.通过下面的矩阵,我们是不是很熟悉呢?有没有仿射变换的赶脚.不要着急,我们慢慢看.

</b>

在3D的环境下,我们讨论的不再是绕点旋转,而是绕轴旋转.虽然是绕轴旋转,我们也要定义出正负方向来.在左右坐标系中的情况是有所不同的,什么?不知道左右坐标系如何定义的?那么看下图所示.

那么在我们的坐标系中如何判断出正负方向呢?比如我们在左手坐标系中需要使用的左手法则俩判断正负方向,而在右手坐标系中则正好相反.我们就拿在左手左边系为例,法则示意图如下所示.(左右手法则不过多解释,如果不懂请自行查看高中物理相关知识)

|左手坐标系|
|:---:|:---:|:--:|
|从哪里看|正方向|负方向|
|从轴的负端点向正端点看|逆时针|顺时针|
|从轴的正端点向负端点看|顺时针|逆时针|

上面我们了解完旋转方向了,接下来我们先看看三种特殊情况,分别绕x,y,z轴进行旋转.

我们还是来看基向量的变化,首先对于3D中的基向量 p , q , r 由于是绕x轴进行旋转的,所以说基向量 p 是没有任何变化的,变化的只有 q , r 两个基向量,假设旋转的角度θ = 3/π,那么如下图所示.

然后如果在2D中通过三角函数公式,我们可以获得以下的旋转变换矩阵.

那么绕 y , z 轴与之类似,我就不做图了,直接上公式了.

那么上面看完了三种特殊的旋转方式,接下来,我们就看一下在3D中绕任意轴旋转的情况.

如图所示,如果向量v(粉色)绕轴向量n旋转得到向量v'(粉色),我们直接如果直接观察的话是非常困难的.

但是如果我们把向量v和向量v'进行分解,然后把旋转的θ放在一个平面中来解决问题,这样,我们的旋转问题就转化为简单的2D问题了.如下图所示.

这里我要对各个向量做一下解释说明,
其中 n v 在旋转轴上的投影 (假设旋转轴为 n' ,那么 n=n'(v·n') );
v 为旋转之前的向量;
v' 为旋转之后的向量 ;
p v 垂直于 n 的分量( p' 同理);
ω 为同时垂直于 n p 的向量,长度与 p 相等.

上面基本我们把所有的向量解释了,现在已经知道的条件是向量 v 和旋转轴 n' 以及旋转角度θ要计算的是向量 v' .(怎么跟计算题似的😂)

整体的思路是这样的,我们可以使用向量 n 和向量 p' 表示向量 v' , v' = n + p' ;然后 n=n'(v·n') 以及 p'=ωsinθ+ncosθ ,这三个向量表示公式来进行表示分解.计算过程如下.(说明:由于时间原因,本人就直接用纸写了计算过程了.骚栋的字是夏练三伏 冬练三九,终究还是败了)

首先我们先对 p'=ωsinθ+pcosθ 进行解析,步骤如下

上面我们已经计算出 p' 然后带入 v' = n + p' ,计算如下所示

现在我们既然有了转换关系,那么我们就要对三个基向量 p , q , r 进项转换了,我们就拿其中 p = [1,0,0] 来举例说明.其中旋转轴向量 n' = [nx ,ny,nz] ,那么经过旋转之后的基向量p'是什么情况呢?步骤如下所示.

同样的对于基向量 q = [0,1,0] , r = [0,0,1] ,我们使用公式 v' = (n' x v)sinθ +(v - ( v·n')n')cosθ +n'(v·n') 一样求出他们转换之后的基向量.具体的过程我就不在重复了,如果向量计算记不清楚的可以查看 3D图形:向量的相关计算 ,计算结果如下.

结果上面的重重计算,我们终于得到了绕任意轴 n = [nx ,ny,nz] ,的旋转矩阵.
如下图所示.


相比于旋转而言,缩放比较简单,(缩放的定义我就不过度的解释了),我们就从2D的环境和3D环境以及沿着任意方向缩放三个方面来看缩放这个知识点.

2D的环境和3D环境沿着坐标轴缩放

如果沿着坐标轴进行缩放,那么每一个坐标轴都有缩放因子,所以2D环境下有两个缩放因子Kx和Ky,那么基向量 p和q 根据缩放因子的影响,我们可以得到下面结论.

然后根据变换,我们就可以得到在2D环境下的缩放矩阵.如下所示.

那么,通过2D环境下的缩放矩阵,我们可以得到3D环境下的缩放矩阵.


沿着任意方向缩放
上面我们把在2D的环境和3D环境的缩放情况说明了一下,接下来我们看一下沿着任意方向缩放的情况,如图所示.(假设在向量 n 方向上的缩放因子为k)

在图中 n 为缩放方向, v 为缩放之前的向量, v' 为缩放之后的向量, a a' 分别为 v和v' 垂直于缩放方向的分量, b b' 分别为 v和v' 在缩放方向上的投影.

思路是这样的,
首先 v 只是在 n 的方向上进行了缩放,所以缩放前后 a 是没有任何改变的,也就是说, a = a' ;
b b' 分别为 v和v' 在缩放方向上的投影,所以会有 b = (v·n)n b' = (v'·n)n ;
然后,再就是通过向量的加减法,我们可以得知, v = a +b v' = a' +b' ;

上面是三个具体的条件,我们根据条件用 n,v,k 来表示 v' .具体的计算过程如下.

上面我们已经得到了 v' 的表达式,然后我们就需要对各个基向量进行计算了,这里使用的是基向量 p = [1,0],具体的计算过程如下所示.

同理,基向量 q 与之类似,结果如下所示.

那么,在2D中的缩放矩阵如下所示.

3D因为原理一样就不在推导了,在3D中的缩放矩阵结果如下所示.


一般来说呢, 投影 就意味着降维操作.这篇博客主要研究的是正交投影.透视投影将在后面的博客中体现,但是我还是要那两张图片给来说明一下正交投影和透视投影的不同.简单点说正交投影原来的点和投影点的直线相互平行,但是透视投影所有的投影线会相交于一点.如下所示.

接下来我们就直接看看2D和3D环境下的正交投影矩阵.

</b>
当然了我们也是可以向 任意直线或者平面 投影,直线或者平面必须通过原点的.然后我们利用缩放的结果,有如下的结果.


镜像 是一种变换,其作用就是按照直线或者平面"翻折".如图所示.

镜像 和投影都是可以通过缩放矩阵进行变换的,我们只需要把缩放矩阵的缩放因子设置为-1即可,那么在2D和3D情况下的沿着任意轴的镜像矩阵如下所示.


切变是一种坐标系"扭曲"变换,非均匀的拉伸它,切变的时候角度会发生改变,但是面积(2D)或者是体积(3D)不会发生改变.

具体的解释意义如下所示.

那么在3D环境下的是切变的形式又是如何的呢?如下所示.

当然了,其实切变并不常用.😄


经过两三天的写作,整理学习,总算是写完了旋转、缩放、投影、镜像、切变的线性变换,学习3D图形更多的是需要一个本子和一支笔,只有不断的演算才能真正的掌握这些.如果你喜欢骚栋,请继续关注,下一篇我将对矩阵的其他知识以及齐次矩阵的相关知识做研究整理.

最后还是要附上<<3D数学基础 图形与游戏开发>>的pdf版的传送门来结束线性变换的相关知识.



  • 3D鍥惧舰:鐭╅樀涓庣嚎鎬у彉鎹
    绛旓細闀滃儚 鍜屾姇褰遍兘鏄彲浠ラ氳繃缂╂斁鐭╅樀杩涜鍙樻崲鐨,鎴戜滑鍙渶瑕佹妸缂╂斁鐭╅樀鐨勭缉鏀惧洜瀛愯缃负-1鍗冲彲,閭d箞鍦2D鍜3D鎯呭喌涓嬬殑娌跨潃浠绘剰杞寸殑闀滃儚鐭╅樀濡備笅鎵绀. 鍒囧彉鏄竴绉嶅潗鏍囩郴"鎵洸"鍙樻崲,闈炲潎鍖鐨勬媺浼稿畠,鍒囧彉鐨勬椂鍊欒搴︿細鍙戠敓鏀瑰彉,浣嗘槸闈㈢Н(2D)鎴栬呮槸浣撶Н(3D)涓嶄細鍙戠敓鏀瑰彉. 鍏蜂綋鐨勮В閲婃剰涔夊涓嬫墍绀. 閭d箞鍦3D鐜涓嬬殑鏄垏鍙...
  • 绾挎у彉鎹㈠拰鐭╅樀
    绛旓細涓浜涘吀鍨嬬殑2缁村疄骞抽潰涓婄殑绾挎у彉鎹瀵瑰钩闈㈢煝閲忥紙鍥惧舰锛夐犳垚鐨勬晥鏋滐紝浠ュ強瀹冧滑瀵瑰簲鐨2缁鐭╅樀銆傚叾涓瘡涓嚎鎬у彉鎹㈠皢钃濊壊鍥惧舰鏄犲皠鎴愮豢鑹插浘褰紱骞抽潰鐨勫師鐐(0, 0)鐢ㄩ粦鐐硅〃绀猴細
  • 浠涔堟槸鐭╅樀鐨绾挎у彉鎹?
    绛旓細1銆绾挎у彉鎹鐨勫畾涔夛細绾挎у彉鎹㈡槸鎸囧鍚戦噺绌洪棿涓殑鍚戦噺杩涜鎿嶄綔锛屽苟婊¤冻涓や釜鍩烘湰鎬ц川锛氫繚鎸佸悜閲忓姞娉曡繍绠楀拰鏍囬噺涔樻硶杩愮畻銆傛崲鍙ヨ瘽璇达紝瀵逛簬鍚戦噺绌洪棿涓殑浠绘剰涓や釜鍚戦噺u鍜寁锛屼互鍙婁换鎰忔爣閲廲锛岀嚎鎬у彉鎹搴旇婊¤冻浠ヤ笅绛夊紡锛歍(u + v) = T(u) + T(v) 鍜 T(cu) = cT(u)銆2銆佺煩闃佃〃绀猴細瀵逛簬涓涓嚎鎬у彉鎹...
  • 绾挎т唬鏁扮殑鏈川#0x01 - 鐭╅樀涓庣嚎鎬у彉鎹
    绛旓細Topic锛氱嚎鎬у彉鍖栫殑鎬濇兂浠ュ強瀹冨悓鐭╅樀鐨勫叧绯 绾挎у彉鎹鏄搷绾电┖闂寸殑涓绉嶆墜娈碉紱 鐭╅樀路鍚戦噺涔樻硶灏辨槸璁$畻绾挎у彉鎹綔鐢ㄤ簬缁欏畾鍚戦噺鐨勪竴绉嶉斿緞锛涘弽渚嬪涓嬶細杩樻湁涓绉嶇壒娈婃儏鍐碉紝灏辨槸鍘熺偣娌″姩锛岀洿绾夸篃渚濇棫鏄洿绾匡紝浣嗘槸鐩寸嚎闂翠笉鏄瓑璺濈殑锛屽洜姝ゅ瑙掔嚎鍙樹负闈炵嚎鎬х殑浜嗭紝濡備笅鍥炬墍绀猴細鎴戜滑浜岀淮骞抽潰鎺ヨЕ鏈澶氱殑灏辨槸鏍囧噯...
  • OpenGL:涓夌淮鏁板鍩虹鍧愭爣绯汇佸悜閲忋鐭╅樀
    绛旓細鐭╅樀鐨勫嚑浣曟剰涔锛氱煩闃寰堟娊璞★紝涓鑸潵璇达紝鏂归樀锛堣鍒楁暟鐩哥瓑鐨勭煩闃碉級鑳芥弿杩颁换鎰忕嚎鎬у彉鎹備笅闈㈠皢鍏蜂綋璁茶堪鐭╅樀鍜岀嚎鎬у彉鎹鐨勫叕寮忋傚叚銆佺煩闃靛拰绾挎у彉鎹 1.鏃嬭浆 2.缂╂斁 浠ュ崟浣嶅悜閲弉涓虹缉鏀炬柟鍚戯紝k涓哄洜瀛愮殑缂╂斁鐭╅樀涓猴細3.姝d氦鎶曞奖 鍚戝瀭鐩翠簬鍗曚綅鍚戦噺n鐨勫钩闈㈢殑鎶曞奖鐭╅樀涓猴細4.闀滃儚 閫氳繃鍘熺偣涓斿瀭鐩翠簬n鐨勫钩闈㈢殑闀滃儚...
  • 鐭╅樀鍙樻崲鍜岀嚎鎬у彉鎹鏈変粈涔堝尯鍒
    绛旓細鐭╅樀鍙樻崲鏄竴绉嶅皢涓涓悜閲忔槧灏勫埌鍙︿竴涓悜閲忕殑鏂规硶銆傚湪鐭╅樀鍙樻崲涓紝閫氳繃涔樹互涓涓煩闃碉紝鍙互瀵瑰悜閲忚繘琛屾棆杞佺缉鏀俱佹姇褰辩瓑鎿嶄綔銆傜煩闃靛彉鎹㈡槸閫氳繃鐭╅樀涔樻硶鏉ュ疄鐜扮殑銆绾挎у彉鎹鏄竴绉嶇壒娈婄殑鐭╅樀鍙樻崲锛屽畠婊¤冻涓や釜鍩烘湰鎬ц川锛氬姞娉曢棴鍚堟у拰鏁颁箻闂悎鎬с傚姞娉曢棴鍚堟ф寚鐨勬槸锛屽浜庝袱涓繘琛岀嚎鎬у彉鎹㈠悗鐨勫悜閲忥紝瀵瑰畠浠繘琛...
  • 浜岀淮绾挎у彉鎹涓庡疄浜岄樁鐭╅樀
    绛旓細鑰屾洿澶嶆潅鐨勫垏鍙鐭╅樀 </鍒欏睍绀轰簡鍏跺彉骞绘棤绌风殑榄斿姏銆傜煩闃电殑绉樺瘑锛氬彉鎹㈢殑鍩虹煶涓庨夋嫨鏈缁堬紝浜岄樁鐭╅樀鐨勭湡姝e姏閲忓湪浜庯紝瀹冧滑鑳戒互鏈绠鍗曠殑褰㈠紡锛岄氳繃鐗瑰畾鐨勫熀搴曡〃杈撅紝鎻ず绾挎у彉鎹鐨勭湡鐩搞傛瘡涓鐭╅樀閮藉搴旂潃涓涓嫭鐗圭殑鏁呬簨锛岃杩扮潃鍚戦噺绌洪棿鐨勫嚑浣曞彉鎹紝鑰屾繁鍏ユ帰绱紝灏嗘彮绀轰笁缁寸┖闂翠腑鏇翠负涓板瘜鐨勭嚎鎬у彉鎹笘鐣屻
  • 鐭╅樀琛屽垪鍙樻崲鐨勬柟娉鍜搴旂敤鏈夊摢浜?
    绛旓細涓銆佺嚎鎬т唬鏁板拰鍑犱綍瀛锛氱煩闃鐢ㄤ簬鎻忚堪鍜岃В鍐崇嚎鎬ф柟绋嬬粍锛屼緥濡傚湪鍑犱綍瀛︿腑鐢ㄤ簬琛ㄧず鍜屽彉鎹㈢偣銆佸悜閲忓拰骞抽潰銆绾挎у彉鎹鐭╅樀鍙互鎵ц鏃嬭浆銆佺缉鏀惧拰骞崇Щ绛夊嚑浣曟搷浣溿備簩銆鍥惧儚澶勭悊鍜岃绠楁満鍥惧舰瀛︼細鐭╅樀鍙樻崲鍦ㄥ浘鍍忓鐞嗕腑璧风潃鍏抽敭浣滅敤锛岀敤浜庡浘鍍忔棆杞佺缉鏀俱佸彉褰㈠拰杩囨护銆傚湪璁$畻鏈哄浘褰㈠涓紝鐭╅樀鐢ㄤ簬灏嗕笁缁村璞¤浆鎹负浜岀淮灞忓箷...
  • 绾挎у彉鎹涓鐭╅樀鐨勫叧绯
    绛旓細绾挎у彉鎹涓鐭╅樀涔嬮棿瀛樺湪鐫瀵瑰簲鍏崇郴銆傜嚎鎬у彉鎹㈡槸绾挎т唬鏁扮爺绌剁殑涓涓璞★紝鍗冲悜閲忕┖闂村埌鑷韩鐨勪繚杩愮畻鐨勬槧灏勩備緥濡傦紝瀵逛换鎰忕嚎鎬х┖闂碫锛屼綅浼兼槸V涓婄殑绾挎у彉鎹紝骞崇Щ鍒欎笉鏄疺涓婄殑绾挎у彉鎹傚绾挎у彉鎹㈢殑璁ㄨ鍙熷姪鐭╅樀瀹炵幇銆傁冨叧浜庝笉鍚屽熀鐨勭煩闃垫槸鐩镐技鐨勩侹er蟽={a鈭圴|蟽锛坅锛=胃}锛堝紡涓告寚闆跺悜閲忥級绉颁负蟽...
  • ...涓悜閲忕┖闂村埌鍙︿竴涓悜閲忕┖闂寸殑绾挎у彉鎹鐨勫悇绉鐭╅樀琛ㄧず闂
    绛旓細1銆绾挎у彉鎹細鐭╅樀鍙敤浜庤〃绀虹嚎鎬у彉鎹紝鍗充粠涓涓悜閲忕┖闂存槧灏勫埌鍙︿竴涓悜閲忕┖闂寸殑绾挎ф槧灏勩傞氳繃鐭╅樀涔樻硶锛屾垜浠彲浠ュ疄鐜板鍚戦噺鐨勭缉鏀俱佹棆杞佸钩绉荤瓑鎿嶄綔銆2銆佺郴缁熸柟绋嬬粍锛氱煩闃靛彲浠ヨ〃绀虹嚎鎬ф柟绋嬬粍銆傞氳繃瀵圭煩闃佃繘琛岃鎿嶄綔鎴栧垪鎿嶄綔锛屾垜浠彲浠ユ眰瑙g嚎鎬ф柟绋嬬粍锛屽楂樻柉娑堝厓娉曞拰鍏嬭幈濮嗘硶鍒欑瓑銆3銆佹暟鎹〃绀猴細鐭╅樀甯哥敤...
  • 扩展阅读:3d万能表 ... 福彩3d旋转矩阵工具 ... 3d万能矩阵图 ... 3d藏宝图全图 ... 3d九宫格图解法 ... 3d矩阵宝典图 藏宝图 ... 九宫图计算3d技巧 ... 三d速查表图 ... 福彩3d藏宝图图片 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网