Mam animację, którą koduję w javascript i HTML5 (bez bibliotek, bez wtyczek, bez niczego i chciałbym, żeby tak pozostało). Animacja wykorzystuje fizykę (w zasadzie kilka niezwykłych sprężyn połączonych z masami), aby symulować prostą ciecz. Dane wyjściowe z tej części programu to siatka (tablica 2d) obiektów, z których każda ma wartość z. Działa to całkiem nieźle. Mój problem powstaje podczas rysowania danych na płótnie HTML5.HTML5 Creative Creative Alpha-Mieszanie
Tak to wygląda. Zaufaj mi, to lepiej, gdy jesteś animowany.
Dla każdego punktu danych program rysuje jedno kółko o kolorze określonym przez wartość z. Właśnie rysując te punkty, wzór siatki jest boleśnie oczywisty i trudno jest zobaczyć płyn, który on reprezentuje. Aby rozwiązać ten problem, zrobiłem kółka większe i bardziej przezroczyste, tak aby zachodziły na siebie i kolory się mieszały, tworząc proste rozmycie splotu. Wynik był zarówno szybki, jak i piękny, ale dla jednej małej wady:
Gdy kręgi są rysowane w kolejności, ich wartości kolorów nie układają się równo, a więc pofałdowane kółka zaciemniają te wcześniej rysowane. Matematyczne renderowanie przyjmuje powtarzające się średnie ważone wartości kolorów kół. Działa to dobrze dla dwóch kółek, dając każdemu wartość 0,5 * alpha_n, ale dla trzech okręgów renderer pobiera średnią z najnowszego koła ze średnią dwóch pozostałych, nadając najnowszemu kręgowi wartość 0,5 * alpha_n, ale wcześniejsze kręgi mają wartość 0,25 * alpha_n. W miarę nakładania się kolejnych okręgów proces ten trwa, tworząc tendencję do nowych kręgów i starszych. Zamiast tego, dla każdego z trzech lub więcej kręgów otrzymam wartość 0,33 * alfa_n, aby wcześniejsze kręgi nie były zasłonięte.
Oto obraz mieszania alfa w akcji. Zauważ, że później niebieski okrąg zasłania wcześniej wyciągnąć czerwone i zielone:
Oto na czym polega problem wygląda w akcji. Zwróć uwagę na inny wygląd lewej strony guzka.
Aby rozwiązać ten problem, próbowałem różnych metod:
- Używanie innego płótna "blend-tryby". "Pomnożyć" (jak widać na powyższym obrazku) zrobiło lewę, ale stworzyło niefortunne zniekształcenia kolorów.
- Łączenie razem wywoływanie połączeń. Zamiast robić z każdego kręgu oddzielną ścieżkę płótna, próbowałem zrzucić je wszystkie w jeden. Niestety, jest to nie do pogodzenia z oddzielnymi kolorami wypełnienia, a co więcej, ścieżka nie łączy się z samym sobą, tworząc matową, monotonną sylwetkę.
- Przeplatanie kolejności rysowania. Zamiast rysować koła w kolejności od 0 do n, próbowałem najpierw narysować wyrównanie, a następnie szanse. To tylko częściowo rozwiązało problem i stworzyło nieestetyczny wzór warstwowy, w którym szanse wydawały się unosić nad wieczorami.
- Tworzenie własnego trybu mieszania przy użyciu metody putImageData. Próbowałem utworzyć ręczny program do cieniowania pikseli, który odpowiadałby moim potrzebom przy użyciu javascript, ale zgodnie z oczekiwaniami był o wiele za wolny.
W tym momencie trochę utknąłem. Szukam twórczych sposobów rozwiązania lub obejścia tego problemu i cieszę się z twoich pomysłów. Nie jestem zbytnio zainteresowany powiedzeniem mi, że to niemożliwe, ponieważ mogę to sobie wyobrazić.Jak możesz elegancko czerpać płyn z takich punktów danych?
PS: Jestem dość biegły w javascript i HTML5, więc nie musisz mnie uczyć niczego. Ponadto, jeśli wydaje ci się to banalnym problemem, pamiętaj, że nie zmuszam cię do odpowiedzi. Po prostu przeszkadza mi to i chcę pracować nad jego rozwiązaniem. – mindoftea
Cholerne złudzenia optyczne, twoje obrazy wyglądają na ożywione, nawet jeśli nie są. – Philipp
Czy ktoś może mi powiedzieć, dlaczego głosowanie w dół? – mindoftea