iOS實現3D旋轉
最近看到了一個3D旋轉的動畫,就想著自己去實現以下。那麼,接下來就通過這邊文章記錄以下學習過程,慢慢深入瞭解以下3D旋轉。
一、如何旋轉
每個View都在系統的座標系中,就手機螢幕來說,左上角為 (0 , 0),向右橫向的為X軸正方向,向下縱向的為Y軸正方向,垂直於手機螢幕的方向既Z軸方向。
所以Z軸的旋轉屬於平面上的旋轉,實現3D效果的前提就是有X軸或者Y軸的參與。
二、沿著Y軸旋轉
先看一下CATransform3DMakeRotation的定義:
CA_EXTERN CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
angle:角度 x,y,z分別代表是三個方向的座標
按照這個思路,於是我寫下如下的程式碼:
CATransform3D rotate = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);
self.imageView.layer.transform = rotate;
執行之後可以發現,imageView 並沒有出現3D效果,只是單純的在Y軸縮短了一些。為何會出現這樣的效果?
查資料後發現,原來在CALayer的顯示系統中,預設使用的是正交投影,沒有遠小近大效果,所以我們對 imageView 的旋轉操作,只能造成Y軸上的縮放。而無法觀察到3D 的效果。
其實這個時候 imageView 已經沿著Y軸旋轉了 M_PI/6 ,但只是我們無法直接觀察到這種效果。
三、新增3D效果
這時候我們需要用到透視投影。
先看每個矩陣裡數字代表的含義:
struct CATransform3D
{
CGFloat m11(x縮放), m12(y切變), m13(旋轉), m14();
CGFloat m21(x切變), m22(y縮放), m23(), m24();
CGFloat m31(旋轉), m32(), m33(), m34(透視效果);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};
我們所需要的正是 m34 。
構造一個旋轉矩陣
CATransform3D rotate = CATransform3DMakeRotation(M_PI/6, 0, 1, 0);
構造一個透視矩陣
其中:M34屬性 控制透視效果
正的值向下(左)方往裡縮放 負的值上(右)方往裡縮放
disZ 控制透視的強度 數字越小 深度越大 拉伸效果越明顯
CGFloat disZ = 200;
CATransform3D scale = CATransform3DIdentity;
scale.m34 = -1.0f/disZ;
然後把兩個矩陣相乘 旋轉矩陣*透視矩陣
CATransform3D transform = CATransform3DConcat(rotate, scale);
把最後的結果賦給 imageView 的 layer 的 transform 。
self.imageView.layer.transform = transform;
執行起來,具有3D效果的一張圖就展示在我們的眼前了,嘖嘖,是不是挺簡單。
四、控制旋轉中心軸
如果通過角度的遞增,給我們的3D旋轉加一個動畫,我們就會明顯的看到,預設的以平行於Y軸的 imageView 的中心軸進行旋轉。那麼如果讓我們 imageView 以自己的左邊線進行旋轉呢?
其實也很簡單,旋轉是以layer的錨點為中心進行旋轉的。預設是 (0.5 , 0.5) 。我們只需要改變錨點的位置就好了。
image.layer.anchorPoint = CGPointMake(0, 0.5);
相關文章
- php實現圖片旋轉PHP
- 影片直播app原始碼,純JS實現旋轉木馬/3d相簿APP原始碼JS3D
- 影像旋轉的FPGA實現(一)FPGA
- 超級炫酷的3D旋轉動態圖——Python程式碼實現3DPython
- 簡單的css3頭像旋轉與3D旋轉效果CSSS33D
- 32.qt quick-模仿QQ登入介面實現3D旋轉(Rotation、Flipable)QTUI3D
- 滑鼠懸浮div實現旋轉效果
- iOS螢幕旋轉解決方案iOS
- 3D旋轉矩陣的推導3D矩陣
- 滑鼠懸浮實現環形旋轉效果
- 不適用imrotate 的影像旋轉實現
- ARFoundation - 實現物體旋轉, 平移,縮放
- HTML+CSS實現太極旋轉效果HTMLCSS
- css3實現橢圓軌跡旋轉CSSS3
- CSS3立方體3D旋轉效果CSSS33D
- iOS 面向協議封裝全屏旋轉功能iOS協議封裝
- [轉]旋轉矩陣:點旋轉和座標系旋轉矩陣
- ios一句程式碼搞定螢幕旋轉iOS
- iOS Tabbar中間新增凸起可旋轉按鈕iOStabBar
- 用html5實現圖片的旋轉--照片牆HTML
- 使用RxJava實現ImageView的拖動、旋轉和縮放RxJavaView
- iOS實現反轉二叉樹iOS二叉樹
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- Android 使用graphics.Camera類實現自定義旋轉飄落Android
- 【CV】三維空間的旋轉問題(Rotation in 3D space)3D
- 旋轉字串字串
- 旋轉相簿
- 將圖片旋轉(這裡不是旋轉imageView)View
- Python3實現旋轉陣列的3種演算法Python陣列演算法
- 面試:Java 實現查詢旋轉陣列的最小數字面試Java陣列
- 大角度非迭代的空間座標旋轉C#實現C#
- 三維座標系旋轉——旋轉矩陣到旋轉角之間的換算矩陣
- css3帶你實現3D轉換效果CSSS33D
- AVL樹旋轉
- (五)旋轉影像
- LeetCode:旋轉影像LeetCode
- MXRotationManager, 一行程式碼控制iOS裝置旋轉方向UIInterfaceOrientationMask行程iOSUI
- iOS仿抖音點贊動畫、波浪圖、主張圖、3D旋轉、圖片處理、播放器等原始碼iOS動畫3D播放器原始碼
- HTML+CSS實現選單的3D翻轉特效HTMLCSS3D特效