Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Нютоновская физика в моем клоне agario.

Нютоновская физика в моем клоне agario.

Поделиться

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

sbaПользовательwww27 июня 201621:06#0
Выкатил первую версию с физикой, вместо предыдущего варианта с равноускоренным движением. Код стал заметно проще. Но у меня возникли вопросы, на которые я не могу самостоятельно найти ответ. Возможно у меня проблема банально в неправильно подобранных коефициентах, но скорее всего я что-то не учел. Прошу сильно не пинать, так как я ниразу не физик, а в школе учился давно и видимо плохо.

Буду задавать вопросы по модели движения ячеек игрока.
Движение PlayerCell задается двумя составляющими. Результирующий путь равен сумме составляющих.

  • Равномерное движение ячеек игрока следом за указателем мыши. Скорость ячейки зависит от массы. Эта часть никак не связана с физикой.
  • Физическая часть

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

В физической части задействованы следующие силы, с указанием коефициентов для PlayerCell:

  • Сила трения = mass * frictionRatio
  • Сила лобового сопротивления = radius * radius * resistanceRatio
  • Сила притяжения = (m1 + m2) / distance * elasticityRatio
  • Сила отталкивания = min(m1, m2) * (radius - distance) * elasticityRatio

frictionRatio = 25.0;
resistanceRatio = 25.0
elasticityRatio = 30.0

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

void Cell::simulate(float dt)
{
  const auto& config = room.getConfig();
  force -= velocity.direction() * (mass * config.frictionRatio + radius * radius * config.resistanceRatio);
  Vec2D acceleration = force / mass;
  Vec2D prev = velocity;
  velocity += acceleration * dt;
  if (std::fabs(1 + velocity.direction() * prev.direction()) <= 0.001) {
    velocity.zero();
  }
  position += velocity * dt;
  force.zero();
}

void PlayerCell::simulate(float dt)
{
  Cell::simulate(dt);
  position += direction * (speed * speedRatio * dt);
  if (m_recombinationTime > 0) {
    m_recombinationTime -= dt;
    if (m_recombinationTime <= 0) {
      m_recombinationTime = 0;
      m_recombined = true;
    }
  }
}

void Player::simulate(float dt)
{
  const auto& config = m_room.getConfig();
  for (auto it = m_cells.begin(); it != m_cells.end(); ++it) {
    PlayerCell& first = **it;
    for (auto jt = it + 1; jt != m_cells.end(); ++jt) {
      PlayerCell& second = **jt;
      auto distance = geometry::distance(first.position, second.position);
      auto direction((first.position - second.position).direction());
      if (first.isRecombined() && second.isRecombined()) {
        if (distance) {
          auto mass = first.mass + second.mass;
          auto k = mass / distance * config.elasticityRatio;
          first.applayForce(direction * -k);
          second.applayForce(direction * k);
        }
      } else {
        auto radius = first.radius + second.radius;
        if (distance < radius) {
          auto mass = std::min(first.mass, second.mass);
          auto l = radius - distance;
          auto k = mass * l * config.elasticityRatio;
          first.applayForce(direction * k);
          second.applayForce(direction * -k);
        }
      }
    }
  }

  float radius = m_radius > config.radiusSlowdown ? m_radius : config.radiusSlowdown;
  float length = m_pointer.length();
  float speedRatio = 1;
  if (length < radius) {
    float radiusImmobility = 0.2 * m_radius;
    if (radiusImmobility < config.radiusImmobility) {
      radiusImmobility = config.radiusImmobility;
    }
    speedRatio = length <= radiusImmobility ? 0 : (length - radiusImmobility) / (radius - radiusImmobility);
  }
  auto destination = getDestination();
  for (PlayerCell* cell : m_cells) {
    if (m_pointerModified) {
      cell->direction = (destination - cell->position).direction();
      cell->synchronized = false;
    }
    if (std::abs(cell->speedRatio - speedRatio) > 0.1) {
      cell->speedRatio = speedRatio;
      cell->synchronized = false;
    }
    cell->simulate(dt);
  }
  calcParams();
  m_pointerModified = false;
}

