Search
Write a publication
Pull to refresh
139
0

Пользователь

Send message
Контактное взаимодействие? Если я правильно понимаю термин, то я отказался от такого взаимодействия. Вначале, когда шаг был большой, я рассчитывал, не пересекаются ли траектории частиц, и если пересекаются, вычислял точку контакта и реализовывал упругое мгновенное столкновение, изменяя скорости и координаты столкнувшихся частиц.

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

Так что сейчас используется только сила Леннарда-Джонса. Небольшая доля частиц движется быстро, и, действительно, перекрываются в столкновении, с возникновением неадекватных величин в нормальной составляющей силы взаимодействия. Но я это исправил, обрезав пики у кривой Леннарда-Джонса, оставив плато. Большинство частиц взаимодействуют в области вблизи равновесия между отталкиванием и притяжением, и там значения величины силы корректное. А если экстремальное сближение происходит, сила не растёт.

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

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

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

Вместо разностной схемы мне на реддите предложили попробовать rk4. Я счёл, что это исправит ситуацию для экстремальных градиентов поля, но за это придётся заплатить большим количеством вычислений, так что выигрыш не гарантирован. Поэтому, я пока не спешу её пробовать. Скрее всего попробую её позже, когда возьмусь за перевод модели с float значений на int, в надежде сделать симуляцию детерминированной.
Да, поэтому предлагали переходить на int-значения. Разные видеокарты могут по-разному работать с float. Потеряю в точности, но совсем незначительно. Зато будет шанс сделать симуляцию детерминированной вне зависимости от видеокарты.
Вы правы, если дать больше свободы, то будет больше будет лазеек для срезания углов. Но по сути, это лишь повышает требования к дизайну уровней. Свобода разрушений может обогатить пространство стратегий, не разрушив, а расширив ограничивающие условия игровой механики.

Простой пример: дать ограниченое число патронов для мощной пушки. Будет выбор: проломить стену и обойти врага или сохранить их для битвы с боссом. Впрочем, я только начал делать уровни кампании и тестировать задумки. Возможно, многие из них окажутся непрактичны из-за открывающихся коротких путей.
Ага, я сейчас так и поступаю, пик потенциала срезан, вместо него плато, куда попадают самые быстрые частицы, хотя для большинства части градиент силы вычисляется на неискажённом участке кривой вблизи равновесия между отталкиванием и притяжением. У меня ещё несколько подобных хитростей использовано там и сям, так что можно сказать, что исчерпан весь диапазон возможностей увеличения жёсткости материи без оплаты производительностью.
Вы правы, если сделать большой мир, но просчитывать только кусок в видимой области, то ограничения по размеру мира снимутся. Именно в этом направлении я планирую развивать свой движок. Но это уже после того, как доделаю игру. А то на новые эксперименты времени уйдёт много.

SoA прикольно выглядит, спасибо за ссылку.

А из интересного я недавно видел вот такую штуку: там тоже материя из частиц, но в 3д и с VR.
Для просчёта частиц, собственно, и считаются связи между ними. Но на уровне связей прочность можно увеличить только ценой производительности. Так что я пошёл на компромисс с «костями». Чтобы добиться большей прочности, и сделать игру играбельной на слабых видеокартах.

Но у костей есть и дополнительная роль, они анимируют мостики. Так что их существование оправдано расширением геймплея.
Такое станет возможным лет через десять, если темпы развития вычислительных мощностей не ослабнут. Тогда можно будет строить действительно сложный трёхмерный мир из десятков миллионов частиц. Пока частиц лишь десятки тысяч, этого маловато для описанного вами геймплея.
Я вначале экспериментировал с моделью без частиц, с полем векторов, с динамикой жидкости. Но меня эта модель не устроила, для описания земли лучше подошла модель с частицами. Всё же идеал — это твёрдое тело. Пусть он не достижим из-за слишком большого шага, но приближение меня устроило. «Бетон» качается и ходит волнами, но даже в виде горизонтальной балки он держит танк игрока, и это примерно то, чего я хотел получить.
1. Интегратор тривиальный, кажется это называется методом Эйлера. К координатом на каждом шагу прибавляются значения скоростей. А скорости обновляются с учётом действующих сил.

2. Уже доступна на раннем доступе в стиме для винды, в конце поста ссылочка есть.
Я сразу решил, что реализм на первом месте. Так что выжигания не будет, земля будет разлетаться. Но диапазон типов оружия я расширю со всем уважением к богатству оружия в скорче.
Да, что-то в ней есть. Но я в любом случае что-то буду менять с выводом пикселей на экрен. Либо доводить до большей гладкости, либо стилизовать эти пиксели до чего-то более упоротого.
Симуляция в данный момент недетерминированая, так что у игроков с каждым шагом ситуация будет развиваться немного по-разному. Сонхронизация при таком количестве объектов, действительно, непрактична.

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

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

А если не получится с детерминированностью, буду мудрить с оптимизацией синхронизации, это будет сложно, но очень хочется мультиплеер, можно заморочиться.
Я тоже вдохновился именно The Powder Toy.

Сделал в Юнити, на compute shader. Код шейдера пишется на HLSL, и юнити компилит его на directX или openCL. Так что на вполне AMD работает. А новая версия даже умеет компилить под Metal.
В новой версии Юнити появилась возможность копилить compute shader под Мак. Так что теоретически я могу выпустить игру для Мака. И планирую жто сделать, но не сразу, хочется сначала доделать до окончательной версии. Так что через пару месяцев только.
Да, чем больше точек-частиц, тем больше, собственно, материи, из которой всё лепится. Но чем их больше, тем выше вычислительная нагрузка и ниже скорость работы. Так что я примерно по 20-30 тысяч частиц на уровень использую, чтоб с моей видеокартой работало. А если б я ориентировался на самые мощные модели, типа GTX 1080, можно было бы хоть 100К частиц использовать.

А почитать об этом, кроме упомянутого первого поста на хабре, можно ещё в моём посте на пикабу.
Ход разработки — в r/Unity3D и в r/Unity2D

А просто гифки, чтобы заинтересовать игроков, постил в r/Gaming, там аудитория шире.
Твёрдые объекты, усиленные костями есть. Например, тот же танк:

image

Многие здания на уровнях внутри тоже усилены.

Но это не помогло бы увеличить шаг с сохранением твёрдости. Кость задаёт расстояние между парой частиц, все друг к другу не закрепишь. А события, нарушающие закон созранения энергии происходят по всему объёму. И если увеличить шаг, кости не спасут материю от спонтанной детонации.
Нейросети медленно развиваются, и пока умеют только довольно специфические вещи. Но в принципе сетевая топология вычислителей на нечёткой логике — это то, что рано или поздно сможет делать всё, что умеет мозг. Нейросети сейчас на той же стадии технологического взросления, как первые самолёты братьев райт. До мёртвых петлей и сверхзвука далеко, но понятно, что всё будет.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity