Название: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 03, 2015, 11:09 Добрый день
Об этом недавно упоминалось в плане дызайна, задача та же самая Цитировать Есть 2 объекта, для простоты 2 сферы. Пользователю нужна возможность задать силу их взаимодействия, правила: Хорошо, задали силы, задали расстояния и... не работает, хоть с Леннардом, хоть с Джонсом (подозреваю что они здесь вообще ни при чем). Вернее работает очень плохо, совсем не так как хотелось бы. Подебажил, разобрался почему так происходит, и что собственно плохо.- если объекты "достаточно близко" (друг от друга), то между ними возникает сила отталкивания. И чем они ближе тем эта отталкивающая сила больше - если объекты "достаточно далеко" то наоборот, между ними возникает сила притяжения - если объекты "совсем далеко" то никакой силы нет Расчет сил производится 30 раз в секунду. Рассчитанная сила переводится в ускорение с учетом массы тел и шага по времени. Получившееся ускорение добавляется к текущей скорости объекта. Итак Плохо 1. Если объект(ы) уже имеет какую-то скорость, то сила отталкивания может оказаться недостаточной чтобы предотвратить столкновение объектов. Плохо 2. Пытаясь пресечь столкновения, пользователь начинает увеличивать силу отталкивания - но получается еще хуже. Пример: пусть никакой силы отталкивания еще нет, объект еще за границами ее действия. Но он имеет скорость, и на след шаге оказывается уже в зоне, и если скорость приличная - то глубоко внутри ее. И тогда сила отталкивания кааак въе.. - ну в общем получается мощнейшее ускорение - а оно интегрируется в скорость. Короче объект улетает хз куда, ну ничего себе "оттолкнулся". Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками? :'( Нельзя ли это порешать "как программист", т.е. чисто практически, чтобы юзер был доволен и результаты "вполне". А насколько оно там соответствует теории (или нет) - совершенно не волнует. Спасибо Название: Re: Потенциал Леннард-Джонса Отправлено: m_ax от Ноябрь 03, 2015, 11:25 Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся)
Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 03, 2015, 11:42 Поставьте ограничение на максимальную скорость. Или потенциал другой подберите.. На Леннард-Джонсоне мир не сошёлся) Какие-то рекомендации.. ну откровенно беспринципные. Видать вся силенка в темплейты ушла :) Название: Re: Потенциал Леннард-Джонса Отправлено: m_ax от Ноябрь 03, 2015, 11:59 Цитировать Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками? Используйте интегралы движения, например сохранение энергии:mv^2/2 + U(r) = E0 где U потенциал. Задаёте E0 и вычисляете скорость. Никаких дифуров) Название: Re: Потенциал Леннард-Джонса Отправлено: Racheengel от Ноябрь 03, 2015, 18:19 Цитировать Да, знаю, знаю что скажут теоретики - шаг по времени слишком велик, уменьшайте. Ну ясно что с шагом микрон все будет работать - так кто ж будет ждать сутками? А шо, оно все в реальном времени моделируется? Внутреннее время никак низя ускорить? Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 04, 2015, 09:45 А шо, оно все в реальном времени моделируется? Внутреннее время никак низя ускорить? Почему Ваша мысль немедленно начинает работать в направлении "как обойти проблему"? Может в ней ничего сложного-то и нет, проще ее решить? Ах, не оказалось готового решения в (несметной) кладовой Вашего опыта! Ну так это вполне нормально, в моей тоже не оказалось :) Давайте думать и решать, а не бегать "по готовому".Используйте интегралы движения, например сохранение энергии: Вы же знаете что трогать скорость (грязными руками) я не могу, это делает движок. По поводу приведенной формулы - ну как всегда, котлеты (теория) отдельно, мухи (реализация) отдельно. Как же мне получить вектор силы если у Вас одни скаляры? mv^2/2 + U(r) = E0 где U потенциал. Задаёте E0 и вычисляете скорость. Никаких дифуров) Название: Re: Потенциал Леннард-Джонса Отправлено: m_ax от Ноябрь 04, 2015, 12:25 Цитировать Как же мне получить вектор силы если у Вас одни скаляры? F = - grad U(r)Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 05, 2015, 07:29 F = - grad U(r) Ну вот, выдавили из себя строчку - и умчались опять играться с темплейтами :) Кто же такой "grad"? Это теоретик не соизволил пояснить, единственное разумное что мне приходит в голову - это нормированный вектор центр-центр объектов. А Вы не находите что он может совсем не совпадать с векторами скоростей объектов?Да, и на следующий такой "лаконичный огрызок" отвечать уже не буду :) Название: Re: Потенциал Леннард-Джонса Отправлено: m_ax от Ноябрь 05, 2015, 11:18 grad - это градиент) Думал это не требует пояснений)
См. аттач ниже. Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 06, 2015, 07:22 grad - это градиент) Думал это не требует пояснений) Зачем надо было привлекать этот (весьма широкий) термин? Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)? Впрочем с любыми терминами Ваш пост ничего нового не вносит. Совершенно неважно какой "график" (модулятор) сил используется - хоть линейный, проблемы все те же. Название: Re: Потенциал Леннард-Джонса Отправлено: ssoft от Ноябрь 06, 2015, 10:00 Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком). Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано. Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются. Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 06, 2015, 10:26 Наверное, без интегрирования все же не обойдется. У меня сейчас немало задач такого плана (пошла струя :)). По опыту уже решенных могу сказать - никакой особой "крутизны" не требуется. Ну взять хотя бы притяжение - ну посчитал вектор силы по заданному закону, отдал движку - и все дела. Шо тут интегрировать? :) Да и с проблемами отталкивания (описанными здесь) идея-то понятна - нужно не просто "отталкивать", а еще и гасить вектор скорости, по аналогии с пружиной (соседняя тема).Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком). Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано. Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются. Конечно советы людей с бОльшими познаниями в физике/математике совсем не помешали бы - но где ж там :'( Название: Re: Потенциал Леннард-Джонса Отправлено: m_ax от Ноябрь 06, 2015, 11:50 Цитировать Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)? Потому что это неправильно) Не знаю в какой книжке Вы это вычитали, но Цитировать Зачем надо было привлекать этот (весьма широкий) термин? коль скоро мы говорим в контексте физической задачи, то будьте добры оперировать и на общепринятом языке - градиент всегда был и есть векторный дифференциальный оператор. И сила не сводится просто к умножению потенциала на единичный вектор (r/r). А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам.. Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта. Или, на худой конец, добавьте к силе диссипацию.. Название: Re: Потенциал Леннард-Джонса Отправлено: ssoft от Ноябрь 06, 2015, 12:24 Тут дело не в крутизне :D
Заменяя бесконечно малые изменения dt на конечные, мы получаем существенную погрешность. Пусть скорость линейная функция v = v0 + aconst*t v - скорость a - ускорение t - время от начального момента дистанция рассчитывается через интеграл (надеюсь понятно в такой записи) d(t) = integral( v(t)dt, t0, t); если заменить расчет через delta_t, то получим delta_t = ti-ti-1 d += v(ti) * delta_t реально же через интегралы d += v(ti) * delta_t + ( aconst * delta_t2) / 2 Чем больше delta_t тем больше ошибка. Оба варианта являются конечной разностью интеграла полученной при разложении в ряд Тейлора функции дистанции по времени. Первый соответствует постоянной скорости (ускорение 0), второй постоянному ускорению (сила воздействия не изменяется). Ряд сходящийся, сумма остаточных членов ряда - погрешность вычислений. В случае когда сила воздействия зависит от положения самого тела необходимо иметь градиент потенциала, дивергенцию скорости и ..., собственно решать диф. уравнения. Простой подгон не даст решения на все случаи. Для подгона могу предложить только определять силу воздействия не по мгновенному значению, а по формуле F0 = F(t0); F1 = F(t1); F = ( F0 * w0 + F1 * w1 ) / ( w0 + w1 ); и подбирать веса w, чтобы все выглядела достаточно прилично. Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 06, 2015, 12:33 Цитировать Почему бы не сказать четко "нормированный вектор центр-центр", что кстати и написано в книжке (r/r)? Потому что это неправильно) Не знаю в какой книжке Вы это вычитали, но коль скоро мы говорим в контексте физической задачи, то будьте добры оперировать и на общепринятом языке - градиент всегда был и есть векторный дифференциальный оператор. И сила не сводится просто к умножению потенциала на единичный вектор (r/r). Напрасно Вы пытаетесь "наводить порядки" и запугать меня "векторным дифференциальным оператором" :) Что ж это у Вас за градиент если никакого взятия производной и в помине не было? Это просто вектор центр-центр - и ничего более. И в том же скриншоте сила именно сводится к умножению, отсюда хапнули вектор, оттуда скаляр - и все дела. А проблема Ваша из-за того, что на масштабе шага потенциал меняется достаточно значительно, что и ведёт к этим артефактам.. Играйтесь с параметрами потенциала (a1, a2, степени) или уменьшайте шаг, или (если есть возможность в движке) меняйте Эйлера на Рунге-Кутта. Или, на худой конец, добавьте к силе диссипацию.. m_ax, я ж Вас в тему на аркане не тяну. Есть мысли которыми Вы бы хотели поделиться - пожалуйста, я внимательно слушаю. А нет - так чего порожняк гнать? Уже устал его слушать :'(Название: Re: Потенциал Леннард-Джонса Отправлено: m_ax от Ноябрь 06, 2015, 12:50 Цитировать Что ж это у Вас за градиент если никакого взятия производной и в помине не было? Это просто вектор центр-центр - и ничего более. И в том же скриншоте сила именно сводится к умножения, O___o Вы точно скиншот видели? Посмотрите ещё повнимательнее..Попробуйте к силе добавить член -kv, где коэффициент k может зависеть от скорости, например он становится отличным от нуля при достижении определённого порога скорости. Экстренное торможение, так сказать.. Название: Re: Потенциал Леннард-Джонса Отправлено: Igors от Ноябрь 06, 2015, 13:12 Тут дело не в крутизне :D Заливаете конечно, но творчески, умело, мне Ваш подход импонирует :)Заменяя бесконечно малые изменения dt на конечные, мы получаем существенную погрешность. По существу: мне совершенно нафиг не нужен d (пройденный путь), этим занимается движок. Я могу только сообщить ему, мол, прилагаю такую-то силу, а его дело разобраться. Напр я могу приложить безумную силу, но если объект уперся в препятствие - это не возымеет никакого эффекта. По этой же причине я не могу взвешивать силы - ситуация от кадра к кадру может не иметь ничего общего. Ладно, для себя наметил такой план: - вычитаем вектора скорости объектов, получаем вектор "относительной скорости" - проецируем этот вектор на направление центр-центр, получаем вектор "приближения" одного объекта к другому [OFF]Нытье: конечно это совсем просто, и даже "очевидно". Но (гребаный компот), почему теоретики НИКОГДА не сообщают о таких "мелких подробностях"? Ведь без них получится полная чушь. Ладно, уже давно привык [/OFF] - без затей (по заданным пользователем параметрам) считаем силу отталкивания. но ПЛЮС к ней силу которая погасит "вектор приближения". Коэффициент гашения видимо тоже надо дать юзеру. Это все. Что Вы об этом думаете? |