bool Room::splitCell(PlayerCell& cell, const geometry::Vec2D& point)
{
  if (cell.mass < m_config.playerMinMassSplit) {
    return false;
  }
  auto& obj = createPlayerCell();
  float mass = 0.5 * cell.mass;
  modifyMass(obj, mass);
  modifyMass(cell, -mass);
  auto direction = (point - cell.position).direction();
  obj.position = cell.position + direction;
  obj.color = cell.color;
  obj.recombination(m_config.playerRecombineTime);
  cell.recombination(m_config.playerRecombineTime);
  cell.player->addCell(&obj);
  cell.synchronized = false;
  return true;
}
Чтобы особо не заморачиваться cилы трения и лобового сопротивления реализованы как внутренние силы, все остальные силы - внешние.

Ячейки очень сильно разлетаются. Чем больше масса тем сильнее разлетаются ячейки при разделении или взрыве, хотелось бы меньших скоростей. Но если уменьшить elasticityRatio то при небольшом проникновении ячеек они будут недостаточно отталкиваться.

2. Что я не учел?

3. Жду советы, пожелания, конструктивную критику.

Посмотреть в действии можно тут Cell War.

SuslikМодераторwww27 июня 201621:39#1
sba
> 1. Правильна ли такая модель?
что значит "правильная ли"? правильно или неправильно она может описывать тот или иной физический процесс. ты же пока не удосужился сказать, какой физический процесс ты пытаешься описать, поэтому понятия "правильно" и "неправильно" применять бессмысленно.

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

sba
> Я не смог придумать как в движении игрока обойтись без первой составляющей,
> чтобы он резво менял направление следом за указателем. Когда я пытался
> применять в направлении от центра ячейки к указателю мыши силу тяги получалась
> очень большая инерция. Да и непонятно когда прекращать применять эту силу.
если ты хочешь, чтобы тело body резко начало двигаться в сторону точки pos, то достаточно к нему приложить силу по следующему закону:

Vector2f dstVelocity = (dstPos - body->pos) * velocityCoef; // требуемая скорость, velocityCoef определяет, насколько резко тело должно двигаться к точке
Vector2f dstForce = (dstVelocity - body->velocity) * forceCoef; //результирующая сила. forceCoef определяет, насколько быстро тело должно принять требуемую скорость
body->ApplyForce(dstForce);

можно ещё так:
Vector2f dstForce = (dstPos - body->pos) * elasticityCoef - body->velocity * viscosityCoef;
body->ApplyForce(dstForce);
это — классическая упруго-вязкая модель, при неправильном viscosityCoef она может сильно болтаться, либо разлетаться, поэтому коэффициенты надо подбирать аккуратно.
sbaПользовательwww28 июня 20160:43#2
Конечная цель - реализация на основании физических законов механики как в agario. Так как это просто игра, причем многопользовательская, а не научное моделирование, то многие аспекты желательно максимально упростить. В первую очередь можно жертвовать точностью ради простоты расчетов.

Что конкретно требуется:

  • Тела должны реалистично двигаться.
Готовность: 
foodCell, ejectMassCell - готово. Для разных классов тел введены разные коефициенты для сил. В текущей версии отдельные коефициенты у foodCell. Тоесть все тела резвые, а foodCell достаточно плавные.
virusCell - под вопросом. Если несколько раз  выстрелить в virusCell то последнее весьма сильно ускоряется, хотелось бы сгладить этот эффект. Сейчас визуально virusCell проходит при двойном попадании на много большую дистанцию нежели при двух одиночных, при тройном попадании ситуация еще более усугубляется.

При попадании ejectedMass по virusCell

virus.applayImpulse(direction * (ejectedMass.velocity.length() * ejectedMass.mass * m_config.ejectedMassImpulseRatio));

ejectedMassImpulseRatio = 5

Наибольшая сложность с playerCell, так как у этого тела больше всех требований (требования исключительно для тел одного и того же игрока):

  • (1) Если тела не находятся в состоянии взаимного притягивания то при проникновении друг в друга они должны отталкиваться. Лучше если потери контакта не будет. Тоесть должно быть прилипание.
  • (2) Если тела находятся в состоянии взаимного притягивания то они должны притягиваться.
  • (3) Разделение и взрыв тела должен быть достаточно резвый, но тела не должны разлетаться далеко за пределы видимой части комнаты.
  • (4) Тела игрока должны очень резво менять направление движения вслед за курсором
  • (5) При смене состояния притягивание-отталкивание тела не должно ни болтать ни отталкивать слишком далеко

(3) реализовано посредством (1), но чем больше тело тем сильнее его разбрасывает.
(4) реализовано путем ввода нефизической составляющей движения исключительно для тел playerCell
Пример для (5) - при взрыве тела, все новосозданные тела на следующие 8 сек переходят в состояние ожидания объединения, спустя это время все они начинают притягиваться друг к другу. Спустя некоторое время как минимум одна пара объеденяется и объедененное тело вновь переходит в состояние ожидания объединения, тоесть отталкивает другие тела. А так как другие тела уже скорее всего успели очень к нему приблизиться то происходит очень заметное отталкивание.

Благодарю за формулу dstForce. Годная формула и проста до безобразия.

На всякий случай уточню: какое условие прекращения применения dstForce? Неоходимо реализовать оператор неточного сравнения Vector2f? И применять силу пока dstVelocity неточно не равно body->velocity?

SuslikМодераторwww28 июня 20161:13#3
sba
> На всякий случай уточню: какое условие прекращения применения dstForce?
> Неоходимо реализовать оператор неточного сравнения Vector2f? И применять силу
> пока dstVelocity неточно не равно body->velocity?
ты пишешь такие большие стены текста и будто не совсем на том языке, на каком я их пытаюсь читать, поэтому, извиняй я так и не понял, что ты хочешь местами.

sba
> Если тела не находятся в состоянии взаимного притягивания то при проникновении
> друг в друга они должны отталкиваться. Лучше если потери контакта не будет.
> Тоесть должно быть прилипание.
притягивай тела по закону вроде гравитационного и реализуй разрешение столкновений вроде такого http://www.gamedev.ru/code/articles/PositionBasedPhysics

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

> Если тела находятся в состоянии взаимного притягивания то они должны
> притягиваться.
well, duh. если ты нормально реализуешь предыдущий пункт, этот выполнится автоматически

> ) Разделение и взрыв тела должен быть достаточно резвый, но тела не должны
> разлетаться далеко за пределы видимой части комнаты.
при взрыве суммарный импульс частиц должен совпадать с импульсом родителя до взрыва. чтобы они не разлетались слишком далеко, можешь на какое-то время после взрыва сильно увеличить их взаимное притяжение и/или вязкость. за расталкивание может отвечать либо дополнительный импульс от взрыва, либо прямо position-based расталкивание.

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

> На всякий случай уточню: какое условие прекращения применения dstForce? Неоходимо реализовать оператор неточного сравнения Vector2f? И применять силу пока dstVelocity неточно не равно body->velocity?
никакого условия прекращения нет. много ты видел законов в физике, когда сила притяжения между частицами действует до тех пор, пока что-то там не равно чему-то? формулируй законы так, чтобы сила действовала постоянно, просто при необходимости плавно сходила на "нет", либо компенсировалась другой силой. например, чтобы обеспечить движение частиц пачкой, достаточно ввести функцию притяжения вроде гравитационного взаимодействия и противостоящую ей функцию жёсткого взаимодействия вроде position-based столкновений.

