矩陣乘法
- 矩陣C的行數(shù)等于矩陣A的行數(shù),C的列數(shù)等于B的列數(shù)。
- 乘積C的第m行第n列的元素等于矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。
矩陣變換原理
- 通過矩陣對圖層位圖進行平移、旋轉、縮放變換拯勉。
- 矩陣相乘只有在第一個矩陣的列數(shù)(column)和第二個矩陣的行數(shù)(row)相同時才有意義。
- 圖層的bitmap由點組成憔购,每個點可以對應1×4矩陣宫峦,乘以一個4×4變換矩陣,得到一個1×4矩陣玫鸟,即為變換后的結果导绷。
思考:
- 點坐標為什么要轉換為1×4矩陣?
- 變換矩陣為什么必須是4×4矩陣鞋邑?
- 如何實現(xiàn)移動诵次,縮放,旋轉枚碗?
如果只使用3×3變換矩陣:
m11, m12, m13
{x, y, z} * { m21, m22, m23 } = {x', y', z'}
m31, m32, m33
那么xˊ=x × m11 + y × m21 + z × m31
逾一,在預先不對變量系數(shù)(m11, m21, m31)做其他計算的情況下,只能實現(xiàn)在各個坐標軸的縮放
但是使用使用1×4齊次矩陣和4×4變換矩陣后肮雨,xˊ= x × m11 + y × m21 + z × m31 + 1 × m41
遵堵。比如當m11=2 m21=0 m31=0 m41=8時,可同時實現(xiàn)向x軸正方向放大2倍,在沿著x軸正方向平移8個單位
使用1×4矩陣陌宿,是相對點的三維坐標進行齊次坐標锡足。齊次坐標就是將一個原本是n維的向量用一個n+1維向量來表示:
齊次坐標變換 (x, y, z) -> (x × h, y × h, z × h, h) -> (xˊ, yˊ, zˊ, h)
齊次坐標還原 (xˊ, yˊ, zˊ, h) -> (x / h, y / h, z / h, 1) -> (x, y, z)
引入齊次坐標的目的主要是合并矩陣運算中的乘法和加法。
基本變換矩陣
矩陣就是利用矩陣內(nèi)特殊位置的值壳坪,在做矩陣乘法時钉稍,達到對點坐標進行變換借嗽,下面時常用變換矩陣
平面仿射變換
CGAffineTransform中的“仿射”的意思是無論變換矩陣用什么值,圖層中平行的兩條線在變換之后任然保持平行,即純粹2D變換岂昭,沒有透視效果送矩。
先來觀察平面變換中的矩陣結構:
struct CGAffineTransform
{
CGFloat a, b, c, d;
CGFloat tx, ty;
};
為了把二維圖形的變化統(tǒng)一在一個坐標系里登颓,引入了齊次坐標的概念名段,即把一個圖形用一個三維矩陣表示,其中第三列總是(0,0,1)发框,用來作為坐標系的標準躺彬。所以所有的變化都由前兩列完成。
以上參數(shù)在矩陣中的表示為:
|a b 0|
|c d 0|
|tx ty 1|
運算原理:原坐標設為(X,Y,1);
|a b 0|
[X梅惯,Y, 1] |c d 0| = [aX + cY + tx bX + dY + ty 1] ;
|tx ty 1|
可見宪拥,仿射變換忽略了z坐標,實現(xiàn)了2D變換:旋轉铣减、平移江解、縮放。但是要實現(xiàn)3D變換的話徙歼,還要了解透視原理。
透視效果
在真實世界中鳖枕,當物體遠離我們的時候魄梯,由于視角的原因看起來會變小,即透視效果--近大遠小宾符。
那該如何產(chǎn)生近大遠小呢酿秸?
要達到近大遠小目的,需要在系統(tǒng)做垂直投影前魏烫,先對圖層做一次視點變換辣苏。如此垂直投影別是視點觀察到的近大遠小的物體。
Layer的z軸的位置則是通過anchorPoint來指定的哄褒,所謂的anchorPoint(錨點)就是在變換中保持不變的點稀蟋,也就是某個Layer在變換中的原點,xyz三軸相交于此點。下圖為錨點常用位置
在原點(0 , 0)沿著Y軸的正方向呐赡,得到如圖坐標系, 首先在Z軸選擇一個視點
添加兩個child layer退客,觀察區(qū)域便能看到兩個child layer頂部的短線,綠色在前,紅色在后萌狂,且長度相等
通過視點對頂部档玻,作相對X軸的投影,得到視點投影
綠線茫藏、紅線本來長度相等误趴,通過視點投影后造成了“近大遠小”的透視效果
所以只要在iOS垂直投影前,對layer作視點投影變換务傲,就能得到透視效果
實踐透視原理
使用上圖的坐標系凉当,紅點為觀察區(qū)域一點,對紅點做視點投影树灶,得到綠點纤怒,同時對紅點做z軸的垂直線得到黑點。
使用相似三角形原理天通,得到如下公式
簡化公式后泊窘,得到 方程1 ,綠點x軸的值只于視點z軸值有關
對紅點做h = 1的齊次坐標(6, 0, 5, 1)像寒,通過乘以一個矩陣烘豹,得到變換后的綠點的齊次矩陣
變換后的矩陣只與視點z軸值有關,所以只設置m34,對(6, 0, 5, 1 + 5r)還原得到 方程2
結合 方程1 和 方程2 诺祸,最后得到
至此只要修改變換矩陣m34的值為視點z軸值携悯,便能得到相應的視點投影變換矩陣