CATransform3D透視投影

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)。

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容