Создание произвольно искаженной 2D-сетки - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу исказить 2D-сетку в зависимости от местоположения точечных масс.Наличие массы должно сокращать сетку следующим образом:

distortion

Но я хочу исказить ее произвольным числом частиц в сетке.

Это так, чтобы я мог визуализировать влияние гравитации на пространство: деформировать пространство, в котором присутствуют большие массы.

То, что я пробовал до сих пор, - это итеративная регулировка краев ячейки., исходя из количества частиц внутри него.Ячейка с большим количеством частиц должна сжимать свои края.

Однако получаемый визуальный эффект разочаровывает и в действительности не выглядит как искаженное двумерное пространство.Я думаю, потому что деформация должна иметь глобальный эффект, а не только эффект на одну ячейку?

Какой алгоритм я могу использовать для искажения двумерного пространства массами частиц?

attempt

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Я создал скрипку, где каждая частица влияет на каждое пересечение сетки на основе правила гравитации обратного квадрата.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, чтобы все выглядело правильно.

0 голосов
/ 12 февраля 2019

Сейчас я опубликую несколько быстрых предложений, а затем рассмотрю больше, когда смогу.

Несмотря на то, что вы прямо указали в своем посте и комментариях, что это будет обработано на процессоре, сделайте это наGPU и использование OpenGL для отображения могут очень помочь.Обработка эффектов десятков тысяч точек с частотой 60 Гц (~ 16 мсек / с) требует большого количества ресурсов процессора, даже если он имеет восемь ядер.

Тем не менее, несколько подготовительных мыслей:

  • Как указывает пользовательский треугольник, гравитация падает как квадрат расстояния.На некотором расстоянии вы можете игнорировать эффекты, тем более что все ваши объекты имеют одинаковую массу.
  • Учитывая, что вы поддерживаете большое количество масс, возникают проблемы с масштабированием, сохраняя при этом хорошую частоту обновления для взаимодействия иплавная анимация.
  • Ваша цель - визуализация. Это означает, что вы можете использовать ярлыки, к которым в противном случае может привести строгая интерпретация математики.На самом деле, я думаю, что по крайней мере некоторые ярлыки необходимы для работы на любой скорости, близкой к желаемой.
  • Итерации по массам и всем точкам линии сетки, на которые они влияют, скорее всего, не приведут к привлекательному обновлению графики на скоростях.Ты бы хотел.
  • Вам необходимо учитывать суперпозицию и векторов поля .(Я говорю здесь в общем смысле, а не в правильной терминологии.) Каждая масса будет влиять на все пространство вокруг нее.Из любой точки пространства будет некоторый вектор, указывающий на эту массу, длина вектора, представляющая силу притяжения.В любой точке пространства вы сложите векторы.Это может привести к «мертвой точке», когда два разных тела вытягиваются с силами, которые нейтрализуют.
  • При большом количестве масс визуализация изогнутых линий сетки может стать настолько сложной, что скорее сбивает с толку, чем просвещает пользователя.Представьте себе эластичный резиновый лист с прикрепленными к нему тысячами стальных гирь, иногда с гирьками, сгруппированными вместе: форма поверхности может выглядеть очень сложно.
  • Как писал Маурисио Селе Лопес Белон, вы можете смоделировать поверхность какЭластичный материал - то есть непосредственно реализует «резиновый лист» геометрии поверхности.За исключением использования CUDA и OpenGL на графическом процессоре, я не думаю, что вы заставите это работать, хотя.
  • Основным препятствием является время расчета.
  • Чтобы минимизировать время вычисления, предварительно вычислите какнасколько это возможно.
  • Обратите внимание, что, поскольку ваши массы равны, эффекты этих масс при любом заданном смещении (dx, dy) одинаковы.
  • Хотя точки, представляющие массы, могут иметь реальные-значные местоположения, такие как (23.32342, -15.38963) или что-то еще, вы, вероятно, можете (и, вероятно, должны) рассчитать влияние на целочисленную сетку, чтобы упростить вычисления.

Учитывая все это,Я имею в виду быструю технику, которая определяет гравитационное поле вокруг каждой массы как кусок памяти, который (более или менее) ИЛИ объединяется с другой памятью для получения окончательной карты векторов поля.

Тогда естьвопрос рисования.Опять же, использование OpenGL для создания настоящего 3D-представления, которое затем проецируется на 2D-дисплей, было бы моим предпочтительным вариантом.OpenGL может работать на интегрированной графике, и я рекомендую именно так.В противном случае расчеты по изменению 2D-линий сетки как 2D-фигур могут быть сложными.

Помимо этого, вероятно, существуют дополнительные настройки, читы и обходные пути, позволяющие получить что-то разумное, что поможет пользователю визуализировать происходящее, но безпредставление гравитационных полей так точно, как это может показаться некоторым.

Из исходного кода, который я написал просто для того, чтобы показать медленный и менее желательный способ решения проблемы, вот очень грубый пример изгибания линий сетки, рассматривая их как точки, которыеможет быть индивидуально подтянут к каждой массе.Это НЕ способ реалистично относиться к линиям сетки;в коде также есть некоторые ошибки.

Rough sample of gridlines bent by mass

0 голосов
/ 10 февраля 2019

Я бы смоделировал 2-мерную плоскость как изготовленную из некоторого упругого материала, так что вы можете деформировать его, применяя силы, имитирующие вес данного объекта.

Поскольку вы хотите визуализировать некоторый физический эффект, я думаю, чтофизически обоснованная визуализация может быть адекватным выбором.

Относительно простым способом моделирования такого упругого поведения является создание системы масса-пружина:

https://en.m.wikipedia.org/wiki/Soft-body_dynamics

Однако применение этого типа методов требует хорошего пониманияHookean физика, ODE, интеграция и другие математические вещи.

...