Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Формула затухания силы взрыва (http://www.flasher.ru/forum/showthread.php?t=171809)

Alexmody 24.11.2011 20:13

Формула затухания силы взрыва
 
Реализую в флеш игре взрыв.
Есть три переменные: power (сила), distance (дистанция), vec (нормированный вектор, указывает направление взрыва.
Сейчас считаю итоговую силу взрыва (импульс) так: power / distance * vec. Не нравится, как получается затухание, чем ближе объект к источнику взрыва, тем более непропорционально увеличивается сила (особенно когда почти впритык).
Подскажите? какую формулу в данном случае лучше использовать, для пропорционально силы взрыва в зависимости от дистанции (затухание).

Silicium 24.11.2011 20:31

Давайте для начала определимся с терминами - а уж с физикой справимся на раз-два).
во-первых, что есть вообще направленный взрыв?
Вообще советовал бы даже не вдаваясь в подробности использовать экспоненту типа exp(-k*distance) для затухания (если взрыв направленный - как я его понимаю - плоская взрывная волна, затухает только за счет рассеяния). Для всенаправленного взрыва использовать distance^-1.

Alexmody 24.11.2011 20:53

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

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

Для всенаправленного взрыва использовать distance^-1.

Т.е. получается power / (distance ^ -1) * vec

Мне вот посоветовали что-то подобное: power / (distance ^ k) * vec, где k подбираемое число из диапозона [1 : 2].

Объясните пожалуйста почему у вас возводится в степень -1, а во втором случае предлагается диапазон от 1-2?

alatar 24.11.2011 21:24

^ это не возведение в степень, это XOR.

i.o. 24.11.2011 21:31

Ну вот яркость света для наблюдателя рассчитывается, как яркостьИсточника / квадратРасстоянияДоНаблюдателя. Расстояние в метрах, яркость в люменах (по-моему).
Думаю и со взрывом будет наподобие вышеизложенного.

alatar 24.11.2011 21:41

Взрыв, все таки, не свет.
http://www.pirotek.info/Start/pascetmocnosti.htm

i.o. 24.11.2011 21:46

Все равно стоит ознакомиться с http://ru.wikipedia.org/wiki/%D0%97%...82%D0%BE%D0%B2

-De- 24.11.2011 21:48

Вообще 1/(r*r) в физике растёт из того, что если вот есть сферический взрыв в вакууме, то число частиц, пролетающих через единицу площади сферы вокруг этого взрыва пропорциональна 1/r^2 (r - радиус сферы). В плоском случае (когда не сфера а круг и речь идёт о числе частиц, пролетающий через единицу длины окружности) - 1/r. В невесомости в вакууме импульс, который передадут эти частицы так же меняется с расстоянием (потому что частицы взрыва летят равномерно и прямолинейно).
PS: в игре на самом деле подойдёт почти любая неотрицательная убывающая функция) Только советую, если расстояние больше некоторого, то взрыв на тело не применять вообще.

Silicium 25.11.2011 02:26

^ - ЭТО Я как раз возведение в степень имел ввиду, а -1 - так это я ошибся. В знаменателе квадрат конечно должен быть

Alexmody 25.11.2011 20:50

Вообщем поэкспериментировал, построил графики с помощью ресурса: http://www.yotx.ru/default.aspx сделал следующие выводы:

В формулах опущу умножение на vec (направление).
y = 1/(x^k) - меняем k в диапазоне 0-1, хорошая формула. Если подставлять в k отрицательные значения, то будет: "чем дальше объект от центра взрыва, тем сильнее он будет получать, что конечно неправильно"
y = 1/sqrt(x^(k)) - меняем k в диапазоне 0-1, на основе вышеприведенной с корнем, тоже интересный результат выходит, хотя наверное лишнее
-----------
y=1/sqrt(x) - не особо пропорциональное увеличение силы взрыва к центру + без настроек коэффициента, ниже два схожих варианта гораздо лучше
y=1/(1+sqrt(x)), неплохой вариант, но еще лучше
y=1/(k+sqrt(x)) - меняем k в диапазоне 0-1, вот эта формула очень понравилась, дает хороший и гибкий в настройке вариант.

Победители:

y = 1/(x^k) - меняем k в диапазоне 0-1
y=1/(k+sqrt(x)) - меняем k в диапазоне 0-1

Всем спасибо, великолепно помогли.


Часовой пояс GMT +4, время: 21:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.