IOS 仿射變換和3D變換

仿射變換

CGAffineTransform transform;
transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, -50, -50);  //A
transform = CGAffineTransformRotate(transform, M_PI_4);      //B
transform = CGAffineTransformTranslate(transform, 50, 50);    //C

變換后 transform = C×B×A×E。(A,B,C分別為CGAffineTransform變換函數(shù)構造的矩陣),這是由于CGAffineTransform變換函數(shù)構造的矩陣在左邊,如:
t' = CGAffineTransformTranslate(t,tx,ty),結果為:t' = [ 1 0 0 1 tx ty ] * t

4步結果如下:
t   = E;
t1 = A × t   = A × E = A;
t2 = B × t1 = B × A;
t3 = C × t2 = C × B × A;

此時 (x', y', 1) = (x, y, 1) × t = (x, y, 1) × C × B × A;
也就是說,坐標變換是按照C->B->A的順序變換的,和設置的順序正好相反。

3D變換

CG的前綴告訴我們,CGAffineTransform類型屬于Core Graphics框架,Core Graphics實際上是一個嚴格意義上的2D繪圖API,并且CGAffineTransform僅僅對2D變換有效。
在第三章中,我們提到了zPosition屬性,可以用來讓圖層靠近或者遠離相機(用戶視角),transform屬性(CATransform3D類型)可以真正做到這點,即讓圖層在3D空間內移動或者旋轉。
CGAffineTransform類似,CATransform3D也是一個矩陣,但是和2x3的矩陣不同,CATransform3D是一個可以在3維空間內做變換的4x4的矩陣(圖5.6)。

圖5.6

對一個3D像素點做CATransform3D矩陣變換和CGAffineTransform矩陣類似,Core Animation提供了一系列的方法用來創(chuàng)建和組合CATransform3D類型的矩陣,和Core Graphics的函數(shù)類似,但是3D的平移和旋轉多處了一個z參數(shù),并且旋轉函數(shù)除了angle之外多出了x,y,z三個參數(shù),分別決定了每個坐標軸方向上的旋轉:

CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)

你應該對X軸和Y軸比較熟悉了,分別以右和下為正方向(回憶第三章,這是iOS上的標準結構,在Mac OS,Y軸朝上為正方向),Z軸和這兩個軸分別垂直,指向視角外為正方向(圖5.7)。

圖5.7 X,Y,Z軸,以及圍繞它們旋轉的方向

由圖所見,繞Z軸的旋轉等同于之前二維空間的仿射旋轉,但是繞X軸和Y軸的旋轉就突破了屏幕的二維空間,并且在用戶視角看來發(fā)生了傾斜。

參考資料:https://zsisme.gitbooks.io/ios-/content/chapter5/3d-transform.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容