2010-08-25 97 views

回答

23

這取決於你在做什麼軸旋轉。

繞z軸被表示爲:

a = angle in radians 
x' = x*cos.a - y*sin.a 
y' = x*sin.a + y*cos.a 
z' = z 

(cos.a sin.a 0 0) 
(-sin.a cos.a 0 0) 
(0  0 1 0) 
(0  0 0 1) 

所以角應一個= ATAN2(transform.m12,transform.m11);

繞x軸:

a = angle in radians 
y' = y*cos.a - z*sin.a 
z' = y*sin.a + z*cos.a 
x' = x 

(1 0  0 0) 
(0 cos.a sin.a 0) 
(0 -sin.a cos.a 0) 
(0 0  0  1) 

繞y軸:

a = angle in radians 
z' = z*cos.a - x*sin.a 
x' = z*sin.a + x*cos.a 
y' = y 

(cos.a 0 -sin.a 0) 
(0  1 0  0) 
(sin.a 0 cos.a 0) 
(0  0 0  1) 
+1

確保使用atan2而不是atan,因爲後者不會在正確的象限中給出角度。 – 2010-10-15 13:02:05

+0

謝謝你納德,在你回答之前,我已經回過頭來使用CALayer的affineTransform屬性將Transform3D轉換成AffineTransform,然後從這個計算中獲得角度:http://stackoverflow.com/questions/2051811/iphone- sdk-cgaffinetransform-getting-the-object-rotation-of-object 現在我知道了,如何從Transform3D直接計算。謝謝! – ravinsp 2010-10-16 06:18:44

+0

是的,我在第一年瞭解到了這一點,並記得詢問我的朋友「爲什麼他會這麼做,我們需要知道這個」 – 2010-10-16 12:51:45

15

如果變換被附接到的層,則可以得到這樣的旋轉的值如下:

CGFloat angle = [(NSNumber *)[layer valueForKeyPath:@"transform.rotation.z"] floatValue]; 

documentation

核心動畫延伸鍵值編碼協議,以允許獲取和通過鍵路徑的層的CATransform3D矩陣的公共值的設定。表4描述了圖層的transform和sublayerTransform屬性是關鍵值編碼和觀察兼容的關鍵路徑