doom2d.org

Главная база плоских морпехов
It is currently 17 May 2025, 12:16

All times are UTC + 3 hours




Post new topic Reply to topic  [ 36 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: 30 Nov 2014, 22:15 
Offline

Joined: 16 Jun 2010, 20:28
Posts: 109
Location: Москва
При стрельбе вверх/вниз угол наклона оружия в руках игрока отличается от угла фактического выстрела. Это особенно хорошо видно на примере стрельбы из ракетницы, как на скринах ниже.

Красным обозначено ожидаемое по изображению модели направление выстрела, синим - фактическое направление выстрела.

Attachment:
r_up.jpg
r_up.jpg [ 77.28 KiB | Viewed 14861 times ]

Attachment:
r_down.jpg
r_down.jpg [ 85.51 KiB | Viewed 14861 times ]


В итоге выстрел выглядит довольно неэстетично, и им не очень удобно пользоваться. Соответственно, в лучшем случае хотелось бы, чтобы было исправлено положение оружия в руках модели, в худшем - фактические углы стрельбы (они-то сейчас достаточно соответствуют оригинальному D2D, но уж лучше с корректно отображающимися новыми углами, чем некорректно отображающимися оригинальными).

P. S. Возможно, это вещь известная (было бы странно, если бы никто никогда не обращал внимания), но беглым просмотром тем багов и реквестов я подобной темы не увидел, и, думаю, не будет вредным её наличие.


Top
 Profile  
 
PostPosted: 01 Dec 2014, 01:30 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
Все верно. Мы с Аром даже сделали карту, которая это демонстрирует. http://doom2d.org/forum/viewtopic.php?f=36&t=1751
Дело в том, что изначально углы выстрела были 45, и поэтому я рисовал оружие под 45.
К 0.666 хотел обновить, но уперся в другую проблему (по ссылке).

Есть риск, что после фикса игра будет играться по-другому, с этим надо экспериментировать.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 01 Dec 2014, 18:46 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
По углам наклона:

1. Придется менять версию модельки.
    UPD: Подробности ниже.

2. Придется вшивать в GAME.WAD спрайты с пушками под нужными углами в отдельную секцию (у меня они уже есть).
    Принцип работы: если версия модельки ниже N, используем старые пушки, если выше - новые.


Можно, кстати, еще добавить необязательные анимации:
    WalkAttack
    WalkAttackUp
    WalkAttackDown
    WalkSeeUp
    WalkSeeDown

    WalkHandsAttack
    WalkHandsAttackUp
    WalkHandsAttackDown
    WalkHandsSeeUp
    WalkHandsSeeDown

    Hands
    HandsAttack
    HandsAttackDown
    HandsAttackUp
    HandsSeeDown
    HandsSeeUp
      Как работает необязательная анимация: если она есть в model.txt - она используется, если нет - модель обрабатывается как_сейчас.

И параметр:
    AdvWeapons=Bool
      Если 1, подставляем новые пушки, если 0 - старые

Моделлер (я в частности) ебанется все это рисовать, но если такая возможность будет, как минимум думера с охуительной анимацией я вам гарантирую.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 04 Dec 2014, 17:46 
Offline
User avatar

Joined: 04 Nov 2009, 03:52
Posts: 540
Location: East Syb
А почему нельзя было оставить углы как есть?

_________________
And when ja ja guy come,
The Babylon them have to run.


Top
 Profile  
 
PostPosted: 05 Dec 2014, 08:26 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
1. УГЛЫ и остаются как есть
2. Точка вылета снаряда сдвигается, чтобы можно было целиться точно по направлению ствола.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 05 Dec 2014, 10:45 
Offline

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.


Top
 Profile  
 
PostPosted: 05 Dec 2014, 11:20 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
Они как в 1.40. Вроде как ~55 и ~35, непонятно, откуда у тебя 32.25 вылезло.
Впрочем, на спрайте разница между 35 и 32 градуса будт незаметна.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 05 Dec 2014, 11:40 
Offline

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 градусов. Там я, конечно, мог не очень ровно нарисовать линию - но сейчас проверил, встав в точности так же - ракета действительно попадает в точку, указанную линией.


Top
 Profile  
 
PostPosted: 06 Dec 2014, 00:44 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
Sav, там карта была специальная для теста. Попробуй.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 06 Dec 2014, 01:16 
Offline

Joined: 16 Jun 2010, 20:28
Posts: 109
Location: Москва
Потестил на той карте.

Получилось как-то так:

Пулемёт вверх: ~53.13
Пулемёт вниз: ~32.11

Ракета вверх: ~55.92
Ракета вниз: ~30.8

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

Ниже картинки с иллюстрацией разниц углов. Выстрелы сделаны с одной и той же вертикали, но на разных горизонталях (в прыжке). Видно, что след от пулемёта и след от ракетницы расходятся. Если бы углы были одинаковы, следы были бы параллельны независимо от точки вылета снаряда.

Attachment:
d2d.png
d2d.png [ 6.56 KiB | Viewed 9882 times ]

Attachment:
d2d.png
d2d.png [ 7.8 KiB | Viewed 9882 times ]



Top
 Profile  
 
PostPosted: 06 Dec 2014, 13:15 
Offline

Joined: 16 Jun 2010, 20:28
Posts: 109
Location: Москва
Ещё немного потестил.

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

Также решил затестить углы из D2Dv130, т. к. для них теоретические углы совпали с углами для ракет, рассчитанными в той теме: viewtopic.php?f=7&t=1409
В самом деле, на картинках ниже видно, что при углах как в D2Dv130 траектории пулемёта и ракеты не расходятся.

Attachment:
d2d.png
d2d.png [ 7.68 KiB | Viewed 9865 times ]

Attachment:
d2d.png
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, а с более сложными углами она работает плохо.


Top
 Profile  
 
PostPosted: 06 Dec 2014, 15:03 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
Сейчас дико устал, не могу считать. Если подобрать максимально похожие углы и скорости без ошибок округления, что получится?
И, наверное, изменение направления полета ракеты на выходе из воды тоже с этим связано.

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.


Top
 Profile  
 
PostPosted: 06 Dec 2014, 21:16 
Offline

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, что всё же радует.


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


Top
 Profile  
 
PostPosted: 06 Dec 2014, 22:44 
Offline
Приколист
User avatar

Joined: 29 Jun 2010, 16:18
Posts: 1105
Location: Россия, Санкт-Петербург
Углы в форевере считаются не так. Скоростя - только целые числа. Есть X и есть Y, и у каждого объекта есть скорость X и скорость Y, и это только целые числа. Пересечение оси ординат находится всегда в центре (либо в одном из углов формы) объекта. Чтобы вычислить угол нам нужно сопоставить скоростя по осям. Чем выше скорость объекта, тем будет гибче угол и меньше погрешность. (Тут стоит вспомнить, что писал джа о удвоении тиков, там можно удвоить все показатели скоростей и сделать более гибкие и более правильные углы.) Сама игра не считает углы, там всё на скоростях. Поэтому тут косяк не в самих углах. Надеюсь, изложил доступно.

_________________
Хочешь сделать что-то полезное - сделай бэкап!


Top
 Profile  
 
PostPosted: 06 Dec 2014, 23:08 
Offline

Joined: 16 Jun 2010, 20:28
Posts: 109
Location: Москва
Косяк в том, что углы, под которыми летят ракеты, другие. То есть на уровне восприятия он в углах. А то, что игра считает именно проекции скоростей, я как раз видел (в D2D130 кстати так же - я так понимаю, тот код DF частично базируется на тех исходниках, которые были открыты? А то многое похоже), и на этом и основаны все мои рассуждения и расчёты. Углы я считал просто чтобы показать, что значат эти проекции в таком выражении. Когда я говорил "поменять углы", я имел в виду поменять y-координаты векторов направления выстрелов. Так-то, собственно, ничто из того, что я писал, не противоречит сказанному тобой, скорее даже наоборот - подтверждается.


Top
 Profile  
 
PostPosted: 07 Dec 2014, 00:02 
Offline
Приколист
User avatar

Joined: 29 Jun 2010, 16:18
Posts: 1105
Location: Россия, Санкт-Петербург
Sav wrote:
Когда я говорил "поменять углы", я имел в виду поменять y-координаты векторов направления выстрелов.
Нету направлений и нету векторов. Вот к примеру ты выпускаешь ракету прямо, её скорость будет X-12 и Y-0. Если же ты выпустишь её под углом вверх, то скорость будет примерно X-7 и Y-5. Вверху к примеру вода, скорость ракеты должна замедлиться вдвое, но ровно вдвое нельзя, т.к. у нас только целые числа. Как итог мы получаем скорость X-3 и Y-2, из-за этого меняется угол.

_________________
Хочешь сделать что-то полезное - сделай бэкап!


Top
 Profile  
 
PostPosted: 07 Dec 2014, 00:52 
Offline

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;


Так что в этом случае всё то, что я говорил об углах, работает так же, как при выстреле игрока, и угол меняется только из-за округления.


Top
 Profile  
 
PostPosted: 07 Dec 2014, 20:11 
Offline
Приколист
User avatar

Joined: 29 Jun 2010, 16:18
Posts: 1105
Location: Россия, Санкт-Петербург
Sav wrote:
Так что в этом случае всё то, что я говорил об углах, работает так же, как при выстреле игрока, и угол меняется только из-за округления.
Ну так и я о том же. Это проблема которую можно решить увеличением скоростей/тиков (во всей игре вдвое например), либо же перевести всё это дело на Double и использовать знаки после запятой для точности. Лично я за второе, не такая уж сильная нагрузка, щас уже почти не осталось тех, кто сидит на слабых компах. Да и с оптимизацией можно этот момент вытянуть.

_________________
Хочешь сделать что-то полезное - сделай бэкап!


Top
 Profile  
 
PostPosted: 07 Dec 2014, 22:49 
Offline

Joined: 16 Jun 2010, 20:28
Posts: 109
Location: Москва
OutCast wrote:
Ну так и я о том же. Это проблема которую можно решить увеличением скоростей/тиков (во всей игре вдвое например), либо же перевести всё это дело на Double и использовать знаки после запятой для точности. Лично я за второе, не такая уж сильная нагрузка, щас уже почти не осталось тех, кто сидит на слабых компах. Да и с оптимизацией можно этот момент вытянуть.

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


Top
 Profile  
 
PostPosted: 07 Sep 2022, 00:32 
Offline
Site Admin
User avatar

Joined: 17 Oct 2009, 23:43
Posts: 7848
Location: \\HULK
В ДФ есть одна серьёзная проблема со стрельбой.
Оружие нарисовано под 45°, а думер стреляет ПРИМЕРНО под 35° вверх и 55° вниз, отчего по стволу целиться невозможно.
В ближнем бою это не особо важно, но чем дальше, тем больше расхождение между стволом и траекторией выстрела.

Image
(Специально выбрал нестандартную модельку, на ней лучше видно)

Это надо исправить, но есть нюансы:
1. Нарисовать пиксельное оружие под 35 и 55 сложно. Я могу это сделать, и оно будет более-менее четким, лучше, чем если просто поворачивать фотошопом, но это оказалось неожиданно трудоёмко. Поэтому пока что сделал черновой вариант. Ближе всего к финальной версии нарисована двустволка.
2. Точки крепления нового оружия не совпадают со старыми. Т.е. на старых модельках оно всегда будет смещено.
3. Оказывается, углы стрельбы разного оружия отличаются на несколько градусов, что можно увидеть, включив чит SNIPER. Надо попробовать привести их всех к одному углу.

По первым двум мне видится идеальным вариантом добавить в гейм.вад еще одну папку с оружием - Weapons2, и брать оружие на новых модельках из нее, а не из Weapons.
Для этого можно бампнуть версию модельки в [Model] - пусть будет version=2. Заодно можно сделать оружие чуть-чуть поменьше, оно будет пропорциональнее смотреться.
С третьим нужно разбираться более подробно.


Attachments:
weapons2.rar [99.81 KiB]
Downloaded 101 times

_________________
И неважно, что нет морей на Марсе, каждый морпех носит море в сердце.
Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 36 posts ]  Go to page 1, 2  Next

All times are UTC + 3 hours


Who is online

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

Search for:
Jump to:  
doom2d.org, since 2007