> Конечная цель - реализация на основании физических законов механики как в
> agario. Так как это просто игра, причем многопользовательская, а не научное
> моделирование, то многие аспекты желательно максимально упростить. В первую
> очередь можно жертвовать точностью ради простоты расчетов.
на самом деле самая сложная часть физики agar.io — это физика деформаций, а точнее — взаимодействие деформируемых тел. тебя она, такое чувство, не особо интересует.

PS у тебя для новичка неплохо оформлен код. где ты этому учился?

sbaПользовательwww28 июня 201615:48#4
Suslik
> при взрыве суммарный импульс частиц должен совпадать с импульсом родителя до взрыва
Все мои утверждения исключительно для того чтобы обозначить как сделано сейчас. Я даже наполовину не уверен в их правильности. Поэтому приветсвуются замечания с указанием что конкретно неверно.
Я прикинул что раз тела отталкивают друг друга - значит и без начального импульса они будут разлетаться. И для разделения и для взрыва код однотипный - для того чтобы задать направление разлетания тел при создании я смещаю центр нового тела на единичный вектор от центра родителя. В случае с разделением это вектор в направлении от центра родителя к указателю мыши. Для взрыва для каждого из новых тел выбирается случайным образом вектор направления. Пока никак не регулируется даже не знаю импульс ли, так как его нет. Всмысле все тела могут полететь в одну и туже сторону.
auto& obj = createPlayerCell();
modifyMass(obj, m);
float angle = (m_generator() % 3600) * M_PI / 1800;
geometry::Vec2D direction(sin(angle), cos(angle));
obj.position = cell.position + direction;
С импульсом не все понятно. При взрыве родитель теряет часть массы. Новым телам следует передать суммарно ту часть импульса что соответствует только потерянной родителем массы? Часто при взрыве у родителя нулевая скорость. Импульс равен 0. Именно поэтому сейчас взрыв и разделение сделаны без импульса. Что я упускаю в этих рассуждениях?

На сколько я понимаю равентсво суммарного импульса осколков импульсу родителя нужно для обеспечения продолжения полета осколков в ту сторону куда летел родитель. Но меня эта составляющая не особо интересует. Тело должно просто разрывать. Часть родителя должна оставаться на месте, или продолжать лететь куда летала, а осколки должны распределиться в небольшем радиусе разлета.

Вообще задам главный для понимания вопрос. Обязательно ли придерживаться на все 100% законов физики? Пример:
Благодаря силе отталкивания родителя отбрасывает назад а новое тело соответсвенно летит к курсору. Так как массы равны, то на оба тела действует одинаковая сила. Но родителя отбрасывает назад меньше так как у него была составляющая скорости направленная к курсору. Да сейчас у меня это сделано криво. После того как я переделаю согласно соотношений из поста #1 суть не поменяется. А если поставить задачу чтобы родителя еще меньше отбрасывало назад, какой физический закон можно использовать для этого?

PositionBasedPhysics - годная статья, читал но пока не осилил, решил начать с более простого. Это будет следующий шаг.

Перечисленные мной силы реализованы корректно? Если с трением и сопротивлением все понятно, то вот с притяжением и отталкиванием не совсем.
Сила притяжения = (m1 + m2) / distance * elasticityRatio
Сила отталкивания = min(m1, m2) * (r1 + r2 - distance) * elasticityRatio

1. При больших distance тела очень медленно сближаются.
Я хочу чтобы даже при бездействии игрока (условно считаем что его тела не двигаются) при включении этой силы все тела примерно одинаково сближались и достаточно быстро. Кстати это пример силы которая действует по условию. Эта сила не действует некоторое время после разделения (на разделенные тела) или объеденения (на результирующее тело).
2. Сила притяжения действует одинаково на оба тела, просто с разным знаком. Это верно? Получается при взаимодействии маленького и большего маленькое тело очень быстро двигается.
3. Сила отталкивания. Минимум масс взят с потолка. Иначе большое тело сильно разбрасывло мелких.
4. Притяжение должно действовать независимо от взаимного расположения (сайчас не так)? А отталкивание только при взаимном погружении?

