2010-08-25 7 views
9

Làm cách nào để tính toán Xoay trong Radian xung quanh trục Z bằng cách cho cấu trúc CATransform3D làm đầu vào?iPhoneSDK tính góc quay từ CATransform3D

về cơ bản những gì tôi cần là vòng khác theo cách CATransform3DMakeRotation.

Trả lời

23

Tùy thuộc vào trục bạn đang thực hiện xoay vòng.

Rotation về trục z được biểu diễn dưới dạng:

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) 

nên góc nên a = atan2 (transform.m12, transform.m11);

Rotation về trục 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) 

Rotation về trục 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

Hãy chắc chắn sử dụng atan2 và không inan như sau này sẽ không đưa góc vào góc phần tư chính xác. –

+0

Cảm ơn bạn Nader, trước câu trả lời của bạn, tôi đã sử dụng lại thuộc tính affineTransform của CALayer chuyển đổi Transform3D thành một AffineTransform và sau đó lấy góc ra khỏi nó từ phép tính này: http: //stackoverflow.com/questions/2051811/iphone- sdk-cgaffinetransform-get-the-angle-of-rotation-of-an-đối tượng Bây giờ tôi biết, làm thế nào để tính toán trực tiếp từ Transform3D. Cảm ơn! – ravinsp

+0

Vâng tôi đã học về điều này trong năm đầu tiên và có thể nhớ hỏi bạn tôi "tại sao anh ta sẽ làm chúng ta cần biết điều này" –

15

Nếu chuyển được gắn vào một lớp, sau đó bạn có thể nhận được giá trị của luân chuyển như sau:

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

.210

Từ documentation:

Core Animation mở rộng giao thức mã hóa khóa-giá trị cho phép nhận và thiết lập các giá trị phổ biến của ma trận CATransform3D của một lớp thông qua con đường quan trọng. Bảng 4 mô tả các đường dẫn chính mà thuộc tính chuyển đổi và thuộc tính sublayerTransform là mã hóa giá trị khóa và tuân thủ tuân thủ