2013-07-02 69 views
5

Vì vậy, tôi có một hình ảnh động mà tôi đang mã hóa trong javascript và HTML5 (không có thư viện, không có plugin, không có gì và tôi muốn nó ở lại theo cách đó). Các hình ảnh động sử dụng vật lý (về cơ bản là một loạt các lò xo bất thường gắn liền với khối lượng) để mô phỏng một chất lỏng đơn giản. Đầu ra từ phần này của chương trình là lưới (2d-mảng) của các đối tượng, mỗi đối tượng có giá trị z. Điều này hoạt động khá độc đáo. Vấn đề của tôi nảy sinh khi vẽ dữ liệu lên Canvas HTML5.HTML5 Canvas Creative Alpha-Blending

That's what it looks like. Trust me, it's better when animated.

Đó là hình thức của nó. Tin tôi đi, sẽ tốt hơn khi hoạt hình.

Đối với mỗi điểm dữ liệu, chương trình sẽ vẽ một vòng tròn có màu được xác định bằng giá trị z. Tuy nhiên, chỉ cần vẽ các điểm này, mẫu lưới là rõ ràng và khó nhìn thấy chất lỏng mà nó đại diện. Để giải quyết điều này, tôi đã làm cho các vòng tròn lớn hơn và minh bạch hơn để chúng chồng lên nhau và các màu được pha trộn, tạo ra một hiệu ứng nhòe chuyển động đơn giản. Kết quả là cả hai nhanh chóng và đẹp, nhưng đối với một lỗ hổng nhỏ:

Khi các vòng tròn được vẽ theo thứ tự, các giá trị màu của chúng không chồng lên nhau, và các vòng tròn sau sẽ làm mờ các hình vẽ trước đó. Về mặt toán học, trình kết xuất đang lấy trung bình có trọng số lặp lại của các giá trị màu của các vòng tròn. Điều này làm việc tốt cho hai vòng tròn, cho mỗi giá trị là 0,5 * alpha_n, nhưng đối với ba vòng tròn, trình kết xuất lấy trung bình của vòng tròn mới nhất với trung bình của hai vòng kia, cho vòng tròn mới nhất có giá trị là 0,5 * alpha_n, nhưng các vòng tròn trước đó mỗi giá trị là 0,25 * alpha_n. Khi có nhiều vòng kết nối trùng lặp hơn, quá trình này tiếp tục, tạo ra sự thiên vị đối với các vòng kết nối mới hơn và chống lại các vòng kết nối cũ hơn. Những gì tôi muốn, thay vào đó, là cho mỗi ba hoặc nhiều vòng tròn để có được một giá trị 0.33 * alpha_n, do đó các vòng tròn trước đó không bị che khuất.

Đây là hình ảnh về hoạt động trộn alpha. Chú ý rằng các vòng tròn màu xanh sau đó che khuất trước đó rút ra những màu đỏ và màu xanh lá cây:

Later blue circle obscures earlier drawn ones.

Here's what the problem looks like in action. Notice the different appearance of the left side of the lump.

Dưới đây là những gì các vấn đề trông giống như trong hành động. Chú ý sự xuất hiện khác nhau của phía bên trái của cục u.

Để giải quyết vấn đề này, tôi đã thử phương pháp khác nhau:

  • Sử dụng vải khác nhau "pha trộn-chế độ". "Nhân" (như đã thấy trong hình trên) đã thực hiện thủ thuật, nhưng tạo ra những biến dạng màu không may.
  • Tập hợp lại với nhau để vẽ các cuộc gọi. Thay vì làm cho mỗi vòng tròn một đường dẫn vải riêng biệt, tôi đã cố gắng gộp chúng lại với nhau thành một. Thật không may, điều này là không tương thích với việc có màu sắc riêng biệt và, những gì nhiều hơn, con đường không pha trộn với chính nó cả, tạo ra một bóng mờ, đơn điệu.
  • Thứ tự bản vẽ xen kẽ. Thay vì vẽ các vòng tròn theo thứ tự từ 0 đến n, tôi đã thử vẽ trước tiên và sau đó là tỷ lệ cược. Điều này chỉ giải quyết được một phần vấn đề, và tạo ra một mô hình phân tầng khó coi, trong đó tỷ lệ cược xuất hiện trôi nổi trên các evens.
  • Xây dựng chế độ hòa trộn của riêng tôi bằng cách sử dụng putImageData. Tôi đã thử tạo một pixel shader thủ công cho phù hợp với nhu cầu của tôi bằng cách sử dụng javascript, nhưng, như mong đợi, nó đã quá chậm.

Tại thời điểm này, tôi hơi bị kẹt. Tôi đang tìm những cách sáng tạo để giải quyết hoặc vòng quanh vấn đề này, và tôi hoan nghênh ý tưởng của bạn. Tôi không thích thú khi được bảo rằng điều đó là không thể, bởi vì tôi có thể tự mình hiểu ra điều đó.Làm thế nào bạn sẽ vẽ một chất lỏng từ những điểm dữ liệu như vậy?

+0

PS: Tôi khá giỏi về javascript và HTML5, vì vậy bạn không cần phải dạy tôi bất cứ điều gì. Ngoài ra, nếu điều này có vẻ giống như một vấn đề tầm thường với bạn, hãy nhớ rằng tôi không buộc bạn phải trả lời. Nó chỉ làm phiền tôi và tôi muốn giải quyết nó. – mindoftea

+4

ảo ảnh quang học chết tiệt, hình ảnh của bạn trông hoạt hình ngay cả khi không. – Philipp

+0

Ai đó có thể cho tôi biết lý do bỏ phiếu xuống? – mindoftea

Trả lời

2

Nếu bạn có thể phân hủy kết nối của bạn thành hai nhóm (làm mềm mại và tỷ lệ cược), như vậy mà không có sự chồng chéo trong vòng tròn trong một nhóm, trình tự sau đây sẽ cung cấp cho hiệu quả mong muốn:

  1. Rõ ràng nền
  2. Vẽ lại những sự kiện với một alpha 1,0 (đục)
  3. Vẽ mâu thuẫn với một alpha 1,0 (đục)
  4. Vẽ lại những sự kiện với một alpha của 0,5

Nơi mà được bao phủ bởi không CHẴN hay tỷ lệ cược sẽ hiển thị phía sau. Những người được bao phủ bởi evens sẽ hiển thị evens tại opacity 100%. Những người được bao phủ bởi tỷ lệ cược sẽ cho thấy tỷ lệ cược với opacity 100%. Những người được bao phủ bởi cả hai sẽ cho thấy một sự pha trộn 50%.

Có những cách tiếp cận khác mà người ta có thể sử dụng để cố gắng kết hợp ba hoặc nhiều bộ đối tượng, nhưng thực hiện "chính xác" thì phức tạp. Một cách tiếp cận khác nếu người ta có ba hoặc nhiều hình ảnh nên được pha trộn thống nhất theo kênh alpha của họ là phải vẽ liên tục tất cả các hình ảnh trong khi alpha toàn cầu phân rã từ 1 đến 0 (lưu ý rằng quy trình nói trên thực sự thực hiện điều đó, nhưng chính xác khi chỉ có hai hình ảnh). Các vấn đề làm tròn số giới hạn độ chính xác của kỹ thuật này, nhưng thậm chí làm hai hoặc ba lượt có thể làm giảm đáng kể mức độ nghiêm trọng của các tạo tác trực quan do đặt hàng trong khi sử dụng các bước ít hơn cần thiết để trộn chính xác. Một cách ngẫu nhiên, nếu mô hình pha trộn được cố định, có thể tăng tốc độ dựng hình rất lớn bằng cách vẽ các phép tính và tỷ lệ trên các khung hình riêng biệt không phải là hình tròn, nhưng dưới dạng hình chữ nhật mờ và trừ khỏi kênh alpha của một trong canvases nội dung của aa cố định "cắt cookie" vải hoặc điền vào mẫu. Nếu một trong những tính toán đúng nội dung của khung vẽ cookie, cách tiếp cận này có thể được sử dụng cho hơn hai bộ khung vẽ. Việc xác định nội dung của các khung vẽ cookie có thể hơi chậm, nhưng nó chỉ cần được thực hiện một lần.

+0

Tuyệt vời! Tôi sẽ không nghĩ đến việc lặp lại việc vẽ lại các vòng tròn, nhưng điều đó mở ra một thế giới hoàn toàn mới về khả năng pha trộn! – mindoftea

3

Vâng, cảm ơn tất cả sự giúp đỡ, các bạn. :) Nhưng, tôi hiểu, đó là một câu hỏi kỳ lạ và khó trả lời.

Tôi đang đặt phần này ở đây để nó sẽ cung cấp tài nguyên cho người xem trong tương lai. Tôi vẫn còn khá quan tâm đến các giải pháp có thể khác, vì vậy tôi hy vọng những người khác sẽ đăng câu trả lời nếu họ có bất kỳ ý tưởng nào.

Dù sao, tôi đã tự mình tìm ra giải pháp: Trước khi vẽ hình tròn, tôi đã thực hiện comb sort trên chúng để đặt chúng theo thứ tự theo giá trị z, sau đó vẽ chúng ngược lại. Kết quả là các đối tượng có giá trị cao nhất (cần được gần gũi hơn với người xem) đã được rút ra cuối cùng, và do đó không bị che khuất bởi các vòng kết nối khác. Kết quả là hiệu ứng che khuất vẫn còn đó, nhưng nó bây giờ xảy ra theo cách có ý nghĩa với hình học. Đây là những gì mô phỏng trông giống như việc sửa chữa này, nhận thấy rằng nó bây giờ là đối xứng:

Normal use Lump test