5.2.2.1、透視投影介紹
在真實(shí)世界中,東西離我們越遠(yuǎn)看起來就越小
在等距投影中,遠(yuǎn)處的物體和近處的物體保持同樣的縮放比例
為了做一些修正,我們需要引入投影變換(又稱作z變換)來對除了旋轉(zhuǎn)之外的變換矩陣做一些修改,Core Animation并沒有給我們提供設(shè)置透視變換的函數(shù),因此我們需要手動修改矩陣值。
CATransform3D的透視效果通過矩陣中m34的值來控制。
m34用于按比例縮放X和Y的值來計算到底要離視角多遠(yuǎn)。
m34的默認(rèn)值是0,我們可以通過設(shè)置m34為(-1.0 / d)來應(yīng)用透視效果,d代表了視角相機(jī)和屏幕之間的距離,以像素為單位,那應(yīng)該如何計算這個距離呢?大概估算一個就行了。
因?yàn)橐暯窍鄼C(jī)實(shí)際上并不存在,所以可以根據(jù)屏幕上的顯示效果自由決定它放置的位置。通常500-1000就已經(jīng)很好了,但對于特定的圖層有時候更小后者更大的值會看起來更舒服,減少距離的值會增強(qiáng)透視效果,所以一個非常微小的值會讓它看起來更加失真,然而一個非常大的值會讓它基本失去透視效果。
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];// 創(chuàng)建一個新的transform
CATransform3D transform = CATransform3DIdentity;// 應(yīng)用透視
transform.m34 = - 1.0 / 500.0;// 繞Y軸旋轉(zhuǎn)45度
transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0);// 應(yīng)用到圖層上self.layerView.layer.transform = transform;
}
@end
5.2.2.2、消亡點(diǎn)
當(dāng)在透視角度繪圖的時候,遠(yuǎn)離相機(jī)視角的物體將會變小變遠(yuǎn),當(dāng)遠(yuǎn)離到一個極限距離,它們可能就縮成了一個點(diǎn),于是所有的物體最后都匯聚消失在同一個點(diǎn)。
在現(xiàn)實(shí)中,這個點(diǎn)通常是視圖的中心,于是為了在應(yīng)用中創(chuàng)建擬真效果的透視,這個店應(yīng)該聚在屏幕中點(diǎn),或者至少是包含所有3D對象的視圖中點(diǎn)。
Core Animation定義了這個點(diǎn)位于變換圖層的anchorPoint。這就是說,當(dāng)圖層發(fā)生變換時,這個點(diǎn)永遠(yuǎn)位于圖層變換之前anchorPoint的位置。
當(dāng)改變一個圖層的position,你也改變了它的消亡點(diǎn),做3D變換的時候要時刻記住,當(dāng)你視圖通過調(diào)整m34來讓它更加有3D效果,應(yīng)該首先把它放置于屏幕中央,然后通過平移來把它移動到指定位置(而不是直接改變它的position),這樣所有的3D圖層都共享一個消亡點(diǎn)。