Jump to content
Азраэль

Курилка программистов

Recommended Posts

Expropriator    2,106

Вылет аи-сетки по компиляции упирался в мах. память оперативы или в `3Gb? Что то я запамятовал. Надо как то научить нпс видить ГГ когда он не на сетке. Монстры же видят его, например Химера, легко вылетает за пределы сетки в атаке на ГГ.


andreyholkin.gif

rod_cccp.gif

 

Share this post


Link to post
Share on other sites
Змея    240

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

Share this post


Link to post
Share on other sites
Expropriator    2,106

@Змея, в движке ЗП видел химеру, вне аи сетки, забуксовавшую, после того как она прыгнула на ГГ, когда тот был вне аи сетке. Вылета не было. Я, будучи ГГ, подходил к химере и она еще умудрялась кусаться.

А может я уже вру на счет кусачести, но остальное правда.


andreyholkin.gif

rod_cccp.gif

 

Share this post


Link to post
Share on other sites
Змея    240

Сохранялся - загружался в этот момент?

Share this post


Link to post
Share on other sites
Expropriator    2,106

@Змея, давно было не помню про сохранки. Это было дело на новой локации, которую я тестировал, потому я там аи-сетку знал хорошо где и как.

 

Короче, я решил не делать в русле реки аи-сетку. Проходя мимо химеры по воде, я и напоролся на такой прыжок.


andreyholkin.gif

rod_cccp.gif

 

Share this post


Link to post
Share on other sites
Malandrinus    600
23 hours ago, НаноБот said:

проверять проходимость габарита НПС надо, хотя бы чтобы непыси не упирались в вдруг друга

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

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


 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Share this post


Link to post
Share on other sites
НаноБот    615

Не знаю, не знаю, трассировкой можно надёжно пофиксить эти проблемы, трассировка занимает 20000-40000 тактов в среднем, я проверял. Так что это не так уж ресусоёмко. Так же смог пофиксить проблему стрельбы НПС по динамичным объектам, ХЕН смог сбить вертолёт, который летит со скоростью 30 м/с, на дистанции метров 150-200. Надо лишь наведения на цель апдейтить в режиме фастапдейт, а так же рассчитывать упреждения. Я это всё сделал, конечно для XRayExtensions.

  • Полезно 1

...в конце концов, важен лишь, машинный код.

Share this post


Link to post
Share on other sites
Expropriator    2,106

Как добавить в игру Сталкер второй фонарик, что бы он был с тем же классом, но с новыми характеристиками?


andreyholkin.gif

rod_cccp.gif

 

Share this post


Link to post
Share on other sites
НаноБот    615

Столкнулся с одной проблемой. Делаю салют для сталкера, т.е. салютная установку стреляет люсткугелями, которые взлетев на определённую высоту, взрываются и разбрасывают звёздки. Звёздки на классе взрывчатки, партиклы скриптовые. Так вот, через некоторое время следует вылет, исключение в файле DetailManager_VS.cpp, строка 203, нулевой указатель, это ТЧ. Так же вылет и в ЗП, переполнения стека. Я так понял, это происходит из-за неправильного вызова деструктора партиклов, да именно партиклы виноваты, и скорей всего Lua виноват, по идеи, должна быть функция деструктора партиклов, в противовес конструктора particles_object, но её нет, вроде как деструктор должен вызываться автоматически, не знаю, может и вызывается, но точно делает это не правильно.

Вывод, языки у которых деструкторы вызываются автоматически, говно, например жаба. Ассемблер форева.

Edited by НаноБот

...в конце концов, важен лишь, машинный код.

Share this post


Link to post
Share on other sites
Malandrinus    600
On 12/28/2018 at 5:27 PM, НаноБот said:

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

 

С чем бы это сравнить. Вот представь себе компанию, массово производящую автомобили, Mercedes или там GM. Сотни инженеров, месяцами работающие над каждой деталью, сложнейшая логистика, высочайший уровень автоматизации и прочее в этом роде. Теперь приходит такой механик из сельской автомастерской и говорит: "Гавно эти ваши инженеры и роботы. Напильник, молоток и гаечный ключ форева."

  • Haha 1

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Share this post


Link to post
Share on other sites
НаноБот    615

@Malandrinus, да я пошутил. Но реально, партиклы в Lua автоматически не удаляются, требуется сделать функцию particle_destroy(obj), само не удаляется.


...в конце концов, важен лишь, машинный код.

Share this post


Link to post
Share on other sites
dsh    3,032

Кто в физике/математике разбирается, подскажите пожалуйста, как рассчитать силу, которую нужно приложить к гранате по трем осям, что бы она долетела до указанной точки? Чую, ускорение свободного падения тут участвует. Может @abramcumner подскажет?

 

Share this post


Link to post
Share on other sites

@dsh, Это баллистика уважаемый. В 1945 году, для таких расчётов американцы специальную машину построили. ENIAC назывался. Так что расчёты эти, как я понимаю весьма не просты.


 

ASUS P5Q3/Xeon E5450/DDR3 - 16Gb/GTX750 2Gb, v399.24/HP24o 1920x1080/SSD (M2) - Kingston HyperX Predator 240Гб (HHHL) + 3HDD/Windows7 SP1 x64 + QTTab 1040 

\\\ Дополнения к ОГСЕ 0693 /// \\\ OGSRmod ///

Share this post


Link to post
Share on other sites
abramcumner    925
3 часа назад, dsh сказал:

Кто в физике/математике разбирается, подскажите пожалуйста, как рассчитать силу, которую нужно приложить к гранате по трем осям, что бы она долетела до указанной точки? Чую, ускорение свободного падения тут участвует. Может @abramcumner подскажет?

 

Именно силу? А то еще Галилей открыл, что гранаты летают по инерции(в полете на них не действуют никакие силы кроме силы тяжести). Граната отправляется в полет со скоростью V, которую приобретает за время маха. Можно задать через импульс(m * V).

По x и z равномерное движение со скоростями Vx и Vz, формула S = V * t -> t = S / V По y равноускоренное движение S = V * t - g * t * t / 2 -> t = V +- sqrt(V * V - 2 * g * S) / g

В точке назначения граната должна оказать одновременно по все трем осям одновременно, получается:

Sx / Vx = Sz / Vz = Vy -+ sqrt(V * V - 2 * g * Sy) / g

Выбираешь значение скорости по любой оси и вычисляешь значения для остальных двух.

 

Если задать условие, чтобы запускать гранату с наименьшей скоростью, у меня получилось такие формулы: Vx,z = Sx,z * sqrt(g / D) / 2, Vy = (Sy +  2 * D) * sqrt(g / D) / 2, где D - расстояние до указанной точки.

По идее в АМК должны быть те же самые формулы - там же пускали гранаты.

 

2 часа назад, W.A.S.P. сказал:

Так что расчёты эти, как я понимаю весьма не просты.

Шел 2019 год...

Edited by abramcumner
  • Like 4

Share this post


Link to post
Share on other sites
dsh    3,032
3 minutes ago, abramcumner said:

там же пускали гранаты

Там эмпирически подобранные константы:


    local bone = get_grenade(id):get_physics_shell():get_element_by_bone_name("wpn_body")
    local dir=utils.vector_copy_by_val(target):sub(get_grenade(id):position())
    dir:mul(1300)
    if typ=="lo" then
        dir:add(vector():set(0,8000,0))
    else
        dir:add(vector():set(0,19000,0))
    end
    if bone then bone:apply_force(dir.x,dir.y,dir.z) end

5 minutes ago, abramcumner said:

Vx,z = Sx,z * sqrt(g / D) / 2, Vy = (Sy +  2 * D) * sqrt(g / S) / 2, где D - расстояние до указанной точки.

Мне кажется, что в этих формулах еще должна как-то учитываться масса гранаты? А понял, скорость по каждой оси еще нужно умножить на массу гранаты?

 

Не могу понять, что в формулах обозначает S?

Share this post


Link to post
Share on other sites
ed_rez    12,139
10 минут назад, dsh сказал:

то в формулах обозначает S?

Дык это, расстояние же. Или что-то не так понял!?:russian_ru:

  • Согласен 1

ed_rez.gif

Share this post


Link to post
Share on other sites
abramcumner    925
19 минут назад, dsh сказал:

Не могу понять, что в формулах обозначает S?

Sx = dest.x - pos.x, dest - координаты точки назначения, pos - координаты точки отправления. Sy = dest.y - pos.y, Sz  = dest.z - pos.z. Просто S - это непереименованная D = dest.distance(pos).

 

Мне кажется, что в этих формулах еще должна как-то учитываться масса гранаты? А понял, скорость по каждой оси еще нужно умножить на массу гранаты?

Да, если задавать через импульс, надо еще на массу умножить.

Edited by abramcumner

Share this post


Link to post
Share on other sites
dsh    3,032
3 hours ago, abramcumner said:

Sx = dest.x - pos.x

Т.е. переводя все на lua получается


local D  = src:distance_to( dst )
local g  = 2 * 9.81
local S  = vector():sub( dst, src )
local Vx = S.x * math.sqrt( g / D ) / 2
local Vz = S.z * math.sqrt( g / D ) / 2
local Vy = ( S.y + 2 * D ) * math.sqrt( g / D ) / 2

Правильно?

 

  • Согласен 1

Share this post


Link to post
Share on other sites
dsh    3,032

@abramcumner, не, не получается. Вот такой вот код


local target  = vector():mad( obj_pos, db.actor:direction(), 25 )
local D  = obj_pos:distance_to( target )
local g  = 2 * 9.81
local Sx = target.x - obj_pos.x
local Sy = target.y - obj_pos.y
local Sz = target.z - obj_pos.z
local Vx = Sx * math.sqrt( g / D ) / 2
local Vz = Sz * math.sqrt( g / D ) / 2
local Vy = ( Sy + 2 * D ) * math.sqrt( g / D ) / 2
local mass = 1300
Vx = Vx * mass
Vy = Vy * mass
Vz = Vz * mass
bone:apply_force( Vx, Vy, Vz )

Граната больше летит вверх, чем вперед. Вверх она улетает на 7.6 метра, а вперед только на 8.6. Если поставить в mass obj:mass(), которая 12, то вообще не летит, а только чуть подпрыгивает.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   1 member

AMK-Team.ru

×
×
  • Create New...