09.02.2010, 12:23 | #281 | ||||
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
в общем почитываю тему. имхо, использование инженерного подхода и качественных источников делает етот мод весьма привлекательным для реализации. я бы его включил в свой реал пак
в чем конкретно проблемы с реализацией? что нужно конкретно сделать для реализации? типовые данные о бомбе: Цитата:
Цитата:
данные о бомбах нужны? Цитата:
Цитата:
|
||||
09.02.2010, 13:35 | #282 |
Местный
Регистрация: 29.11.2009
Сообщений: 649
|
|
09.02.2010, 14:27 | #283 |
Звуковых дел мастер
|
Ага, а помимо того чтобы ввести пару констант, нужно полностью изменять физ модель взрыва в игре... что мне кажется и сильно повлияет на воздействие ОФЗ на самолеты....
Мое имхо, проще отработать то что есть. Ебо мусолить формулы это одно, а практически реализовать - совершенно другое. P.S. Трудно картинку в джепег пережать?
__________________
Апдейты на мод можно проверить здесь http://www.mediafire.com/?sharekey=3...129846a9fea912 Последний раз редактировалось SG2_Wasy; 09.02.2010 в 14:37. |
09.02.2010, 14:40 | #284 | |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Цитата:
именно этот параметр и отвечает за тип бомбы, насколько я помню. Существующих параметров вполне хватит, не надо ничего добавлять углублять и расширять! Изменение ДМ объектов - совершенно другая тема, хотя и зависимая. Если мы сумеем ввести в формулы тип бомбы, то вполне реально подогнать юомбы ближе к правильной зависимости. Заметьте - я говорбю о зависимости, а не реальных параметрах поражения. В общем хорошо бы, чтоб толковый перец свел в одну кучу всё что обсчитывается сейчас в игре. Чтоб знать от чего оттолкнутся. Последний раз редактировалось JGr124_boRada; 09.02.2010 в 14:46. |
|
09.02.2010, 14:47 | #285 | |
Звуковых дел мастер
|
Цитата:
Просто взрыв Взрыв с долгим дымом (АЖ-2) Взрыв с пламенем.
__________________
Апдейты на мод можно проверить здесь http://www.mediafire.com/?sharekey=3...129846a9fea912 |
|
09.02.2010, 14:48 | #286 | |
Местный
Регистрация: 29.11.2009
Сообщений: 649
|
Цитата:
|
|
09.02.2010, 14:51 | #287 |
Звуковых дел мастер
|
Нету это ничего в игре, НЕТУ.
__________________
Апдейты на мод можно проверить здесь http://www.mediafire.com/?sharekey=3...129846a9fea912 |
09.02.2010, 15:03 | #288 |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
http://forum.aviaskins.com/showpost....4&postcount=46
Это формулы из игры по крайней мере в них не использован тип бомбы. А если ввести одну переменную=тип бомбы? Расчет будет идти так же по энергии, но её распределение можно в некоторых пределах регулировать. Например для домов тип=0 ( фугас) имеет коэффициент 1, а тип=1( осколочные) 0.5 Для пушек и машин - наоборот. Это очень упрощенно но уже действенно и безболезненно для процессора и программирования. Последний раз редактировалось JGr124_boRada; 09.02.2010 в 15:08. |
09.02.2010, 15:08 | #289 |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
Борада, а из каких классов ты ети формулы то выдрал?
про паур тайп гляну... |
09.02.2010, 15:08 | #290 |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
|
09.02.2010, 16:30 | #291 |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
тэкс, посмарел цепочку.
в общем бомба летит летит летит и встречаеться с землей. происходят всякие перетурьации, и запускаеться вот что Код:
protected void doExplosion(Actor actor, String s, Point3d point3d) { /* 250*/ Class class1 = getClass(); /* 251*/ float f = Property.floatValue(class1, "power", 1000F); /* 252*/ int i = Property.intValue(class1, "powerType", 0); /* 253*/ float f1 = Property.floatValue(class1, "radius", 150F); /* 254*/ MsgExplosion.send(actor, s, point3d, getOwner(), M, f, i, f1); /* 256*/ ActorCrater.initOwner = getOwner(); /* 257*/ Explosions.generate(actor, point3d, f, i, f1); /* 258*/ ActorCrater.initOwner = null; /* 260*/ destroy(); } нас интересует MsgExplosion.send вот он: Код:
{ 00024 explosion.chunkName = s; 00025 explosion.p.set(point3d); 00026 explosion.radius = f2; 00027 explosion.initiator = actor1; 00028 explosion.power = f1; 00029 explosion.powerType = i; 00030 if(i == 1) 00031 explosion.computeSplinterParams(f); 00032 if(!Actor.isValid(actor1) && Mission.isSingle() && (Mission.cur().netObj() == null || Mission.cur().netObj().isMaster())) 00033 explosion.initiator = actor1 = Engine.actorLand(); 00034 if(!Actor.isValid(actor1)) 00035 return; 00036 if(actor1.isNet() && actor1.net.isMirror()) 00037 return; 00038 if(Actor.isValid(actor)) 00039 { 00040 msg.setListener(actor); 00041 msg.send(); 00042 } 00043 if(f2 <= 0.0F) 00044 return; 00045 Engine.collideEnv().getSphere(lst, point3d, f2); 00046 int j = lst.size(); 00047 if(j <= 0) 00048 return; 00049 explosion.chunkName = null; 00050 for(int k = 0; k < j; k++) 00051 { 00052 Actor actor2 = (Actor)lst.get(k); 00053 if(Actor.isValid(actor2) && actor != actor2) 00054 { 00055 msg.setListener(actor2); 00056 msg.send(); 00057 } 00058 } 00059 00060 lst.clear(); 00061 } выделено- там где powertype 1 запускаеться 1 лишний метод(условно моно перевести как "пересчет осколков", т.е. вычисление кол-ва осколков. так что есть разделение ) правда пока неизвестно, рассчитываеться ли повреждение от осколков...мб ето токо заготовка а вот собсна сам код взырвов: Код:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. 00002 // Jad home page: http://www.kpdus.com/jad.html 00003 // Decompiler options: packimports(3) 00004 // Source File Name: Explosion.java 00005 00006 package com.maddox.il2.ai; 00007 00008 import com.maddox.JGP.Point3d; 00009 import com.maddox.il2.engine.*; 00010 00011 // Referenced classes of package com.maddox.il2.ai: 00012 // World, RangeRandom 00013 00014 public class Explosion 00015 { 00016 00017 public Explosion() 00018 { 00019 p = new Point3d(); 00020 } 00021 00022 void computeSplinterParams(float f) 00023 { 00024 float f1 = f * 0.9F; 00025 nSplinters = f1 / 0.015F; 00026 if(nSplinters < 0.5F) 00027 { 00028 nSplinters = 0.0F; 00029 return; 00030 } else 00031 { 00032 return; 00033 } 00034 } 00035 00036 public float computeSplinterSpeed(float f) 00037 { 00038 if(f <= 0.01F) 00039 return 650F; 00040 if(f >= radius) 00041 { 00042 return 150F; 00043 } else 00044 { 00045 float f1 = f / radius; 00046 return 650F * (1.0F - f1) + 150F * f1; 00047 } 00048 } 00049 00050 public void computeSplintersHit(Point3d point3d, float f, float f1, float af[]) 00051 { 00052 float f2 = (float)point3d.distance(p) - f; 00053 if(f2 <= 0.001F) 00054 { 00055 af[0] = nSplinters * 0.5F; 00056 af[1] = computeSplinterSpeed(f2); 00057 } 00058 float f3 = 3.141593F * f * f; 00059 float f4 = 12.56637F * f2 * f2; 00060 float f5 = (nSplinters * f3) / f4; 00061 if(f5 >= nSplinters * 0.5F) 00062 f5 = nSplinters * 0.5F; 00063 af[0] = f5; 00064 af[1] = computeSplinterSpeed(f2); 00065 } 00066 00067 public boolean isMirage() 00068 { 00069 if(!Actor.isValid(initiator)) 00070 return true; 00071 else 00072 return initiator.isNetMirror(); 00073 } 00074 00075 public float receivedPower(ActorMesh actormesh) 00076 { 00077 float f = actormesh.collisionR(); 00078 float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p); 00079 f1 -= f; 00080 if(f1 >= radius) 00081 return 0.0F; 00082 float f2 = 1.0F - f1 / radius; 00083 f2 *= f2; 00084 if(f2 >= 1.0F) 00085 return power; 00086 else 00087 return f2 * power; 00088 } 00089 00090 public float receivedTNT_1meter(float f) 00091 { 00092 if(f >= radius) 00093 return 0.0F; 00094 if(f < 1.0F) 00095 return power; 00096 else 00097 return power / (f * f); 00098 } 00099 00100 public float receivedTNT_1meter(Point3d point3d, float f) 00101 { 00102 float f1 = (float)point3d.distance(p) - f; 00103 return receivedTNT_1meter(f1); 00104 } 00105 00106 public float receivedTNT_1meter(ActorMesh actormesh) 00107 { 00108 float f = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - actormesh.collisionR(); 00109 return receivedTNT_1meter(f); 00110 } 00111 00112 public float receivedTNTpower(ActorMesh actormesh) 00113 { 00114 float f = actormesh.collisionR(); 00115 float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - f; 00116 if(f1 <= 0.0F) 00117 return 0.5F * power; 00118 float f2 = 1.0F / (float)Math.pow(f1, 1.2000000476837158D); 00119 if(f2 <= 0.0F) 00120 return 0.0F; 00121 if(f2 >= 0.5F) 00122 f2 = 0.5F; 00123 return f2 * power; 00124 } 00125 00126 public static boolean killable(ActorMesh actormesh, float f, float f1, float f2, float f3) 00127 { 00128 float f4 = f; 00129 if(f4 <= f1) 00130 return false; 00131 if(f4 >= f2) 00132 { 00133 return true; 00134 } else 00135 { 00136 float f5 = (f4 - f1) / (f2 - f1); 00137 f3 += (1.0F - f3) * f5; 00138 return World.Rnd().nextFloat(0.0F, 1.0F) < f3; 00139 } 00140 } 00141 00142 public static final int POWER_SPLASH = 0; 00143 public static final int POWER_SPLINTERS = 1; 00144 public static final int POWER_NAPALM = 2; 00145 public static final float SPLINTER_MASS = 0.015F; 00146 private static final float SPLINTERS_K = 0.9F; 00147 public String chunkName; 00148 public Point3d p; 00149 public float radius; 00150 public Actor initiator; 00151 public float power; 00152 public int powerType; 00153 private float nSplinters; 00154 00155 } собсна вот ото всего вот етого можете отталкиваеться...вот формулы моделирования взрыва в игре...сами формулы моно если что подрихтовать исходя из этого и стоитпересчитывать пармеетры бомб по воводу добавлений. скажу сразу, ето можно делать только В КРАЙНЕМ случае, если ето координально меняет картину. ибо сделать можно, но работы много( грю про ся, мб программер опытнее лучше сделает) Последний раз редактировалось ZloyPetrushkO; 09.02.2010 в 16:59. |
09.02.2010, 16:53 | #292 |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
и еще...учтите, что если рихтовать формулы, то эффект будет для ВСЕХ взрывов
----- а Борада как раз скинул пост с цитатами, объясняющими действие етих формул. вот такие дела Последний раз редактировалось ZloyPetrushkO; 09.02.2010 в 16:57. |
09.02.2010, 17:21 | #293 |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
ыыы.. а в человеческий язык можно перевести? А то я не врубаюсь что такое f а что f1 и прочее.....
Сами формулы работают то достаточно нормально, не надо их менять. А менять исходные данные. Ну и желательно всеж разделить осколочные, если этого нет. Последний раз редактировалось JGr124_boRada; 09.02.2010 в 17:27. |
09.02.2010, 18:28 | #294 |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
тэкс) а теперь вторая часть алгоритма просчета))
в общем, в представленном выше коде для каждого объекта есть своя модель взрыва. соотвественно, после запуска взрыва для каждого объекта вызываеться свой расчет повреждений и по ней ведеться расчет. если бомба осколочная, и объект чувтсивтелен: а ето танки,дома, самолеты к осколкам сначала идет расчет осколков вот по такому коду: количество осколков: Код:
00022 void computeSplinterParams(float f) 00023 { 00024 float f1 = f * 0.9F; 00025 nSplinters = f1 / 0.015F; 00026 if(nSplinters < 0.5F) 00027 { 00028 nSplinters = 0.0F; 00029 return; 00030 } else 00031 { 00032 return; 00033 } 00034 } Код:
00036 public float computeSplinterSpeed(float f) 00037 { 00038 if(f <= 0.01F) 00039 return 650F; 00040 if(f >= radius) 00041 { 00042 return 150F; 00043 } else 00044 { 00045 float f1 = f / radius; 00046 return 650F * (1.0F - f1) + 150F * f1; 00047 } 00048 } само поражение от осколков: Код:
00050 public void computeSplintersHit(Point3d point3d, float f, float f1, float af[]) 00051 { 00052 float f2 = (float)point3d.distance(p) - f; 00053 if(f2 <= 0.001F) 00054 { 00055 af[0] = nSplinters * 0.5F; 00056 af[1] = computeSplinterSpeed(f2); 00057 } 00058 float f3 = 3.141593F * f * f; 00059 float f4 = 12.56637F * f2 * f2; 00060 float f5 = (nSplinters * f3) / f4; 00061 if(f5 >= nSplinters * 0.5F) 00062 f5 = nSplinters * 0.5F; 00063 af[0] = f5; 00064 af[1] = computeSplinterSpeed(f2); 00065 } еще есть для некоторых типов радиус, в котором возможно поражение. он называеться вот так, и рбаотает тоже так: Код:
static boolean com.maddox.il2.ai.Explosion.killable ( ActorMesh actormesh, float f, float f1, float f2, float f3 ) [static] Definition at line 126 of file Explosion.java. 00127 { 00128 float f4 = f; 00129 if(f4 <= f1) 00130 return false; 00131 if(f4 >= f2) 00132 { 00133 return true; 00134 } else 00135 { 00136 float f5 = (f4 - f1) / (f2 - f1); 00137 f3 += (1.0F - f3) * f5; 00138 return World.Rnd().nextFloat(0.0F, 1.0F) < f3; 00139 } 00140 } теперь поехали по типам... Здания: расчет: Код:
{ 00077 float f = actormesh.collisionR(); 00078 float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p); 00079 f1 -= f; 00080 if(f1 >= radius) 00081 return 0.0F; 00082 float f2 = 1.0F - f1 / radius; 00083 f2 *= f2; 00084 if(f2 >= 1.0F) 00085 return power; 00086 else 00087 return f2 * power; 00088 } Код:
if(Explosion.killable(this, explosion.receivedPower(this), prop.MIN_TNT, prop.MAX_TNT, prop.PROBAB_DEATH_WHEN_EXPLOSION)) 00498 die(explosion.initiator, true); 00499 return; Код:
float af[] = new float[6]; 00480 mesh().getBoundBox(af); 00481 pos.getAbs(p); 00482 p.x = (p.x - (double)af[0]) + (double)(af[3] - af[0]); 00483 p.y = (p.y - (double)af[1]) + (double)(af[4] - af[1]); 00484 p.z = (p.z - (double)af[2]) + (double)(af[5] - af[2]); 00485 float af1[] = new float[2]; 00486 explosion.computeSplintersHit(p, mesh().collisionR(), 0.7F, af1); 00487 Explosion _tmp1 = explosion; 00488 float f = 0.015F * af1[1] * af1[1] * 0.5F; 00489 float f1 = ComputeProbabOfPenetrateKill(f, (int)(af1[0] + 0.5F)); 00490 if(RndB(f1)) 00491 die(explosion.initiator, true); ------- для поездов, людей, кораблей, ракетной артиллерии(катюш чтоли?), парашютистов, мостов и самолетов: вот етот расчет(если я прально понял) Код:
{ 00092 if(f >= radius) 00093 return 0.0F; 00094 if(f < 1.0F) 00095 return power; 00096 else 00097 return power / (f * f); 00098 } Код:
float f = explosion.power; 00675 Explosion explosion1 = explosion; 00676 if(explosion.powerType == 2 && explosion.chunkName != null) 00677 f *= 0.45F; 00678 float f1; 00679 if(explosion.chunkName != null) 00680 { 00681 float f2 = f; 00682 f2 *= Rnd(1.0F, 1.1F); 00683 if(f2 < prop.stre.EXPLHIT_MIN_TNT) 00684 return; 00685 f1 = f2 / prop.stre.EXPLHIT_MAX_TNT; 00686 } else 00687 { 00688 float f3 = explosion.receivedTNT_1meter(this); 00689 f3 *= Rnd(1.0F, 1.1F); 00690 if(f3 < prop.stre.EXPLNEAR_MIN_TNT) 00691 return; 00692 f1 = f3 / prop.stre.EXPLNEAR_MAX_TNT; 00693 } 00694 life -= f1; 00695 if(life <= 0.0F) 00696 Die(explosion.initiator, -1L, true); 00697 } ------ для танков,артиллерии,машин, самолетов и статических юнитов вот ето: Код:
{ 00114 float f = actormesh.collisionR(); 00115 float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - f; 00116 if(f1 <= 0.0F) 00117 return 0.5F * power; 00118 float f2 = 1.0F / (float)Math.pow(f1, 1.2000000476837158D); 00119 if(f2 <= 0.0F) 00120 return 0.0F; 00121 if(f2 >= 0.5F) 00122 f2 = 0.5F; 00123 return f2 * power; 00124 } условие умирания на прмиере танка: от осколочных: Код:
00902 int i = explosion.powerType; 00903 if(explosion == null); 00904 if(i == 1) 00905 { 00906 if(splintersKill(explosion, prop.fnShotPanzer, Rnd(0.0F, 1.0F), Rnd(0.0F, 1.0F), this, 0.7F, 0.25F, prop.PANZER_BODY_FRONT, prop.PANZER_BODY_SIDE, prop.PANZER_BODY_BACK, prop.PANZER_BODY_TOP, prop.PANZER_HEAD, prop.PANZER_HEAD_TOP)) 00907 Die(explosion.initiator, false); 00908 } от остальных бомб: Код:
else 00909 { 00910 int j = explosion.powerType; 00911 if(explosion == null); 00912 if(j == 2 && explosion.chunkName != null) 00913 { 00914 Die(explosion.initiator, false); 00915 } else 00916 { 00917 float f; 00918 if(explosion.chunkName != null) 00919 f = 0.5F * explosion.power; 00920 else 00921 f = explosion.receivedTNTpower(this); 00922 f *= Rnd(0.95F, 1.05F); 00923 float f1 = prop.fnExplodePanzer.Value(f, prop.PANZER_TNT_TYPE); 00924 if(f1 < 1000F && (f1 <= 1.0F || RndB(1.0F / f1))) 00925 Die(explosion.initiator, true); 00926 } 00927 } вот такие вот дела) в общем случае, идет расчет дамага(либо от осколков, либо от фугаса), потом он вычитаеться из лайфбара объекта иногда добавляетья еще область, в которой поражение зависит от рандома вот тако оно собсна рассчитывает...теперь зная ети формулы и способы вычисления осталось просчитать исходные параметры так, чтобы получалось похоже на нужный результат или если совсем косяки в формулах-подрихтовать формулы токо помните, что рихтовка формул отразиться на всех объектах данного типа! вводить новые параметры бомб, ровно как и менять типа объектов низя. |
09.02.2010, 18:39 | #295 |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
итого...порядок причесывания имхо сводиться к такому.
1)знаем данные о реальных бомбах 2) вычисляем данные о эффекте РЕАЛЬНЫХ бомб 3) берем какую либо точку в зоне поражения, и сравниваем отношение эффекта от 2 бомб в реале. запоминаем ето отношение 4) берем данные о игровых бомбах, по формулам считаем дамаг для какогонибудь случая. например для авто. далее берем отношение етих дамагов в точке для двух бомб 5) сравнениваем отношение дамагов к отношению эффективности 6) если большое различие- правим игровые исходные данные, что различие уменьшилось. вот так мое имхо |
09.02.2010, 19:18 | #296 | |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Чудненько! Спасибо за перевод! Думаем....
Цитата:
|
|
09.02.2010, 19:57 | #297 |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Вопрос, а при расчете осколков что передается функции
void computeSplinterParams(float f) PS Предварительный просмотр показывает, что достаточно тщательно просчитывается действие бомб ( лучше чем я ожидал). Теперь точно уверен что добавлять ничего ненадо. Единственно, есть одна хотелка - внести небольшую зависимость от задержки взрывателя ( а может уже и есть?) Последний раз редактировалось JGr124_boRada; 09.02.2010 в 20:01. |
09.02.2010, 20:10 | #298 |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
|
09.02.2010, 20:22 | #299 |
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Почему, поясню.
При задержке близкой к нулю осколочные будут наиболее эффективны ( не зарываются в грунт - соответственно настильность осколков лучше) Соответственно если хотите наибольшую эффективность, забудьте от бомбежке с 5 м высоты. Иначе ставим 3-5 секунды ( как сейчас) и спокойно кидаем гладя цель брюхом. Согласен, это уже десятое дело, но если вдруг такое получится простым способом - это будет плюс. С другой стороны - при такой высоте (5-50м) будут ли в реале бомбы зарываться в грунт? Когда вертикальная скорость ниже горизонтальной |
09.02.2010, 20:30 | #300 | |
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
Цитата:
но н едумаю что ето получиться просто. поясню: т.к. бомба и взрыв находятся в разных классах(а мб и в разных ветках) нужно будет налаживать передачу параметра bombdelay оно того не стоит... другой вопрос, что мб там уже передаеться bombdelay - то можно. хуже не будет |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|