Sự kết hợp hoàn hảo


25

Tôi thấy thật khó để mô tả vấn đề này bằng lời, đó là lý do tại sao tôi tạo một video (45 giây) để minh họa nó. Đây là bản xem trước của các câu hỏi, xin vui lòng xem nó trên Vimeo: http://vimeo.com/epologee/perinf-crossfade

Sử dụng hiệu ứng xen kẽ tuyến tính, hình ảnh thu được sẽ có độ trong suốt.  Làm thế nào tôi có thể ngăn chặn điều này?

Vấn đề tạo ra một hình ảnh hoàn hảo hoặc hòa tan hai hình ảnh hoặc hình dạng đã được lặp lại với tôi trong một số lĩnh vực trong thập kỷ qua. Đầu tiên là chỉnh sửa video, sau đó là hoạt hình Flash và giờ là lập trình iOS. Khi bạn bắt đầu googling nó, có rất nhiều cách giải quyết được tìm thấy, nhưng tôi thực sự muốn giải quyết vấn đề này mà không cần hack lần này.

Tóm tắt:
Tên của kỹ thuật hoặc đường cong sẽ được áp dụng trong việc xen kẽ hai ảnh bitmap bán trong suốt, cùng màu, nếu bạn muốn độ trong suốt của kết quả khớp với bản gốc của một trong hai?

Có một hàm (toán học) để tính các giá trị độ trong suốt / alpha cần thiết trong quá trình mờ dần không?

Có những ngôn ngữ mà có các chức năng như một cài sẵn, tương tự như lập trình ease in, ease outhoặc ease in outchức năng tìm thấy trong ActionScript hoặc Cocoa?

Cập nhật: Ngoài video, tôi đã tạo một dự án mẫu (yêu cầu Xcode và iOS SDK) và đăng nó lên github. Nó hiển thị hoạt hình giống như video nhưng lần này có hình vuông: https://github.com/epologee/StackOverflow-Example-Code


7
Không biết gì về nó nhưng +1 cho video.
sebastiangeiger

Phụ thuộc vào cách thức vận hành trên được thực hiện. Xem en.wikipedia.org/wiki/Alpha_channel
artistoex

