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

Симуляция повреждений

Страницы: 1 2 3 Следующая »
#0
14:21, 5 сен 2012

Имеем 2 объекта, они сталкиваются. Необходимо рассчитать величину повреждения каждого объекта (меня интересует именно значение насколько нужно понизить ХП, жизнь то есть). Насколько я понимаю, каждый объект должен обладать какой-то прочностью. Ведь могут быть большие объекты из стекла, и маленькие из титана. Если я правильно понял, повреждения должны считаться как-то так же как и импульсы для отталкивания тел. Вот только с чем оперировать? С относительной нормальной скоростью тел в точке прикосновения? Или с силой возврата тел? Как вообще посчитать величину урона?

#1
15:16, 5 сен 2012

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

#2
15:25, 5 сен 2012

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

#3
16:01, 5 сен 2012

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

#4
16:08, 5 сен 2012

Спасибо, то что и хотел услышать.

#5
12:41, 10 сен 2012

Все равно как-то не получается. Вот есть игрок, есть пол. Первый имеет вес 50, другой - бесконечность. Считаем импульс. Он равен 1 / (1/m1 + 1/m2), то есть 50 в данном случае. Относительная скорость объектов 1 м/с. Допустим, игрок получает урон 50%. Берем другого игрока с весом 100. Импульс равен 100. В данном случае игрок получит по формуле урон 100%. То есть чем больше масса игрока, тем больше урон? Он по-идее должен быть одинаковым. Иначе совсем легкие персонажи будут вообще прыгать с крыш без проблем.

Далее, берем пулю. Вес 0.1. Игрок весит 50. Импульс равен 0.099. Если бы пуля летела со скоростью 1 м/с, то игрок бы получил урон 0.099. Но допустим скорость пули 100 м/с. Значит игрок получает урон 9.9. То есть игрок, который столкнется со стеной на скорости 1 м/с умрет, а от пули получит незначительный урон. При этом жирный игрок с массой 150 кг от пули умрет гораздо быстрее, чем мелкий. А если в игре будут карлики массой 10 кг, то они будут практически неуязвимы.

#6
12:55, 10 сен 2012

"Иначе совсем легкие персонажи будут вообще прыгать с крыш без проблем."

А так и есть.

"То есть игрок, который столкнется со стеной на скорости 1 м/с умрет, а от пули получит незначительный урон."

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

#7
13:06, 10 сен 2012

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

#8
14:08, 10 сен 2012

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

#9
14:10, 10 сен 2012

Suslik
> думаешь, почему кошка может упасть с пятого игрока и выжить, а тигр - нет?
Lol )))))

> стопы игрока в два раза больше размером больше,
Что то пошло не так xD

#10
14:11, 10 сен 2012

да, вот fzr125 с высоты собственного роста упал и еле выжил. спроси у него, он тебе расскажет.

#11
14:13, 10 сен 2012

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

#12
14:21, 10 сен 2012

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

#13
14:32, 10 сен 2012

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

я думаю, что ты хочешь получить примерно такую формулу:

float damage0 = contact->impulse / (min(contact->body0->avgCrossSection, contact->body1->avgCrossSection) * contact->body0->mass);
float damage1 = contact->impulse / (min(contact->body0->avgCrossSection, contact->body1->avgCrossSection) * contact->body1->mass);

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

float damage0 = contact->deltaVelocityProjection / (min(contact->body0->avgCrossSection, contact->body1->avgCrossSection));
float damage1 = contact->deltaVelocityProjection / (min(contact->body0->avgCrossSection, contact->body1->avgCrossSection));

здесь под deltaVelocityProjection считается изменение полной скорости(учитывая вращение) контактирующих точек в проекции на нормаль контакта. если в контакте есть трение, то, возможно, имеет смысл изменения векторно сложить и потом считать урон.

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

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

#14
15:06, 10 сен 2012

Я пытался решать эту задачу на странице 51 и дальше. Всё написанное не является догмой или непреложной истиной.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.