> формулируй законы так, чтобы сила действовала постоянно, просто при необходимости плавно сходила на "нет"
Отталкивание хороший пример. distance -> r1 + r2 сила -> 0. Ума не приложу как эффективно без условия свести силу в 0, ведь дистанция не все время стремится к сумме радиусов, наступает время когда она превышает сумму меняя знак силы на противоположный. Именно для этого у меня и предусмотрено условие.

> на самом деле самая сложная часть физики agar.io — это физика деформаций, а точнее — взаимодействие деформируемых тел. тебя она, такое чувство, не особо интересует.
Она меня пока не интересует. Сразу всего не осилишь. Я начинал этот проект вообще без понимания физики, наивно полагал что можно обойтись равноускоренным движением. Возможно я опять ошибаюсь по поводу как сделано в agar.io. Но я полагал что взаимодействие на сервере стоит упростить до взаимодействия кругов. На клиенте на основании глубины проникновения рисовать красивости в виде деформаций.

> ты как-то всё очень сильно усложняешь и пытаешься свести к частным случаям
Это мой первый проект с использованием физики, в этой области у меня пока еще совсем нет опыта. С помощью википедии и здешних статей слегка обновил школьные знания.
> PS у тебя для новичка неплохо оформлен код. где ты этому учился?
Я новичек в физике. Физику никогда не писал, готовыми движками не пользовался. А так то я вовсе и не новичек, многолетний опыт разработки браузерных игр, в том числе несколько демонов на С++ для серверной части MMO.

Правка: 28 июня 2016 16:27

PANDAПостоялецwww28 июня 201619:42#5
sba
> Тела должны реалистично двигаться
дай угадаю: гуманитарий?
SuslikМодераторwww28 июня 201620:07#6
sba
> Перечисленные мной силы реализованы корректно? Если с трением и сопротивлением
> все понятно, то вот с притяжением и отталкиванием не совсем.
> Сила притяжения = (m1 + m2) / distance * elasticityRatio
> Сила отталкивания = min(m1, m2) * (r1 + r2 - distance) * elasticityRatio
брехня же, ну. не бывает в природе силы, действующей по такому закону. если ты хочешь чтобы объекты двигались группой, притягиваясь, но не пересекаясь, то, как я уже говорил, реализуй для них силу притяжения и упругое взаимодействие при столкновении.

> Вообще задам главный для понимания вопрос. Обязательно ли придерживаться на все
> 100% законов физики?
скажем так. важно на 100% понимать, что ты делаешь. если иногда тебе нужно просто обнулить скорость тела, то это, хоть и нефизично, может быть полезно. но формулам вроде "Сила отталкивания = min(m1, m2) * (r1 + r2 - distance) * elasticityRatio" оправдания никакого нет, это совсем ерунда.

> PositionBasedPhysics - годная статья, читал но пока не осилил, решил начать с более простого. Это будет следующий шаг.
проще position-based вообще ничего нет. если ты считаешь, что что-то написано невнятно, то скажи, что именно и я постараюсь переписать/переформулировать, объяснить, на худой конец.

> Я новичек в физике. Физику никогда не писал, готовыми движками не пользовался.
> А так то я вовсе и не новичек, многолетний опыт разработки браузерных игр, в
> том числе несколько демонов на С++ для серверной части MMO.
а, ну понятно. я уж обрадовался, думал, сейчас этому где-то на ранних этапах учат.

sbaПользовательwww28 июня 201621:12#7
Suslik
>брехня же, ну. не бывает в природе силы, действующей по такому закону.
Это результат совета из соседней ветки http://www.gamedev.ru/code/forum/?id=215395#m3 - добавить силу отталкивания кружков.
Я хочу чтобы тела не только двигались группой, но и еще обтекали друг друга. Весьма явно эффект должен проявляться для группы из большого и маленького тела разположенного сзади. Маленькое тело должно почти с собственной скоростью облетать большое по более короткому пути в направлении движения.

> если ты хочешь чтобы объекты двигались группой, притягиваясь, но не пересекаясь
Тела должны сильно притягиваться только при условии что оба готовы соединяться. Погружение соединяющихся тел должно ограничиваться коефициентом от 0 (соединения нету, упругое столкновение) до 1 (полное погружение). Не доходя до 1 тела соединятся так как сработает условие поглощения.

> реализуй для них силу притяжения и упругое взаимодействие при столкновении.
Это я уже понял, буду делать на основании PositionBasedPhysics. Статья не сложная, все изложено в очень доступной форме.
Мне сложно сейчас предствить достаточно ли этого и для обтекания, поэтому уточняю так ли это?

Получается эта сила притяжение должна действовать всегда? Потому как она не может зависить от любых условий. Возможно для слияния тел надо вводить еще одну силу притяжения, с большим значением, которая будет задействована по условию? Тела которые условно находятся очень далеко тоже должны объединяться, соответственно притягиваться. Похоже на пружину.
Пример. Игрок вышел из игры. По моей задумке его тела останавливаются.  Другие игроки могут взорвать такое тело, все части также достаточно быстро остановятся, и относительно далеко друг от друга. Представим что эти части так никто и не поглотит. Через некоторое время они должны начать воссоединяться.

SuslikМодераторwww28 июня 201621:24#8
sba
> > рехня же, ну. не бывает в природе силы, действующей по такому закону.
> Это результат совета из соседней ветки
> http://www.gamedev.ru/code/forum/?id=215395#m3 - добавить силу отталкивания
> кружков.
ну классно ты спихнул на смайла свой креатив с формулой с минимумом.

> Я хочу чтобы тела не только двигались группой, но и еще обтекали друг друга.
> Весьма явно эффект должен проявляться для группы из большого и маленького тела
> разположенного сзади. Маленькое тело должно почти с собственной скоростью
> облетать большое по более короткому пути в направлении движения.
я не понимаю, чего ты хочешь. в agar.io физика группового движения предельно проста, я её уже кучу раз тебе описывал. запиши видос с тем эффектом, который, как ты считаешь, она не описывает.

> Мне сложно сейчас предствить достаточно ли этого и для обтекания, поэтому
> уточняю так ли это?
мне кажется, в твой ситуации нужно просто получать опыт работы с любой околоигровой физикой вроде position-based и подобные вопросы должны в принципе перестать возникать. ты постоянно описываешь следствия из физических эффектов, пытаясь их моделировать напрямую. а моделировать надо лежащие в основе законы — притяжения и отталкивания(столкновений), всё остальное получается само собой в качестве следствия.

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

насколько я помню, там тела всегда взаимодействуют по одному и тому же закону, но сливаться воедино они могут, только если прошло определённое время после их разъединения. в физике взаимодействия agar.io принципиальную роль, повторяю, играет деформируемость самих шаров, которую ты по-прежнему даже не начал пытаться моделировать, хотя именно она представляет наибольшую сложность. однако, position-based прекрасно подходит и для реализации деформируемых тел, читай статью.

sbaПользовательwww28 июня 201621:44#9
Suslik
> в agar.io физика группового движения предельно проста
С групповым движением все понял.

> эффектом, который, как ты считаешь, она не описывает.
Интуитивно, и на основании того что я уже пощупал понимаю что коефициент для силы притяжения которая будет уравновешивать position-based физику будет слишком слаб чтобы быстро столкнуть тела с разных концов комнаты.
В agar.io скорее всего такого нету. Простая задача. Два тела, возможно с нулевой скоростью, возможно очень далеко друг от друга. Требуется по прошествии определенного времени просто соединить их. Вместо игрока, если он не удосужился. Поэтому я и спрашиваю возможно стоит просто ввести еще одну силу чтобы толкать тела навстречу друг другу когда настанет на то время? Вопрос что это за сила? В принципе тела игрока не должны так далеко находиться друг от друга, но все равно есть хотелка чтобы работало и для этого случая.

