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);
相關文章
- 如何實現圖片的3D旋轉,而且是不停旋轉?3D
- CSS3實現的3D旋轉效果CSSS33D
- three.js實現的地球3D旋轉效果JS3D
- css3實現的3D立體旋轉效果CSSS33D
- css3實現的立方體3D旋轉效果CSSS33D
- 基於HT for Web向量實現3D葉輪旋轉Web3D
- CSS3實現的3D旋轉程式碼例項CSSS33D
- | / - 的旋轉效果實現(轉)
- CSS 3D旋轉效果CSS3D
- three.js實現的3D球狀拖動旋轉效果JS3D
- php實現圖片旋轉PHP
- 影片直播app原始碼,純JS實現旋轉木馬/3d相簿APP原始碼JS3D
- 基於HTML5 WebGL實現3D飛機葉輪旋轉HTMLWeb3D
- iOS之實現3D TouchiOS3D
- 影像旋轉的FPGA實現(一)FPGA
- SVG實現的圓環旋轉效果SVG
- javascript 3D旋轉滾動效果JavaScript3D
- iOS感測器:實現一個隨螢幕旋轉的圖片iOS
- 32.qt quick-模仿QQ登入介面實現3D旋轉(Rotation、Flipable)QTUI3D
- 超級炫酷的3D旋轉動態圖——Python程式碼實現3DPython
- 簡單的css3頭像旋轉與3D旋轉效果CSSS33D
- 滑鼠懸浮div實現旋轉效果
- 3D旋轉矩陣的推導3D矩陣
- 3D旋轉效果程式碼例項3D
- CSS3 3d旋轉魔方效果CSSS33D
- iOS 監聽裝置方向旋轉(iOS 9)iOS
- css3實現橢圓軌跡旋轉CSSS3
- ARFoundation - 實現物體旋轉, 平移,縮放
- 滑鼠懸浮實現環形旋轉效果
- 不適用imrotate 的影像旋轉實現
- HTML+CSS實現太極旋轉效果HTMLCSS
- css3實現環狀旋轉效果CSSS3
- canvas實現的旋轉太極圖效果Canvas
- iOS螢幕旋轉解決方案iOS
- iOS 橫豎屏旋轉總結iOS
- 好玩的WPF第四彈:用Viewport2DVisual3D實現3D旋轉效果View3D
- 在Delphi中實現圖片的旋轉、縮放 (轉)
- css3實現的旋轉的陀螺效果CSSS3