6

Tôi đang sử dụng phép chuyển đổi CATransform3D để áp dụng hiệu ứng phối cảnh giả 3D cho một khung nhìn.Áp dụng một CATransform3D ngược cho các lớp con của một CALayer đã được chuyển đổi

Tôi đang sử dụng con quay hồi chuyển trong iPhone 4 để kiểm soát các thông số của biến đổi.

Quan điểm tôi là biến đổi có một số subviews:

View with subviews

Kết quả là một cái gì đó như thế này:

3D transform in action

nhiệm vụ tiếp theo của tôi là một trong hai ngăn ngừa sự subviews từ việc chuyển đổi khi chế độ xem chính được chuyển đổi hoặc áp dụng phép biến đổi ngược để các bản xem lại không bị ảnh hưởng.

Mục tiêu của tôi là có mỗi tiểu cảnh vuông góc với superview, tạo ấn tượng rằng chúng "đang đứng".

Mã Tôi đang sử dụng cho chuyển đổi:

- (void)update:(NSTimer *)timer 
{ 
    roll = [[[_manager deviceMotion] attitude] roll]; 
    pitch = [[[_manager deviceMotion] attitude] pitch]; 
    yaw = [[[_manager deviceMotion] attitude] yaw]; 

    CALayer *layer = [self.view layer]; 
    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI/180.0f, 0.0f, 0.0f, 1.0f); // make landscape again 
    rotationAndPerspectiveTransform.m34 = 1.0/-500; // apply the perspective 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f); 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f); 
    [layer setTransform:rotationAndPerspectiveTransform];  
} 

Tôi đã thử đoạn mã sau trong một nỗ lực nhằm đảo ngược biến đổi, bằng cách áp dụng một quan điểm xoay 90 độ so với subview quanh trục Y:

for (UIView *subview in [self.view subviews]) 
{ 
    CALayer *sublayer = [subview layer]; 
//CATransform3D inverseTransformation = [sublayer transform]; 
CATransform3D inverseTransformation = CATransform3DIdentity; 
rotationAndPerspectiveTransform.m34 = 1.0/-500; // apply perspective 
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI/180.0f, 0.0f, 1.0f, 0.0f); 
[sublayer setTransform:inverseTransformation]; 
} 

nhưng tất cả điều này thành công khi làm là làm cho các bài đánh giá biến mất. Nếu tôi cố gắng sử dụng biến đổi hiện có từ lớp với [sublayer transform] và áp dụng xoay vòng 3D cho nó, thì các bản xem trước nhấp nháy, nhưng không xoay.

Kiến thức về ma trận Ma trận không phải là tuyệt vời, vì vậy tôi không biết đây có phải là cách tiếp cận chính xác hay không.

Làm cách nào để làm cho các bản xem phụ có thể vuông góc với chế độ xem siêu?

Trả lời

1

Tôi khuyên bạn không nên cố gắng thực hiện phương pháp cơ bản để tính toán từng công việc biến đổi riêng lẻ. Ngoài ra, điều này sẽ được dễ dàng hơn bằng cách sử dụng CALayers cho mỗi quan điểm phụ nhỏ thay vì các đối tượng UIView cấp cao hơn. Cách tiếp cận cơ bản của việc xây dựng mô hình 3D và chuyển đổi toàn bộ mô hình sẽ hoạt động tốt hơn cho bạn.

Bắt đầu với lớp chính, thêm lớp con cho mỗi ô vuông nhỏ, chuyển các lớp con đó thành vị trí, sau đó phương pháp update: được liệt kê trong câu hỏi của bạn sẽ hoạt động để biến đổi mọi thứ mà không sửa đổi. John Blackburn has a nice little tutorial sẽ giúp ích rất nhiều.

Các vấn đề liên quan