Итак, у меня есть анимация, которую я кодирую в javascript и HTML5 (нет библиотек, нет плагинов, нет ничего, и я бы хотел, чтобы это было так). Анимация использует физику (в основном кучу необычных пружин, прикрепленных к массам), чтобы имитировать простую жидкость. Результатом этой части программы является сетка (2d-массив) объектов, каждая из которых имеет значение z. Это работает очень хорошо. Моя проблема возникает при рисовании данных на холсте HTML5.HTML5 Canvas Creative Alpha-Blending
Вот как это выглядит. Поверьте мне, это лучше, когда анимировать.
Для каждой точки данных программа рисует один круг с цветом, определяемым значением z. Однако, только рисуя эти моменты, схема сетки болезненно очевидна, и трудно увидеть жидкость, которую она представляет. Чтобы решить эту проблему, я сделал круги более крупными и прозрачными, чтобы они накладывались друг на друга, а цвета смешивались, создавая простое размытие свертки. Результат был как быстрым, так и красивым, но для одного небольшого недостатка:
По мере того, как круги нарисованы по порядку, их значения цвета не складываются одинаково, и поэтому более вытянутые круги затушевывают ранее нарисованные. Математически рендеринг принимает повторяющиеся средневзвешенные значения цветов кругов. Это отлично работает для двух кругов, каждый из которых имеет значение 0,5 * alpha_n, но для трех кругов рендеринг принимает среднее значение самого нового круга со средним значением двух других, давая самому новому кругу значение 0,5 * alpha_n, но более ранние круги имеют значение 0,25 * alpha_n. По мере того как больше кругов перекрывается, процесс продолжается, создавая предвзятость к более новым кругам и к более старым. Вместо этого я хочу, чтобы каждый из трех или более кругов получал значение 0,33 * alpha_n, так что предыдущие круги не были закрыты.
Вот изображение альфа-смешивания в действии. Обратите внимание на то, что позже синий круг затемняет раньше обращается красные и зеленые:
Вот что проблема выглядит в действии. Обратите внимание на разный вид левой части куска.
Чтобы решить эту проблему, я пробовал различные методы:
- Использование различного холста "Blend-режимы". «Умножить» (как видно на рисунке выше) сделал трюк, но создал неудачные цветовые искажения.
- Схватывая вместе призывы рисования. Вместо того чтобы сделать каждый круг отдельным холстом, я попытался объединить их все вместе в один. К сожалению, это несовместимо с наличием отдельных цветов заливки и, более того, путь не сливался с самим собой, создавая матовый монотонный силуэт.
- Чересстрочный чертежный заказ. Вместо того, чтобы рисовать круги в порядке от 0 до n, я попробовал сначала рисовать эвены, а затем коэффициенты. Это лишь частично разрешило проблему и создало неприглядный образец расслоения, в котором шансы, казалось, плавали над эвенками.
- Построение собственного режима смешивания с использованием putImageData. Я попытался создать ручной пиксельный шейдер в соответствии с моими потребностями с помощью javascript, но, как и ожидалось, он был слишком медленным.
На данный момент, я немного застрял. Я ищу творческие способы решения или кругосветки этой проблемы, и я приветствую ваши идеи. Меня не очень интересует, что мне говорят, что это невозможно, потому что я могу понять это для себя.Как вы изящно рисуете жидкость из таких точек данных?
PS: Я достаточно разбираюсь в javascript и HTML5, поэтому вам не нужно ничего научить. Кроме того, если это кажется тривиальной проблемой для вас, имейте в виду, что я не заставляю вас отвечать. Меня это только беспокоит, и я хочу работать над его решением. – mindoftea
Проклятые оптические иллюзии, ваши изображения выглядят анимированными, даже если они не являются. – Philipp
Может кто-нибудь сказать мне, почему голос? – mindoftea