Tôi đồng ý, @artistoex, có điều gì đó với nhà điều hành đó, cảm ơn vì liên kết! Tuy nhiên, nếu câu trả lời bị chôn vùi ở đâu đó, tôi sẽ không thấy nó :(
epologee

Các biểu diễn toán học của toán tử trên dẫn đến một phương trình. Ví dụ về toán tử: C = alpha * c1 + (alpha-1) * c2 mang lại alpha = (C + c2) / (c1 + c2) (C là kết quả của việc trộn hai màu c1, c2). Điều này có nghĩa là đối với toán tử này, không có chức năng, đáp ứng điều kiện của bạn.
artistoex

Với C = alpha1 * c1 + alpha2 * c2 (0 <= alpha1, alpha2 <= 1), có chức năng như vậy: alpha1 = (C-alpha2 * c2) / c1.
artistoex

Câu trả lời:



3

Tôi không biết tên đó có thể là gì trong lĩnh vực chỉnh sửa video, nhưng tôi gọi đường cong là đường cong S hoặc đường cong sigmoid . Sẽ rất đơn giản để tạo ra hiệu ứng làm mờ chéo mà bạn đang tìm kiếm trong iOS bằng cách sử dụng chức năng định thời kCAMediaTimingFunctionEaseInEaseOut của Core Animation . Chỉ cần làm động các thuộc alphatính của hai chế độ xem theo hai hướng ngược nhau (một 0-> 1, một 1-> 0) bằng cách sử dụng chức năng thời gian đó:

[UIView beginAnimations:@"crossfade" context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
view1.alpha = 0.0;
view2.alpha = 1.0;
[UIView commitAnimations];

Lưu ý: Bạn thực sự nên sử dụng các phương thức hoạt hình dựa trên khối thay vì phương thức tiện lợi của UIView. Tôi đã sử dụng các phương pháp của UIView ở trên vì nó rất dễ hiểu và dễ gõ từ bộ nhớ. Tuy nhiên, việc sử dụng các khối không khó khăn hơn nhiều.

Phụ lục: Nếu bạn không thích UIViewAnimationEaseInOut, bạn có thể tạo chức năng thời gian của riêng mình như được mô tả trong Thời gian, Thời gian và CAAnimation . Đó là một chút tiên tiến hơn so với hoạt hình đơn giản được minh họa ở trên, nhưng nó cung cấp cho bạn tất cả các điều khiển bạn muốn.


Sigmoid! Đó là một bước gần hơn, cảm ơn! Đoạn mã bạn cung cấp không hoạt động ngay lập tức, đối với setAnimationCurve có một tham số khác với kCAMediaTimingFunctionEaseInEaseOut. Bạn có thể có ý nghĩa UIViewAnimationCurveEaseInOut? Vấn đề với đường cong đó là như nhau (nhúng ở giữa), bởi vì tại bất kỳ thời điểm nào, hai giá trị alpha trong một phép cộng đơn giản sẽ bằng nhau 1.0, trong đó như trong đường cong được điều chỉnh thủ công của tôi, nó cần vượt quá 1.0để có kết quả mong muốn .
epologee

Bây giờ tôi hiểu rồi ... bạn nói đúng về hằng số - Tôi đã cập nhật mã trong câu trả lời. Tôi cũng đã thêm một liên kết đến các tài liệu giải thích cách tạo các hàm thời gian của riêng bạn.
Caleb

Tôi làm hoạt hình của mình với các khối, nhưng ý chính là như nhau. Các đường cong tích hợp vẫn không được áp dụng, vì tính đối xứng của chúng, nhưng phần phụ lục đã mở đường cho một CAMediaTimingFunction tùy chỉnh khớp với cái tôi đã sử dụng trong video After Effects. Rắc rối là không có một đường cong sigmoid nào phù hợp với mọi kịch bản , các mức độ mờ bắt đầu khác nhau sẽ đòi hỏi các vị trí khác nhau để thoát khỏi 'nhúng'. Phải có một cái gì đó tôi đang thiếu.
epologee

Xin chào @Caleb, tôi đã đăng một dự án mẫu trên GitHub (xem bài đăng). Thời gian tùy chỉnh là hữu ích, nhưng nếu bạn thay đổi initialTransparencygiá trị, nó không sử dụng. Bạn sẽ không có manh mối gì để thử tiếp theo?
epologee

2
Một vài bit nữa để giúp Google tìm kiếm; lập trình viên đồ họa gọi biểu đồ mà bạn đang nói về "bước chân". Các lập trình viên toán học cao thường sẽ gọi nó là "bộ nội suy ẩn". Và một phương trình đơn giản để tính một phương trình không có lượng giác là: "3t ^ 2 - 2t ^ 3".
Trevor Powell

1

Trong đồ họa máy tính, loại chức năng này được gọi là smoothstep . Khi được sử dụng để trộn lẫn, nó xác định giá trị alpha toàn cầu cho chế phẩm.

Nếu các hình ảnh đầu vào có một kênh alpha, trước tiên bạn nên đảm bảo rằng alpha được xử lý trước . Sau đó, bạn có thể thực hiện bố cục xen kẽ một cách đơn giản, sử dụng bước mượt mà alphatrên mỗi kênh [ X = A*alpha + B*(1-alpha)] và mong đợi kết quả hợp lý.


0

Bạn có thể sử dụng hàm phân rã theo cấp số nhân:

Alpha1(time) = 1 - exp(-time / (0.2 * transitionTime)); // fade in
Alpha2(time) = 1 - Alpha1(time); // fade out

Biểu đồ của bạn trông giống như:

Alpha1(time) = sin(time * 0.5 * pi / transitionTime); // fade in
Alpha2(time) = cos(time * 0.5 * pi / transitionTime); // fade out

Cảm ơn @Danny. Trên thực tế, việc thực hiện 1 - Alpha1(time)phương trình sẽ không quan tâm đến việc nhúng, bởi vì hai hình ảnh 0,5 alpha pha trộn sẽ không tạo ra hình ảnh tổng hợp với 1.0 alpha. Các đường cong tùy chỉnh mà tôi đã vẽ không được nhân đôi theo chiều dọc.
epologee

1
1-alpha là cho sự phân rã theo cấp số nhân, mà tôi nghĩ là phù hợp hơn. Đối với các hàm sin / cos của khóa học sin (t) = sqrt (1-sqr (cos (t)), tuy nhiên, việc tính toán từng hàm riêng biệt sẽ nhanh hơn.
Danny Varod

Nếu vấn đề là chức năng của một đường cong tương tự có thể trông như thế nào, thì toán học của bạn là chính xác. Tuy nhiên, vấn đề là làm thế nào để đối phó với sự pha trộn của hai màu, ví dụ: làm thế nào để có được 40% màu xanh + 40% màu xanh lam để tạo ra màu xanh 80%.
epologee

Điều đó dễ thực hiện nhưng sẽ dẫn đến độ bão hòa nhìn kém khi tổng màu> 100%.
Daniel Varod
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.