Перейти к контенту

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


Рекомендуемые сообщения

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

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

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

Ссылка на комментарий

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

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

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

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

 

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

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий
23 hours ago, НаноБот said:

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

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

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

 

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

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

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

 

Ссылка на комментарий

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

  • Полезно 1

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

СТАЛКЕР только для ПК!

Ссылка на комментарий

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

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

Изменено пользователем НаноБот

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

СТАЛКЕР только для ПК!

Ссылка на комментарий
On 12/28/2018 at 5:27 PM, НаноБот said:

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

 

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

  • Смешно 1
 

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

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

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

 

Ссылка на комментарий

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

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

СТАЛКЕР только для ПК!

Ссылка на комментарий

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

 

Ссылка на комментарий

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

 

Desktop: i7-11700k/Gigabyte Z590 D/64 Гб DDR4-3600 (2х32Гб)/GTX 1070Ti 8Гб/30" WQXGA+24" WUXGA (portrait)/ADATA Legend 960 4Тб + 3HDD (9Тб)/Thermaltake smart BM2 - 650Вт/Win10+QtTab

\\\ Дополнения к ОГСЕ 0693 /// \\\ OGSRmod ///\\\Огниво (говорим обо всём)///\\\Балкон///

Ссылка на комментарий
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 год...

Изменено пользователем abramcumner
  • Нравится 4
Ссылка на комментарий
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?

Ссылка на комментарий
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).

 

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

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

Изменено пользователем abramcumner
Ссылка на комментарий
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
Ссылка на комментарий

@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, то вообще не летит, а только чуть подпрыгивает.

 

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...