2011-03-16 32 views
9

Tôi có một loạt hình ảnh trong ViewController.Mô phỏng hiệu ứng nổi hình ảnh bằng cách sử dụng CoreMotion/DeviceMotion trên iPhone

Tôi đang "nổi" chúng bằng cách chuyển lớp riêng của họ:

img.layer.transform = CATransform3DMakeTranslation(0.0f, 0.0f, myZ); 

này mang lại cho tác dụng làm cho các lớp nổi lên trên màn hình - trong Simulator, thì sẽ không có hiệu ứng thị giác (đó là chính xác).

Điều tôi muốn làm là có tác dụng khi di chuyển thiết bị sang trái/phải/tiến/lùi sẽ làm cho nó trông tinh tế như các lớp đang nổi. Khi bạn nghiêng thiết bị sang bên trái, thiết bị phải nghiêng góc nhìn toàn bộ sang phải. Điều này sẽ làm cho cảm giác như di chuyển thiết bị cho phép bạn nhìn xung quanh các góc - tức là nó sẽ tạo cảm giác rằng các hình ảnh thực sự đang trôi nổi trên màn hình, vì chúng sẽ di chuyển với các tốc độ khác nhau (dựa trên chỉ mục z của chúng).

Tôi đã thực hiện dự án thử nghiệm (project file here) trong đó có một dự án mẫu trình diễn điều này.

Vấn đề của tôi là tôi không phải là người toán, vì vậy tôi đang đấu tranh với cách tốt nhất để mô phỏng hiệu ứng nổi tinh tế. Ngay bây giờ, tôi có một người nghe cho DeviceMotion, sau đó thực hiện:

self.view.layer.sublayerTransform = CATransform3DMakeRotation(20.0f * M_PI/180.0f, 2*motion.attitude.pitch, -2*motion.attitude.roll, 0); 

Điều này rất gần với những gì tôi muốn, nhưng nó không chính xác.

Tôi nghĩ hiệu ứng này sẽ là thứ có thể được sử dụng trong một số ứng dụng khác nhau. Tôi hy vọng sẽ mở rộng điều này cho một người bạn và tôi đang làm việc với phát hiện khuôn mặt (vì vậy nó sẽ di chuyển chế độ xem gốc dựa trên chuyển động của khuôn mặt của một người - ngay cả khi họ giữ điện thoại/thiết bị hoàn toàn yên tĩnh).

Tôi nhận ra mình sẽ khiến mọi người trả lời "chỉ cần sử dụng OpenGL". Đó không phải là câu trả lời tôi cần - trừ khi bạn đăng một đoạn mã cho thấy cách tích hợp nó trong dự án này. (Tôi không tìm kiếm các vấn đề mới cần giải quyết. :-)

Một lần nữa, toàn bộ dự án ở đây (iphone floating views) cho bất kỳ ai muốn xem hiệu ứng như hiện tại. (Khi điều này làm việc, tôi sẽ để lại toàn bộ (làm việc) dự án liên kết ở đây cho hậu thế.)

Trả lời

5

Tôi nghĩ rằng tôi đã có điều này! Sử dụng điều này:

[appDelegate.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] 
                withHandler: 
    ^(CMDeviceMotion *motion, NSError *error) { 

     CATransform3D transform; 
     transform = CATransform3DMakeRotation(motion.attitude.pitch, 1, 0, 0); 
     transform = CATransform3DRotate(transform, motion.attitude.roll, 0, 1, 0); 

     self.view.layer.sublayerTransform = transform; 
    }]; 

trình như sự quyến rũ đối với tôi, nếu bạn muốn lật trục, chỉ cần thêm dấu trừ trước những 1s.

+0

Bạn thật tuyệt vời. Điều này hoạt động giống như một sự quyến rũ - và bạn chính xác ... Tôi chỉ cần chỉnh sửa các góc bù cho các góc, nhưng điều này mang lại cho tôi * chính xác * hiệu ứng tôi đang làm. Tôi vừa tải lên dự án demo làm việc - THANK YOU! –

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