Я хочу исказить 2D-сетку на основе расположения точечных масс. Наличие массы должно сжимать сетку следующим образом:
Но я хочу исказить его произвольным количеством частиц на сетке.
Это для того, чтобы я мог визуализировать влияние гравитации на пространство: исказил пространство, где присутствуют большие массы.
То, что я пробовал до сих пор, — это итеративная настройка краев ячейки в зависимости от количества частиц внутри нее. Ячейка со многими частицами должна сжимать свои края.
Однако полученное изображение разочаровывает и на самом деле не выглядит искаженным 2D-пространством. Я думаю, потому что деформация должна иметь глобальный эффект, а не только влияние на одну ячейку?
Какой алгоритм я мог бы использовать для искажения двумерного пространства массами частиц?
Это для интерактивного использования, поэтому обязательно должно работать на частоте 60 Гц или быстрее.
Хорошо. Я думаю, что смогу кое-что соорудить в течение следующих двенадцати часов. А пока несколько дополнительных вопросов. Будет ли наименьшая масса занимать один пиксель или она может занимать дробную часть пикселя? Какое максимальное разрешение экрана? Хотя вы упомянули произвольное количество пикселей, существует ли практический предел количеству масс/частиц? Можем ли мы предположить, что массы представляют собой сфероиды, или вы хотите иметь дело со странными формами? Была бы у вас возможность работать с OpenGL (или VTK) или CUDA, или просто реализовывать для ядер ЦП?
Кроме того: вам нужно описание «настоящей» математики или просто что-то, что выглядит реалистично? Из вашего профиля я вижу, что вы пишете на C, поэтому я придумаю код на C++; дайте мне знать, если вы хотите, чтобы он больше походил на C, чем на C++.
Это не пиксельная симуляция. Он использует векторы и работает на процессоре, а не на графическом процессоре. В настоящее время я использую до 50 тысяч частиц или около того, все с одинаковой массой. Вы можете попробовать существующую версию без искажения пространства здесь: bram.itch.io/брызнуть-брызнуть-маленькая звезда
Спасибо. Приложение выглядит красиво! Я попробую несколько идей и вернусь к вам.
Извините, я так устал, что боролся с наивной реализацией (ради демонстрации) и даже не добрался до быстрой реализации. Короче говоря, я думаю, что есть быстрый способ справиться с суперпозицией гравитационного притяжения всех масс, но мне нужен более свежий мозг, чтобы написать это. Я вернусь к вам, когда смогу.





Я бы смоделировал двумерную плоскость как сделанную из какого-то эластичного материала, чтобы вы могли деформировать ее, применяя силы, имитирующие вес данного объекта.
Поскольку вы хотите визуализировать некоторый физический эффект, я думаю, что физически обоснованная визуализация может быть адекватным выбором.
Относительно простой способ моделирования такого упругого поведения — создание системы масса-пружина:
https://en.m.wikipedia.org/wiki/Soft-body_dynamics
Однако применение этого типа методов требует хорошего понимания физики Гука, ОДУ, интеграции и других связанных математических вещей.
Я создал скрипт, в котором каждая частица влияет на каждое пересечение сетки на основе гравитационного правила обратных квадратов. https://jsfiddle.net/1nrjcsqa/2/
dx = points[i][0] - x;
dy = points[i][1] - y;
d = Math.sqrt(dx * dx + dy * dy);
f = gravity_force / Math.pow(d, falloff);
Поскольку сила тяжести падает как квадрат расстояния, точки оказывают видимое влияние только на ближайшую к ним сетку. Вы можете заставить точки влиять на сетку дальше, уменьшив спад, но это будет меньше похоже на гравитацию.
Возможно, вам придется настроитьgravity_force, чтобы все выглядело правильно для вас.
Я опубликую несколько быстрых предложений на данный момент, а затем продолжу, когда смогу.
Хотя вы прямо сказали в своем посте и комментариях, что это будет обрабатываться на ЦП, выполнение этого на графическом процессоре и использование OpenGL для отображения может сильно помочь. Обработка эффектов десятков тысяч точек на частоте 60 Гц (~16 мс на проход) требует много ресурсов процессора, даже если он имеет восемь ядер.
Тем не менее, несколько подготовительных мыслей:
Учитывая все это, я имею в виду быстрый метод, который определяет гравитационное поле вокруг каждой массы как кусок памяти, который (более или менее) подвергается операции ИЛИ вместе с другой памятью, чтобы получить окончательную карту векторов поля.
Потом дело за рисованием. Опять же, использование OpenGL для создания истинного 3D-представления, которое затем проецируется на 2D-дисплей, было бы моим предпочтительным способом. OpenGL может работать на встроенной графике, и я бы рекомендовал именно это. В противном случае вычисления, которые необходимо выполнить для изменения 2D-линий сетки в виде 2D-фигур, могут быть сложными.
Помимо этого, вероятно, есть дополнительные настройки, читы и обходные пути, чтобы получить что-то разумное, что поможет пользователю визуализировать то, что происходит, но без точного представления гравитационных полей, как некоторым могло бы понравиться.
Из первоначального кода, который я написал просто для того, чтобы показать медленный и менее желательный способ решения проблемы, вот очень грубый пример изгиба линий сетки, рассматривая их как точки, которые можно по отдельности притягивать к каждой массе. Это НЕ способ реалистичного отношения к линиям сетки; код также имеет некоторые ошибки.
Я думаю, вы неправильно поняли: у меня уже запущен симулятор N-Body с десятками тысяч частиц, за 16 мс на процессоре. Сим сделан. Что я хочу наложить, так это визуализацию того, как пространство искажается под действием гравитации. youtube.com/watch?v=YiAiEWqxLWg
Я понял это. Чтобы рассчитать, как согнуть линии сетки на основе всех точек, будет сложно втиснуться в те же 16 мс, тем более что я все еще не уверен в ограничениях на количество масс, памяти, ядер и т. д. Если у вас есть неиспользуемый процессор ядра и/или могут быть разгружены на графический процессор или встроенную графику. Если у вас уже определено поле и/или у вас есть быстрый поиск точки в целочисленном или вещественном пространстве, то должен быть способ создать линии сетки в виде кусочных кривых, связанных вместе.
Есть ли у вас ограничения по времени обработки или памяти? Или, может быть, грубая оценка количества частиц? Я могу себе представить один метод, простой, но медленный, а другой потенциально быстрый, но его сложно реализовать.