Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Демпфер пружины двух вокселей металла

Демпфер пружины двух вокселей металла

Поделиться

Страницы: 1 2 Следующая

iperovПостоялецwww23 мар. 201722:29#0
2 вокселя связаны пружиной с коэф. жесткости металла например стали, 200e9 * S / len

step() модели по каждым линкам (линк = 2 вокселя) раздаёт вокселям добавление F взависимости от их положения (-kx)

второй проход в том же step() переводит F в ускорение , затем скорость, затем смещение позиции вокселя от времени t. Шаг времени 0.0000001с

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

Как вообще гасить колебания в данном случае?

__sergeyПостоялецwww24 мар. 201717:20#1
Решать с помощью backward(implicit) Euler вместо forward (explicit). Здесь можно посмотреть формулу (6). Здесь было что-то подобное.
MikleМодераторwww25 мар. 201718:11#2
iperov
> Подбор методом тыка коэффициента демпфера мне не подходит! Т.к. в системе
> разные металлы, разные сечения и длины, и подбирать под каждое это бред.
Если сделать демпфер на уровне вокселя, то сечение и длина - эти проблемы отпадут, а разные металлы - так у них и должны быть разные характеристики.
Я занимался эмуляцией колебаний струны и пришёл к такому демпферу: на каждый воксель действует сила, пропорциональная скорости вокселя относительно усреднённой скорости его соседей (с которыми он связан) со знаком минус.
__sergeyПостоялецwww25 мар. 201718:55#3
Если речь идет только о двух нодах, можно посмотреть здесь https://www.gamedev.net/resources/_/technical/math-and-physics/to… -spring-r3227
SuslikМодераторwww26 мар. 20170:45#4
воксели — это не то. то, что ты делаешь, назывется точечными массами. если их всего две, то для произвольной жёсткости и вязкости есть аналитическое решение, которое никогда не разваливается. если масс больше двух, то система полученных диффуров называется жёсткой и решать её надо по-особенному.

самый простой способ — использовать position-based verlet: http://www.gamedev.ru/code/articles/PositionBasedPhysics он даст очень устойчивый результат для любых значений жёсткости, но энергия будет утекать из системы. для моделирования в принципе жёстких связей, вообще без колебаний, используется constraint-based dynamics: http://www.gamedev.ru/code/articles/?id=4706

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

Правка: 26 мар. 2017 0:47

iperovПостоялецwww4 апр. 201713:50#5
это математический язык
мне бы на программерском языке
SuslikМодераторwww4 апр. 201715:06#6
давно это под "программерским языком" понимается "скоммуниздить код"?
iperovПостоялецwww4 апр. 201716:06#7
ну мат. формулы для вас это открытый код. Для меня это отсутствие времени, чтобы изучить пробелы в вышке.
Вы против опенсорса? Я считаю опенсорс это двигатель прогресса. Мы же не изобретаем велосипеды заново, а пользуем то, что гуглится.
Я многое перерыл, но так и не нашел программинг-описания как демпферить два элемента связанные пружиной на уровне "кристаллической решетки" по young modulus.
В существующих игровых физ движках жесткость и гашение пружины задаётся методом подгона, либо гасят об "вязкий вакуум".
В САПРах используют не воксели, а тетраэдры. Опять же опенсорс солверов решающих нелинейную динамику этих тетраедров в пространстве с коллизиями и деформациями (к примеру сапр Abaqus или Ansys) - я не нашел.
Поэтому и прошу объяснить на псевдокоде.
к примеру
class VoxelLink
{
  Voxel vox1;
  Voxel vox2;
  double k; // = ES / L0
  double rest_length;
}

class Voxel
{
  Vector3D pos;
  Vector3D F;
  Vector3D V;
  double mass;
}

step( double delta_time )
{

  

}
ReviriПостоялецwww4 апр. 201716:25#8
iperov
> Для меня это отсутствие времени, чтобы изучить пробелы в вышке.
> Вы против опенсорса? Я считаю опенсорс это двигатель прогресса. Мы же не
> изобретаем велосипеды заново, а пользуем то, что гуглится.

Хорошо стоять на плечах гигантов, но что делать будем когда они перестанут держать небо?

iperovПостоялецwww4 апр. 201716:28#9
ничего, просто не будут выпущены новые прекрасные программы, которые так же кому-то помогли бы.

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

Правка: 4 апр. 2017 16:32

SuslikМодераторwww5 апр. 20173:20#10
iperov
> Я многое перерыл, но так и не нашел программинг-описания как демпферить два
> элемента связанные пружиной на уровне "кристаллической решетки" по young
> modulus.
тебе уже кучу ссылок привели. в посте #3 — самая напальцевая ссылка, проще уже некуда. если даже это не помогает, то тебе проще не тратить своё и чужое время и просто заплатить нормальному программисту.

> Для меня это отсутствие времени, чтобы изучить пробелы в вышке.
если ты собрался заниматься вычислительной физикой (сам), то восполнение пробелов в вышке — это первое, чему имеет смысл уделять время. если по приведённым ссылкам что-то конкретное непонятно, то задавай вопросы и тебе конкретно объяснят. на запросы "я ничего не понимаю, просто дайте мне код" никто не ответит. и проблема здесь явно не в русскоязычности сегмента.

Правка: 5 апр. 2017 3:23

iperovПостоялецwww5 апр. 20177:33#11
Suslik
если не можешь помочь, просто проходи мимо, не нужно флудить в теме.
iperovПостоялецwww5 апр. 20177:33#12
вопрос коммента #7 актуален.
__sergeyПостоялецwww5 апр. 201710:59#13
Вам тут предложили практически все существующие методы. Если хотите посмотреть примерный код того, что, как мне кажется, вы ищите, можете скачать исходники rigs-of-rods, например. Если у вас нет времени разбираться в исходниках, я приведу конкретное место, где стоит посмотреть. Они демпфируют уменьшая силу в зависимости от взаимной скорости нодов.
Vector3 v = beams[i].p1->Velocity - beams[i].p2->Velocity;
float slen = -k * (difftoBeamL) - d * v.dotProduct(dis) * inverted_dislen;
Если будет время, можете найти на ютубе rigs of rods и посмотреть подходит ли вам.
rigs-of-rods-master\source\main\physics\BeamForcesEuler.cpp 
void Beam::calcBeams(int doUpdate, Ogre::Real dt, int step, int maxsteps, int chunk_index, int chunk_number);

Правка: 5 апр. 2017 11:03

__sergeyПостоялецwww5 апр. 201711:35#14
iperov
> Опять же опенсорс солверов решающих нелинейную динамику этих тетраедров в
> пространстве с коллизиями и деформациями (к примеру сапр Abaqus или Ansys) - я
> не нашел.

Ну здесь посмотрите https://github.com/mmmovania/opencloth
и здесь в частности https://github.com/mmmovania/opencloth/blob/master/OpenCloth_CoRo… _FEM/main.cpp

Как изменить conjugate gradient для решения коллизий можно посмотреть в Large Steps in Cloth Simulation. Ссылка в #1

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Физика

2001—2017 © GameDev.ru — Разработка игр