> в физике взаимодействия agar.io принципиальную роль, повторяю, играет деформируемость самих шаров
Не подозревал что там сделано именно так. Думал можно сделать проще, тоесть только имитировать деформацию, вместо просчитывать. Вопрос интересный, есть материал по этому вопросу?
Получается мне стоит отказаться от поиска алгоритма для частичного погружения тел на сервере и моделирования деформаций на клиенте?

PS. Может я слишком уж глупые вопросы задаю, просто никогда в этом направлении не думал.

SuslikМодераторwww28 июня 201622:03#10
sba
> Получается мне стоит отказаться от поиска алгоритма для частичного погружения
> тел на сервере и моделирования деформаций на клиенте?
на самом деле тут я не особо уверен, считают они на сервере физику деформаций или нет. трудно сказать, но если её считать, то это существенно гомогенизирует задачу и не надо будет один и тот же код дважды по-разному писать.

sba
> Интуитивно, и на основании того что я уже пощупал понимаю что коефициент для
> силы притяжения которая будет уравновешивать position-based физику будет
> слишком слаб чтобы быстро столкнуть тела с разных концов комнаты.
> В agar.io скорее всего такого нету.
ну тогда притягивай их не по обратно-квадратичному закону, а по любому другому, например, вроде того, что я описывал в первом посте. принципиальный момент заключается в том, что притягиваются тела как угодно, а отталкиваются они за счёт физического столкновения друг с другом, отсюда и все сопутствующие эффекты.

sbaПользовательwww28 июня 201622:12#11
Suslik
Понятно, я получил много полезной информации, благодарю за проявленое терпение и подробные ответы. Ушел пилить код.
sbaПользовательwww15 июля 201614:26#12
Suslik
Я меня осталось непонимание как применять импульс. Кстати в статье этого нет и полагаю будет полезно дополнить статью этим пунктом.
В velocity-based подходе все достаточно просто - тело владеет свойством velocity, которое мгновенно меняет значение при придании телу импульса:
void Cell::applayImpulse(geometry::Vec2D value)
{
  velocity += value / mass;
}

В position-based подходе использую вариант с deltaPosition - чтобы была возможность задавать скорость.
void Cell::applayImpulse(geometry::Vec2D value)
{
  impulse += value;
}

void Cell::simulate(float dt)
{
  Vec2D acceleration = force / mass;
  deltaPosition += acceleration * dt * dt;
  if (impulse) {
    deltaPosition += impulse * (dt / mass);
    impulse.zero();
  }
  position += deltaPosition;
}
Выше все верно? Мгновенное изменение скорости выносит мозг, а как записать формулу иначе не знаю. Я подставил velocity = impulse / mass в формулу deltaPosition = velocity * dt.
SuslikМодераторwww15 июля 201615:08#13
sba
с точки зрения физики рассуждения более-менее верные. однако, с точки зрения архитектуры нет смысла хранить отдельно импульс и смещение, достаточно в Cell::applyImpulse сразу моифицировать значение deltaPosition
sbaПользовательwww15 июля 201615:34#14
Suslik
> достаточно в Cell::applyImpulse сразу моифицировать значение deltaPosition
Как это сделать не зная шага интегрирования? Ведь в месте применения импульса мы не знаем этого. Понятно что на самом деле шаг интегрирования фиксированный и известный, но не передавать же его в Cell::applayImpulse или хранить в объекте или еще что велосипедить.

> рассуждения более-менее верные
Что-то подозрительно. Я опять что-то упускаю из виду?

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

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

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