Всем добрый день, заебался ломать голову и запрашиваю вашу помощь:
Делаю игрушку, нужно сделать пульки, (я их уже сделал, но коллайдеры у них в виде шариков), сделал условие пересечения пульки и игрока (чтобы проверить, попала ли пулька в игрока).
Сейчас думаю как сделать пульки не в виде шариков, а в виде листочков / нормальных снарядов / полосок (см на скриншот).
Проблема состоит в том, что не могу придумать, как проверить, пересекается ли игрок (круг) и эта йоба-фигура.
>>237880660 (OP) Коллизия круга и отрезка -- простая хуйня. Суть в том, что ищешь ближайшую точку на прямой до центра круга. Потом смотришь, попадает ли в отрезок. Потом проверяешь расстояние до центра круга.
>>237880911 Тогда другой вопрос с игрком, сейчас он у меня его коллайдер в виде круга сделан (как и все впрочем), есть ли сложности в проверке пересечения окружности и полигонов?
А зачем париться если можно не парится. (и вычислительны мощности нагружать) Пусть снаряд будет хитрой формы, а коллайдер у него кирпичом с подходящими длиной шириной высотой.
У нас пулька задана в виде ромба, есть длина и ширина
Вычисляем так:
Находим близжайшую точку до окружности, а затем проверяем:
1 - Расстояние между отрезком и центром круга 2 - Ширину отрезка в точке (легко найдем, тупо умножив ширину на коефф. который вычисляем при задании длины и ширины (ширина / длина или типо того)) и радиуса круга
>>237881911 Если пишешь на жс, и у тебя тыщи пуль, надо чтоб быстро считалось. Так что пули аппроксимируй, либо кругами делай, либо отрезками с толщиной, то есть чтоб в три строки кода и десяток матопераций можно было коллизию с игроком считать, ведь тебе надо всю эту тыщу раз 60 в секунду коллизить с игроком.
>>237882027 Может тебе даже стоит партиционировать весь массив пуль в пространстве, самое тупое сетку секторов сделать, чтоб не проверять коллижен с теми, что гарантированно далеко.
А еще я эту хуйню решил в браузере сделать, так что у меня в кармане только 1 процессорный поток доступен.
Но варианты с отрезками с толщиной и ромбами выглядят довольно приятно, и не должны занимать убер дохуя времени. Хотя не знаю алгоритм поиска близжайшей точки до точки у отрезка.
>>237882139 Думаю добавить в проверку какое-нибудь условие, чтобы скипать пульки, которые далеко находятся. Пока в голову приходит что то типа (длина + ширина > расстояния до игрока = идти нахуй)
>>237882229 Пока что у меня все это в массиве валяется и проверяется forEach'ем, насчет приоритетной очереди - думаю выйдет дороже перестраивать ее каждый раз, поскольку игрок двигается и пульки тоже, и расстояния каждый раз меняются
>>237882307 А хрен его знает. Ибо большинство пуль летят мимо игрока и далеко(больше 3Хразмера пули) от него. Проведи эксперимент и прикинь писю к носу нужна ли приоритезация и с каких количеств пуль и скроростей игроков с пулями.
>>237882527 Думаю куда проще (и выгодней) окажется добавить условие перед проверкой, которое по времени будет занимать меньше времени самой проверки (писал тут) >>237882265
>>237881852 Все может и можно, но куда логичнее и проще было бы узнать нужную информацию в специальном разделе, посвященном этой тематике, а не в борделе по интересам.
>>237882587 Если считать расстояние до игрока приблизительное то почему и не сделать возможность приоритета. Пули которые далеко - идут нахуй и внизу очереди. Пули которые близко считаются подробно и находятся вверху очереди.
>>237880660 (OP) Нахуя вы так ебетесь, переизобретая велосипед? Используйте готовые движки и API. Пиздец, каждые два дня говнокод-тред, каждый раз их посылают курить готовое, а они все копротивляются.
>>237883120 Все пульки придется проверять сразу, тут никак не изьебнешься.
Был бы статичные объекты - можно было бы bvh дерево и аабб боксами ускорить, а так хуй.
Но вообще когда я на xna параше в 10ых делал данмаку, оно легко в 60фпс ~5кк пуль успевало оценивать на бюджетном коре. Так что влепи тупой перебор да попробуй, уверен десятка три тысяч легко вытянет
Ещё что подумал. Те пули что вылетели за границу мира можно не считать на столкновения, только отрисовывать. Если игрок медленный или карта большая то и те до которых игрок добежать не успеет за время жизни пули.
>>237885132 Они у меня сразу же выкидываются из памяти.
Насчет "игрок не успеет добежать" тут хз, поскольку пули по любой траектории могут лететь (В том числе так, как на скриншоте, только сложнее). И как в таком случае просчитывать возможность долететь до пули?
Еще могу посоветовать чекать сначала пересечние луча нормализованной прямой отрезка, а уже потом - проверку на коллизию, если расстояние до луча меньше чем какое-то.
Так оттбросится примерно половина необходимых вычислений.
1. проверяешь d из v0 и v1 получаешь коэффициенты прямой a b c, нормализуешь по (a2 + b2) ии в принципе можно на все время существования прямой длинной пули эти коэффициент и использовать можно даже вообще наоборот, из а б с порождать отрезок, чтобы а б с были заранее известны и предопределены, один хуй ты вектор в том или ином виде задаешь когда пулю пускаешь
2. если d меньше какого-то порога - проверяешь dot (v0 - v1, v0 - p) и dot (v1 - v0, v1 - p) - если оба скалярных произведения дают косинус больше нуля - фиксируешь коллизию, если больше - нет коллизии
>>237880660 (OP) Заебош им всем круглые коллайдеры. Может, у пули-листочка самая смертоносная часть - круглое ядро из обогощённой НЕНАВИСТИ в середине, а острые носик и хвостик - это чисто визуальные эффекты, которые образуются вокруг ЯДРА НЕНАВИСТИ при движении.
>>237880660 (OP) >не могу придумать, как проверить, пересекается ли игрок (круг) и эта йоба-фигура. Так а нахуя? Пускай коллайдеры остаются кругами, в определении столкновений с проджектайлами точность нахуй не нужна.
>>237886831 Я думал об этом, см здесь (+ еще другие идейки подкинули, которые тоже простые и будут легче описывать, например, свастоны или длинные пульки)
>>237886750 Не будет, у тебя есть игрок, и есть пуля, которая летит к нему ебалом вперёд. Достаточно покрыть коллайдером ебало пули по всей её ширине. Сценарий, при котором у тебя игрок догоняет жопу уже пролетевшей пули и насаживается на неё, маловероятен и костылить какую-то залупу из-за него нецелесообразно.
>>237887054 А, так эта длиная хуйня тоже проджектайлы? Ну так хуярь эллипсы вместо кругов, какие проблемы? Тупо будет поправка радиуса в вычислениях, и всё. Алсо, нахер ты вообще полез изобретать велосипед, если давно существуют сотни движков с готовыми коллизиями?
>>237887203 Насчет эллипсов не думал....в принципе могут подойти, но считать коллизию будет еще заебанней чем с ромбом, так что думаю ромбой и обойдусь
ромб это 4 точки, но процесс вычисления коллизии 4 точек в заданном участке потребует того же времени, сколько несколько десятков шариков.
коллизиия между точкой игрока p0 и точкой пули d0:
1. вычислить расстояние d = p0 - d0 2. сравнить d с хитбоксами пули и игрока 3. запустить солвер
Коллизия между отрезком формируемой точкой b0 b1 и точкой игрока p0
1. вычислить а из b0.x и b1.x 2. вычислить b из b0.y и b1.y 3. вычислить с из a b и b0 и b1 4. вычислить квадрат расстояния d2 между прямой ax+by+c = 0 и точкой p0 5. проверить d2 на порог по хитбоксу и параметры бокса отрезка b0 b1 6. если d2 меньше порогов хитбокса игрока и бокса отрезка, проверка на вхождение в отрезок: 6.1 вычислить вектор w0 = b0 - p0 6.2 вычислить вектор w1 = b1 - p0 6.3 вычислить вектор bb = b0 - b1 6.4 вычислить вектор bb' = b1 - b0 6.5 вычислить скалярное произведение dot(bb, w0) 6.6 вычислить скалярное произведение dot(bb', w1) 6.7 проверить dot первый на > 0 6.8 проверить dot второй на > 0 6.9 если оба > 0 - регистрируем коллизию запускаем солвер
причем сами операции dot и в чеке расстояния до прямой еще всякие квадраты имеют деления которые тоже не очень уж и быстрые, т.е. можно смело раза в 2 увеличивать число операций. соотношение времени проверки точка-точка к точка-грань примерно 1/10 а то и больше.
Т.е. за то же самое время можно успеть проверить несколько десятков точек, причем даже десятком точек вполне можно описать весьма сложную форму, без ввода полигональных пулей
>>237888323 Нахуя такие сложности, не проще ли так:
1) Вычислить расстояние от прямой до игрока 2) Проверить, входит ли точка А в отрезок (можно по одной из координат х или у проверить) 3) проверить расстояние до точки и игрока и сравнить это дело с шириной отрезка (или ромба, там не особо больше сложности прибавляется) плюс радиусом игрока
>1. вычислить расстояние до прямой это на само деле: >1. вычислить а из b0.x и b1.x >2. вычислить b из b0.y и b1.y >3. вычислить с из a b и b0 и b1 >4. вычислить квадрат расстояния d2 между прямой ax+by+c = 0 и точкой p0 >5. проверить d2 на порог по хитбоксу и параметры бокса отрезка b0 b1
>2) Проверить, входит ли точка А в отрезок (можно по одной из координат х или у проверить) вычисление координаты точки А - это еще на 5-6 операций (векторных, замечу)
>3) проверить расстояние до точки и игрока и сравнить это дело с шириной отрезка (или ромба, там не особо больше сложности прибавляется) плюс радиусом игрока ну и еще 4-5 векторных операций и сравнений
со скалярным произведением побыстрее немного, т.к. там не надо находит пересечение прямой и перпендикуляра до прямой с игрока (т.е. точку А), а сразу по скалярному произведению определяем, входит ли точка игрока в грубо говоря область отрезка.
Тут челик расписал, почему этот метод хуета, и его лучше заменить на пару десятков кругов (или я подумал можно даже эллипс прикруить) -> >>237888323>>237889008
>>237880660 (OP) >Проблема состоит в том, что не могу придумать, как проверить, пересекается ли игрок (круг) и эта йоба-фигура. Но нахуя? Так никто не делает, либо делаешь коллайдер сложной геометрически пульки из нескольких коллайдеровно это оверинжиниринг, либо просто делаешь коллайдер примерно по размеру пули, потом подгоняешь на этапе тестирования
>>237890194 >Что ты имеешь ввиду под параллельно? Я имел в виду - длинный прожектайл описать 4, 6, 8 линиями.
Для каждой линии пересечение с кругом считается элементарно. Современные компиляторы могут оптимизировать это так, что обсчёт для 8 линий можно сразу выполнить параллельно.
>>237890413 Переводишь уравнение линии в форму ax + by + c = 0. Нормализуешь коэффициенты. Уравнение перпендикуляра к линии - -ax + by + c = 0, подставляя x и y игрока, находишь точку пересечения перпендикуляра с отрезком, измеряешь длину, смотришь, находится ли точка пересечения в пределах отрезка, если длина меньше радиуса игрока и точка в пределах - то есть коллизия.
>>237891082 Посмтрю, щас проверю несколько вариантов, и затесщу какой лучше, если тред не умрет - результаты выложу сюда, если умрет - создам новый с результатами с сылкой на этот тред
>>237893096 Норм, а то я начал думать что сам где то обосрался. И это странно, что ты ко мне обращаешься как к "нему". Я ОП, тут омжно как то помечаться, что я ОП? Чтобы никто не думал, что я вообще левый чел
>>237893392 Не, я долго в >>237889946 пялился и пытался понять, что за А и B и откуда выбран отсчет для них посередке, недопер что зеленая горизонтальная линия - она абсцисса
>>237894034 Если подводных нет, то это довольно хорошее решение, т.к. избавляемся от корня при подсчете в 'B' и в 'C', т.к. они изначально как сумма квадратов по х и у высчитываются, а радиус (то есть 'A') вовзодим в квадрат
просто находит параметр, из него считает радиус эллипса, а дистанцию от центра эллипса до игрока известно, и тупо сравнивает сумму rэ(t)+rp с дистанцией
параметр эллипсе легко вычисляется - наклон эллипса прописан просто в поле эллипса, ничего не надо вертеть, а второй угол - от абсциссы мира и центра эллипса считается.
>>237899381 В любом случае, там используются синусы/косинусы. В случае с аппроксиммацией линиями - там только умножение и деление, должно быть быстрее.
>>237899689 Ну 2 синуса-косинуса при вычислении rэ через параметр (причем давно уже есть быстрые синусы и косинусы, ему хватит и ограниченной точности зато быстра) и один атангенс, ну или акосинус от дота, ну или дот
один хрен у него в графику упор, пусть сначала учиться красиво и быстро рисовать миллион пулей, со спецэффектами, постэффектами, триде на фоне, как у зуна, запилит менеджер состояний игры, а потом уже пулькам логику прикручивать
>>237902023 Заданная таблица синусов косинусов тангенсов атангесов акосинусов асинусов чтобы не ебаться каждый раз с тригонометрией а тупо доставать циферки из памяти.
>>237902023 LookUp Table. Считаешь, к примеру, 65535 значений sin, записываешь их в массив - у тебя есть sin и cos за пару операций. >>237902048 Тогда ты переусложняешь.
Если делаешь клон тохи, можешь сделать отдельный байт-буффер размером с игровое поле и писать в него шаблоны объектов, с которыми нужно считать коллизии. Тогда для проверки на столкновение просто проверяешь, есть ли после смены координат игровой окружности в этом байт-буффере что-нибудь. Так у тебя будут насколько угодно сложные объекты с точностью до пикселя.
>>237903023 Тогда как все делают - прямоугольники и круги лепишь вокруг пули чтобы примерно подходило по форме и все. Алгоритмы коллизии с кругами и прямоугольниками дешевые.
>>237902984 Кстати да, с современными компами можно коллизию хоть в 4к тупо попиксельно проверять, щас не 98 год уже. С другой стороны это решение очень грязное.
>>237903485 >>237903613 Почему грязное? Это просто бессмысленно для таких одинаковых объектов как пули. С современными компами и кривые Безье будут ок, их раза в три дороже чем прямые считать. У тебя это распараллеливается как-нибудь?
>>237903723 Слишком сложно, тут уже подсказали и я сам решил рисовать коллайдеры через простые фигуры, с помощью которых легко считать пересечения, (эллипсы / отрезки с "шириной")
Если всё-таки функционально заданные пули выбираешь, я бы все проверял сначала на пересечение окружности игрока с координатами пуль, если пересечение есть, уже просчитывал бы пересечение геометрии этой пули с игроком.
>>237904365 Т.е. ты предлагаешь через GLSL заполнять буффер, а затем проверять все это дело в этом буффере?
Можешь тогда подсказать, как таким методом работать. На GLSL Только 3д сиськи делал и все
>>237904492 Координаты есть. Есть форма. Нужно проверить пересечение. Я конечно могу просто взять и проверять каждый пиксель, но это будет слишком неоптимизированно
>>237904746 > Я конечно могу просто взять и проверять каждый пиксель Ебнутый что ли, у тебя есть переменная которая отвечает за положение по xy если это 2д, которая меняется вот ты и сравниваешь эти переменные, чтобы объект не рассматривался как точка прикручиваешь уравнение нужной фигуры
>>237904746 >через GLSL заполнять буффер, а затем проверять все это дело в этом буффере? Я так понял, тебе зачем-то нужны именно функционально описанные хитбоксы, поэтому нет, я предлагаю считать сначала точки и если точки попадают в окружность, просчитывать для них геометрию.
>>237907839 Про распараллеливание средствами OpenGL/GLSL тебе уже сказали. Уравнение окружности ты знаешь. Эллипс отличается от окружности в данном контексте тем, что у него, грубо говоря, два радиуса (фокальные точки не нужны, потому что мы не карандашом и нитками его собрались чертить). Проверяешь сначала, входит ли координата пули в окружность игрока, для этого берёшь радиус окружности игрока + максимальный радиус эллипса пули. На этом этапе ты проверил столкновение двух окружностей. Если столкновение окружностей есть, надо проверить, есть ли столкновение твоей окружности теперь уже с эллипсом. Для этого тебе понадобится понять, как зависит изменение радиуса эллипса с углом его поворота. Эта зависимость - sin.
>>237914096 GLSL довольно простой, если нет религинозной непереносимости. >>237914180 На GLSL тебе придётся написать, собственно, проверку коллизий, поскольку объектов дохрена. Вообще, можно всю игру на нём написать, JS использовать только как фронтенд и для чтения ввода.
>>237914942 Я на глсл писать нормали для сисек, так что с ним на уровне дошкольника знаком (использова Three.js, если не ошибаюсь)
Вот только не пойму как именно сделать првоерку коллизий. Разве видеокарта не умеет только рисовать на экране?
А вообще примерно представляю как это будет работать:
Я закидываю в видеокарту массивы точек и радиусов, а получаю в ответ массив булинов? Если все булины = false, то столкновений не произошло, а если есть true, значит под индексами с true произошло столкновение.
>>237915155 >Разве видеокарта не умеет только рисовать на экране? Серьёзно? Про майнинг биткоинов на видеокартах думаешь шутка? У OpenGL пиздец какой хитровыебанный пайплайн, на одних только шейдерах можно практически всё что угодно считать, но обычно для векторизации (распараллеливания) используют.
Сложно сказать, какую часть лучше пилить на шейдерах и какую на JS по твоему описанию задачи. Можно координаты всех объектов в VBO хранить, средствами OpenGL же их обрабатывать и даже рендерить (видеокартой рендерить, охуеть, да? до чего только техника не дойдёт). Описанный тобой способ имеет смысл, если ты ещё какие-то хиртые нераспараллеливаемые операции собираешься производить, но тогда не зная, что это, я не могу сказать, как лучше.
Зачем тебе целый массив Булевых значений? В любом случае, если ты из JS будешь шмалять GLSL'ем, уверен, есть библиотеки с документацией.
>>237916100 Понял, все равно у меня пиздец (на скрине выше фпс падает после 2к+ пуль видно, что на логику игры затрачивается порядка 100 мс, то есть 10% от всего времени, так что думаю сейчас занятся рисовкой через glsl а не canvas.нарисуйХуй().
Можешь подсказать годные туториалы / документацию по glsl, чтобы не обосраться?
>>237919005 Понял, спасибо за совети енивей, а я попробую вкатится.
А так знаешь, настроение такое, что хуй знает чего хочу от жизни. Вроже бы как геймдев завлекает, нравится писать код и задачки разные решать (поэтому собственно и пишу игрушку), но с другой стороны больше веб знаю, чем тот же геймдев. И хер его знает, то ли идти полностью в геймдев, то ли ебашить веб после того как игрушку сделаю (думаю для резюме будет неплохим бонусом вкупе с различными сайтиками).
А еще тетя шлюха ебаная меня сегодня с нихуя в чс кинула. рот ее ебал. (не еот (мб и еот но ток ненамного)).
Ладно, пойду спать, спасибо за совету, завтра буду в архиве перечитывать что тут писали. Удачи тебе!