2012-12-31 41 views
3

我正在做一個紙牌遊戲,其中顯示的是卡片躺在桌子上的透視圖。桌子和卡片都具有相同的x旋轉(45°)。隨着牌離球員越來越遠(在桌上向上移動),我希望他們變得更小。我認爲只需修改它們的z翻譯(或z尺度)就可以達到理想的效果,但它不會。核心動畫:沿着飛機移動一層

我必須移動是否在同一時間縮放它,或者有沒有辦法改變z深度並讓Core Animation爲我處理所有事情?

謝謝!

回答

8

這是東西是不「Modifying the Transform Data Structure」 in the Core Animation Programming Guide下直接記錄,除了在一個例子:

的示例清單2中示出了如何配置CATransform3D作爲透視變換。

清單2修改CATransform3D數據結構直接

CATransform3D aTransform = CATransform3DIdentity; 
// the value of zDistance affects the sharpness of the transform. 
zDistance = 850; 
aTransform.m34 = 1.0/-zDistance; 

這是怎麼回事嗎? 3D變換矩陣是一個4x4矩陣(不像您所期望的那樣是3x3矩陣)。第三行的第四列(從1開始計數,而不是零)控制沿Z軸的透視變換。將其設置爲從「相機」到Z = 0平面(您可以將其視爲屏幕)的距離的負倒數。

默認情況下,m34爲零,這意味着從相機到屏幕的距離是無窮大。在無窮遠處,每個(有限)點與相機等距,所以沒有視角。這被稱爲「正交投影」。

當您將距離設置爲較小的值(這會使m34變大)時,您將獲得日益強大的透視投影。你會想玩這個價值來找到你喜歡的人。

大多數圖層將其子層展平爲Z = 0平面。這意味着您應用於圖層的透視投影不適用於其子圖層,並且您必須設置每個子圖層的變換。

如果您不需要用戶能夠點擊特定的卡片,則應該將卡片圖層添加爲CATransformLayer的子圖層。 A CATransformLayer並不是將其子層展平爲Z = 0平面,因此您可以將透視投影轉換應用於CATransformLayer,並且您不必擔心將其應用於各個卡層。但是,CATransformLayer不支持hitTest:,因此您無法輕鬆確定觸摸事件觸摸哪些卡。

CATransformLayer Class Reference

+0

非常感謝! – RobertJoseph

+0

對於被問到很多問題的好答案。 – nielsbot

+0

寫得很好的答案。非常清楚,重點。 (投票)我希望我在看這個帖子的時候看過這篇文章。相反,我徘徊了好幾天。 –