Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
При стрельбе вверх/вниз угол наклона оружия в руках игрока отличается от угла фактического выстрела. Это особенно хорошо видно на примере стрельбы из ракетницы, как на скринах ниже.
Красным обозначено ожидаемое по изображению модели направление выстрела, синим - фактическое направление выстрела.
Attachment:
r_up.jpg [ 77.28 KiB | Viewed 14861 times ]
Attachment:
r_down.jpg [ 85.51 KiB | Viewed 14861 times ]
В итоге выстрел выглядит довольно неэстетично, и им не очень удобно пользоваться. Соответственно, в лучшем случае хотелось бы, чтобы было исправлено положение оружия в руках модели, в худшем - фактические углы стрельбы (они-то сейчас достаточно соответствуют оригинальному D2D, но уж лучше с корректно отображающимися новыми углами, чем некорректно отображающимися оригинальными).
P. S. Возможно, это вещь известная (было бы странно, если бы никто никогда не обращал внимания), но беглым просмотром тем багов и реквестов я подобной темы не увидел, и, думаю, не будет вредным её наличие.
Joined: 17 Oct 2009, 23:43 Posts: 7848 Location: \\HULK
Все верно. Мы с Аром даже сделали карту, которая это демонстрирует. http://doom2d.org/forum/viewtopic.php?f=36&t=1751 Дело в том, что изначально углы выстрела были 45, и поэтому я рисовал оружие под 45. К 0.666 хотел обновить, но уперся в другую проблему (по ссылке).
Есть риск, что после фикса игра будет играться по-другому, с этим надо экспериментировать.
_________________ И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
Насколько я понял по исходникам, сейчас угол вверх ~54.46 градусов, а угол вниз ~32.25 градусов. Они как-то специально подбирались или подстраивались под что-то? Вот здесь например указаны другие углы что для 130, что для 140 (причём правильность указанных там углов для 130 подтверждается анализом экзешника) : viewtopic.php?f=7&t=1409
UPD: Хм, а хотя если углы разные для ракет и пуль, то может и правда в DF как в 140.
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
Jabberwock wrote:
непонятно, откуда у тебя 32.25 вылезло.
arctg(19/30). В коде указано смещение направления выстрела по x - 30, а по y - 19. Для выстрела вверх, соответственно, смещение по y 42, а по x те же 30.
Правда, при выстреле вверх ракета явно летит под другим углом, чем пуля, так что видимо там потом ещё какая-то неоднозначная интерпретация этих значений.
А на моей картинке полёта ракеты вниз угол вообще получается ~30 градусов. Там я, конечно, мог не очень ровно нарисовать линию - но сейчас проверил, встав в точности так же - ракета действительно попадает в точку, указанную линией.
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
Потестил на той карте.
Получилось как-то так:
Пулемёт вверх: ~53.13 Пулемёт вниз: ~32.11
Ракета вверх: ~55.92 Ракета вниз: ~30.8
И тут, конечно, тоже погрешности большие, не совсем понятно, какие квадраты захватывать при замере. Но вроде как получилось ближе к тому, что я назвал, для пулемёта, а для ракетницы вообще углы другие.
Ниже картинки с иллюстрацией разниц углов. Выстрелы сделаны с одной и той же вертикали, но на разных горизонталях (в прыжке). Видно, что след от пулемёта и след от ракетницы расходятся. Если бы углы были одинаковы, следы были бы параллельны независимо от точки вылета снаряда.
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
Ещё немного потестил.
Во-первых, попытался замерить углы в D2Dv140, погрешность большая, но в целом выглядит похоже на то, что в DF, в т. ч. углы ракет выглядят отличающимися от угла пулемёта.
Также решил затестить углы из D2Dv130, т. к. для них теоретические углы совпали с углами для ракет, рассчитанными в той теме: viewtopic.php?f=7&t=1409 В самом деле, на картинках ниже видно, что при углах как в D2Dv130 траектории пулемёта и ракеты не расходятся.
Attachment:
d2d.png [ 7.68 KiB | Viewed 9865 times ]
Attachment:
d2d.png [ 6.63 KiB | Viewed 9865 times ]
Из-за чего такое - я думаю, причина в специфике механики полёта снаряда, чувствительной к ошибке округления. При определении скорости снаряда по x и по y компонента вектора направления выстрела умножается на скорость и делится на максимальную из компонент вектора. При этом из-за того, что углы в 130 простые, на них эта ошибка округления практически не влияет.
Например (будем считать, что стреляем вправо, s - скорость снаряда): * В углах из D2Dv130: -- Выстрел вверх: - Вектор направления {30, -30} - Скорость по x = 30*s/30 = s (нет округления) - Скорость по y = 30*s/30 = s (нет округления) То есть при выстреле вверх вообще никогда нет ошибки округления. -- Выстрел вниз: - Вектор направления {30, 15} - Скорость по x = 30*s/30 = s (нет округления) - Скорость по y = 15*s/30 = s/2 (округление есть только при нечётных s) Но у всех снарядов скорость указана либо 12 (как у ракеты), либо 16 (как у плазмы) - она чётная. Значит в углах 130 и при выстреле вниз нет ошибки округления.
* В текущих углах DF -- Выстрел вверх: - Вектор направления {30, -42} - Скорость по x = 30*s/42 = 5*s/7 (нет округления только есть s делится на 7) - Скорость по y = 42*s/42 = s (нет округления) Ни 12, ни 16 не делятся на 7 - округление есть. Для ракеты вектор скорости получается {8, -12}, т. е. угол 56.31. Для плазмы получается вектор {11, -16}, т. е. угол 55.49. -- Выстрел вниз: - Вектор направления {30, 19} - Скорость по x = 30*s/30 = s (нет округления) - Скорость по y = 19*s/30 = s (нет округления только есть s делится на 30) Ни 12, ни 16 не делятся на 30 - округление есть. Для ракеты вектор скорости получается {12, 7}, т. е. угол 30.26. Для плазмы получается вектор {16, 10}, т. е. угол 32.01.
Замечу, что углы для ракет хорошо совпали с теми, что рассчитывались в теме, на которую я давал ссылку. Так что я считаю, что разобрался, как определяются углы стрельбы и какие они получаются.
Имхо, факт отличия углов ракет от углов пулевого оружия - косяк D2Dv140 - механика полёта снаряда оказалась хорошо подходящей именно для простых углов как в D2Dv130, а с более сложными углами она работает плохо.
Joined: 17 Oct 2009, 23:43 Posts: 7848 Location: \\HULK
Сейчас дико устал, не могу считать. Если подобрать максимально похожие углы и скорости без ошибок округления, что получится? И, наверное, изменение направления полета ракеты на выходе из воды тоже с этим связано.
_________________ И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
По поводу воды - да, вполне возможно. При изменении скорости ракеты покоординатные скорости вполне могут пересчитываться подобным образом, и погрешность тоже может поменяться.
Насчёт похожих углов - вроде как можно изменить -42 -> -45 (y направления вверх), 19 -> 20 (y направления вниз) и 16 -> 15 (скорость плазмы).
Тогда будет: -- Выстрел вверх: угол 56.31 - Вектор направления {30, -45} - Скорость по x = 30*s/45 = 2*s/3 (нет округления только есть s делится на 3) - Скорость по y = 45*s/45 = s (нет округления) 12 и 15 делятся на 3 - округления нет. -- Выстрел вниз: угол 33.69 - Вектор направления {30, 20} - Скорость по x = 30*s/30 = s (нет округления) - Скорость по y = 20*s/30 = 2*s/3 (нет округления только есть s делится на 3) 12 и 15 делятся на 3 - округления нет.
Но изменение скорости плазмы выглядит как-то совсем не очень.
С моей т. з. лучше всего сделать углы как в D2Dv130. Для этой версии они точно известны, они заведомо не вызывают косяков, и, кроме того, они просты для понимания: угол вверх - это просто 45 градусов, а угол вниз - снаряд пролетает по-горизонтали ровно в 2 раза больше, чем по-вертикали. Но я правда уже не особо на это надеюсь, т. к., насколько я понял в основном по прочитанным обсуждениям, DF - это ремейк 140, а не 130 (а жаль). Хотя ту же плазму всё-таки сделали ранящей на 10, усреднив со 130, что всё же радует.
Ещё немного по поводу воды. На самом деле здесь изменения угла не спасают - ведь ракета может залетать в лифт пере входом в воду и приобрести любой угол. Но в теории можно добавить там хранение скорости и положения в виде вещественного числа, тем самым устранив проблемы с округлением. Это потребует правки ряда моментов, но полноценно разрешит любые углы. По-хорошему когда-нибудь это надо сделать вне зависимости от того, какие углы стрельбы будут у думера.
Joined: 29 Jun 2010, 16:18 Posts: 1105 Location: Россия, Санкт-Петербург
Углы в форевере считаются не так. Скоростя - только целые числа. Есть X и есть Y, и у каждого объекта есть скорость X и скорость Y, и это только целые числа. Пересечение оси ординат находится всегда в центре (либо в одном из углов формы) объекта. Чтобы вычислить угол нам нужно сопоставить скоростя по осям. Чем выше скорость объекта, тем будет гибче угол и меньше погрешность. (Тут стоит вспомнить, что писал джа о удвоении тиков, там можно удвоить все показатели скоростей и сделать более гибкие и более правильные углы.) Сама игра не считает углы, там всё на скоростях. Поэтому тут косяк не в самих углах. Надеюсь, изложил доступно.
_________________ Хочешь сделать что-то полезное - сделай бэкап!
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
Косяк в том, что углы, под которыми летят ракеты, другие. То есть на уровне восприятия он в углах. А то, что игра считает именно проекции скоростей, я как раз видел (в D2D130 кстати так же - я так понимаю, тот код DF частично базируется на тех исходниках, которые были открыты? А то многое похоже), и на этом и основаны все мои рассуждения и расчёты. Углы я считал просто чтобы показать, что значат эти проекции в таком выражении. Когда я говорил "поменять углы", я имел в виду поменять y-координаты векторов направления выстрелов. Так-то, собственно, ничто из того, что я писал, не противоречит сказанному тобой, скорее даже наоборот - подтверждается.
Joined: 29 Jun 2010, 16:18 Posts: 1105 Location: Россия, Санкт-Петербург
Sav wrote:
Когда я говорил "поменять углы", я имел в виду поменять y-координаты векторов направления выстрелов.
Нету направлений и нету векторов. Вот к примеру ты выпускаешь ракету прямо, её скорость будет X-12 и Y-0. Если же ты выпустишь её под углом вверх, то скорость будет примерно X-7 и Y-5. Вверху к примеру вода, скорость ракеты должна замедлиться вдвое, но ровно вдвое нельзя, т.к. у нас только целые числа. Как итог мы получаем скорость X-3 и Y-2, из-за этого меняется угол.
_________________ Хочешь сделать что-то полезное - сделай бэкап!
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
Ну я всё же не от балды писал что попало, я смотрел код DF по данному вопросу.
OutCast wrote:
её скорость будет X-12 и Y-0.
2 переменные X и Y такого вида я и называю вектором (по смыслу ведь это он и есть). "Направление" же - это, грубо говоря, имя переменной (не то, которое реально в коде, а то, которое можно было бы дать) - этим словом я просто обозначаю, о чём вообще говорю. X этого направления определяется строчкой кода "xd := wx+IfThen(FDirection = D_LEFT, -30, 30);", Y - функцией firediry; всё это происходит в функции TPlayer.Fire. Поменять углы - это поменять константы -42 и 19 в функции firediry.
OutCast wrote:
Если же ты выпустишь её под углом вверх, то скорость будет примерно X-7 и Y-5.
По моим расчётам выходит X = 8, Y = -12. По той функции видно, что скорость по той координате, по которой она наибольшая, всегда равна изначально указанной скорости (в случае ракеты 12):
Code:
procedure throw(i, x, y, xd, yd, s: Integer); ... begin yd := yd - y; xd := xd - x;
a := Max(Abs(xd), Abs(yd)); if a = 0 then a := 1;
... Shots[i].Obj.Vel.X := (xd*s) div a; Shots[i].Obj.Vel.Y := (yd*s) div a; ... end;
По большому счёту это некорректный расчёт - модуль скорости ракеты получается зависящим от угла, под которым она летит, и не равным 12. Но это такая фишка физики игры, плохого в этом тоже ничего нет.
OutCast wrote:
Вверху к примеру вода, скорость ракеты должна замедлиться вдвое, но ровно вдвое нельзя, т.к. у нас только целые числа. Как итог мы получаем скорость X-3 и Y-2, из-за этого меняется угол.
В случае влёта в воду да, за вычетом нюанса: В функции g_Obj_Move вижу такое:
Code:
if inwater then begin xv := Abs(Obj^.Vel.X)+1; if xv > 5 then Obj^.Vel.X := z_dec(Obj^.Vel.X, (xv div 2)-2);
yv := Abs(Obj^.Vel.Y)+1; if yv > 5 then Obj^.Vel.Y := z_dec(Obj^.Vel.Y, (yv div 2)-2);
xv := Abs(Obj^.Accel.X)+1; if xv > 5 then Obj^.Accel.X := z_dec(Obj^.Accel.X, (xv div 2)-2);
yv := Abs(Obj^.Accel.Y)+1; if yv > 5 then Obj^.Accel.Y := z_dec(Obj^.Accel.Y, (yv div 2)-2); end;
То есть вдвое уменьшается только кусочек скорости, превышающий 4, и итоговая скорость округляется вверх (например, для скорости 12 вдвое уменьшается кусочек "8", и итоговая скорость оказывается 4+(8/2) = 8). Изменение угла при влёте в воду вообще получается фичей - в этом механизме явно и не пытались сделать так, чтобы угол сохранялся. Даже без округления тут угол меняется. Вообще, единственный случай тут, когда угол не меняется, - это угол в ~45 градусов, когда скорости по X и по Y равны.
При вылете снаряда из воды в функции g_Weapon_Update вызывается функция g_Obj_SetSpeed, в которой скорости рассчитываются так же, как и при выстреле игрока:
Code:
procedure g_Obj_SetSpeed(Obj: PObj; s: Integer); var m, vx, vy: Integer;
begin //Obj^.Vel.X := Round(s*(Obj^.Vel.X/Hypot(Obj^.Vel.X, Obj^.Vel.Y))); //Obj^.Vel.Y := Round(s*(Obj^.Vel.Y/Hypot(Obj^.Vel.X, Obj^.Vel.Y)));
//if (!(m = max(abs(o->xv), abs(o->yv)))) m = 1; //o->xv = o->xv * s / m; //o->yv = o->yv * s / m;
vx := Obj^.Vel.X; vy := Obj^.Vel.Y;
m := Max(Abs(vx), Abs(vy)); if m = 0 then m := 1;
Obj^.Vel.X := (vx*s) div m; Obj^.Vel.Y := (vy*s) div m; end;
Так что в этом случае всё то, что я говорил об углах, работает так же, как при выстреле игрока, и угол меняется только из-за округления.
Joined: 29 Jun 2010, 16:18 Posts: 1105 Location: Россия, Санкт-Петербург
Sav wrote:
Так что в этом случае всё то, что я говорил об углах, работает так же, как при выстреле игрока, и угол меняется только из-за округления.
Ну так и я о том же. Это проблема которую можно решить увеличением скоростей/тиков (во всей игре вдвое например), либо же перевести всё это дело на Double и использовать знаки после запятой для точности. Лично я за второе, не такая уж сильная нагрузка, щас уже почти не осталось тех, кто сидит на слабых компах. Да и с оптимизацией можно этот момент вытянуть.
_________________ Хочешь сделать что-то полезное - сделай бэкап!
Joined: 16 Jun 2010, 20:28 Posts: 109 Location: Москва
OutCast wrote:
Ну так и я о том же. Это проблема которую можно решить увеличением скоростей/тиков (во всей игре вдвое например), либо же перевести всё это дело на Double и использовать знаки после запятой для точности. Лично я за второе, не такая уж сильная нагрузка, щас уже почти не осталось тех, кто сидит на слабых компах. Да и с оптимизацией можно этот момент вытянуть.
Ну про хранение параметров в вещественном виде я тоже говорил в начале. Увеличение скоростей и тиков - это всё же выглядит как полумера (в данном конкретном вопросе), погрешность всё равно остаётся, и потенциально может оказаться, что она где-то проявится. Не знаю, насколько на самом деле актуальна проблема оптимизации тут, чисто интуитивно, мне кажется, тут не должно прямо много чего считаться и от усложнения вычисления новых координат снаряда в несколько раз мало что изменится.
Joined: 17 Oct 2009, 23:43 Posts: 7848 Location: \\HULK
В ДФ есть одна серьёзная проблема со стрельбой. Оружие нарисовано под 45°, а думер стреляет ПРИМЕРНО под 35° вверх и 55° вниз, отчего по стволу целиться невозможно. В ближнем бою это не особо важно, но чем дальше, тем больше расхождение между стволом и траекторией выстрела.
(Специально выбрал нестандартную модельку, на ней лучше видно)
Это надо исправить, но есть нюансы: 1. Нарисовать пиксельное оружие под 35 и 55 сложно. Я могу это сделать, и оно будет более-менее четким, лучше, чем если просто поворачивать фотошопом, но это оказалось неожиданно трудоёмко. Поэтому пока что сделал черновой вариант. Ближе всего к финальной версии нарисована двустволка. 2. Точки крепления нового оружия не совпадают со старыми. Т.е. на старых модельках оно всегда будет смещено. 3. Оказывается, углы стрельбы разного оружия отличаются на несколько градусов, что можно увидеть, включив чит SNIPER. Надо попробовать привести их всех к одному углу.
По первым двум мне видится идеальным вариантом добавить в гейм.вад еще одну папку с оружием - Weapons2, и брать оружие на новых модельках из нее, а не из Weapons. Для этого можно бампнуть версию модельки в [Model] - пусть будет version=2. Заодно можно сделать оружие чуть-чуть поменьше, оно будет пропорциональнее смотреться. С третьим нужно разбираться более подробно.
Users browsing this forum: No registered users and 0 guests
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum