Comments: |
From: | (Anonymous) |
Date: | August 10th, 2023 - 04:53 am |
---|
| | | (Link) |
|
вообразил так:
отрезаем куски, которые имеют опору, вычисляем центр оставшейся фигуры. если новый центр на опоре, ранний выход. вектор потенциального движения = от старого центра до нового. берём перпендикуляр вектора; если за ним фигура полностью без опоры, двигаем.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 05:04 am |
---|
| | | (Link) |
|
а у нас может получиться куча disjoint полигонов в итоге, некоторые ваще невыпуклые и с дырками внутри. что с этим дальше делать — не очень понятно.
если бы была гарантия, что саппорт точно больше квадратика — было бы всё просто. но увы…
From: | (Anonymous) |
Date: | August 10th, 2023 - 05:25 am |
---|
| | | (Link) |
|
геометрический центр у группы таких полигонов посчитать сильно затратно?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 07:28 am |
---|
| | | (Link) |
|
так это получится центр описаного выпуклого полигона, не?
Идея, может и дурацкая, но вдруг.
1. Пилим квадратик пополам. 2. Считаем под каждым пополамом процент пустоты 3. Если под каким-то пополамом процент больше, значит, скорее всего какая-то сторона больше свесилась, туда и толкаем.
Т.е. такая простенькая эмуляция физики.
Правда если 50х50 будет, то не сработает. Например, труп повис на чем-то типа балки или каната, тут уже на усмотрение, или так оставить (все-таки зацепился), или рандомно толкнуть в любую из сторон.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 05:09 am |
---|
| | | (Link) |
|
тут, например, такая ситуация: квадратик лежит на двух столбах, которые поддерживают противоположные углы (и не обязательно сами углы, столбики могут быть маленькие, где-то около углов). тут никуда двигать не надо, позиция устойчивая. но как определить, что она устойчивая?
в нормальном физонии у нас есть torque force, которая в итоге кубик наклонит и он сползёт. но в нашем случае никакого torque нет, и более того: наклонять ничего нельзя, и крутить нельзя. как минимум потому, что хуй коллизии посчитаешь.
Как вариант, в таком случае делать чвяк, и оставлять от трупа кровавые пятна, ебнулся на столбики - сам себе злобный буратино. Но это не аналитическое решение, а дизайнерское, зато быстрое, не требующее дополнительных вычислений...
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 07:29 am |
---|
| | | (Link) |
|
не хотет. какой интерес в мясном шутане, если трупы не остаются? вся идея в том, чтобы оставались, но не висели совсем уж идиотски.
Как вариант, тогда резать пополамы еще на пополамы, и вводить какой-то флаг, что если эти пополамы оба (крайние к общему квадратику, опорные) лежат на 0% пустоты, то не падает. Но, ИМХО, все эта резание и вычисление прОцентов, будет жрать вычислительную мощность.
Т.е. это примерно так, как вычисляется площадь объекта не квадратного, где-то в 3 классе, когда детей знакомят с площадью - на прозрачном листе рисуются квадраты 1 см квадратный, например, листочек накладывается на неквадратный объект, заполненные квадратики плюсуются, а не полностью заполненные квадратики плюсуются к площади примерно на глаз. Работает, красиво, но даже у мозга вычислительную мощность выжирает.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 04:35 pm |
---|
| | | (Link) |
|
это чисто программерское решение, причём вообще другой задачи. собственно получить нарезаные по краям квадратика кусочки не проблема, и для этого не надо ни subdivision, ни интегрирование. двигло и так активно нарезает полиобъекты, например, причём по более сложным границам.
и вообще, ты предлагаешь вычислять torque force. чего я не умею. %-)
однако ниже вон предложили интересное решение: нарезать, построить convex hull, проверить, находится ли в нём центр масс. тоже тормозно, но во-первых, делать это надо не так часто, во-вторых, делать это надо только если центр масс не лежит на полу. решение очень похоже на рабочее, поэтому я его запилил и буду посмотреть, как оно выглядит на практике.
Сел, подумал, идею изложил. Да, идея может быть говно, тем более, мне ее школьный опыт подсказал :) Но оригинальный Дум тоже писали по нашим меркам почти подростки, а по американским - вроде даже как юридически подростки :)
Да, я и техмех и теормех в учебе ненавидел, потому и в геймдев, слава Ктулху, не пошел. Многовато Ньютона для меня, тебе бы тут мой препод нужен был, но я контакты потерял. Он бы через векторные уравнения изложил.
Да, прочел. Надо посмотреть, сколько вычислительной мощности жрать будет. Про вычисления выпуклого многоугольника, понимаю, что это тоже непростая задача, на станках этим отдельные микрухи занимаются, которые там уже с завода стоят. Мы только картинку в координатах скидываем.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 05:08 pm |
---|
| | | (Link) |
|
да нормально, я ж не говню идею, просто поясняю, почему не подходит. я затем и псто написал, чтобы идей кидали.
>Про вычисления выпуклого многоугольника, понимаю, что это тоже непростая >задача на самом деле это очень простая задача, особенно если никуда не спешишь. классический gift wrapping вполне сойдёт: у нас там десяток точек, ну два — если очень не повезло. O(h*n), ваще похеру. двигло это делает только для потенциально висящих трупов (большинство откидывается по early exit), которых не так много, и делает это весьма редко. а если после возюкания трупа по полу он всё ещё висит — то двигло просто забивает хуй.
как раз прелесть в том, что один алгоритм (нарезатор) уже есть готовый, а обрамлятор очень простой.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 05:13 pm |
---|
| | | (Link) |
|
ну, в смысле, сложно построить convex hull когда у тебя тыщи точек на объект, и это надо делать кучу раз в каждом кадре. это не наша ситуация ваще, так что простейший метод «молотком и какой-то матерью» отлично подходит.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 04:38 pm |
---|
| | | (Link) |
|
если что, то куда именно потом толкать труп — ваще похую. в общем случае можно посчитать сумму нормалей всех линий, которые взаимодействуют с квадратиком, и толкать по результату. что я, собственно, и делаю. в большинстве случаев труп ползёт в более-менее правильном направлении. иногда в кривом, но похеру, пусть ползёт куда-нибудь, подобные гличи в думе нормальны: в ванилле трупы вообще по ступенькам взбираются, хуле.
From: | (Anonymous) |
Date: | August 10th, 2023 - 09:15 am |
---|
| | | (Link) |
|
>тут, например, такая ситуация: квадратик лежит на двух столбах, которые поддерживают противоположные углы (и не обязательно сами углы, столбики могут быть маленькие, где-то около углов). тут никуда двигать не надо, позиция устойчивая. но как определить, что она устойчивая?
IRL трупяк, лежащий на двух противоположных точках, должен "сложиться пополам" и свалиться вниз
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 10:04 am |
---|
| | | (Link) |
|
а в думе у нас трупы сделаны из крепкого дерева. когда оно так лежит — для дума это выглядит нормально. а вот когда оно висит на одном столбике, зацепившись краем — то ненормально. вот такой там странный мир.
вероятно анон имел в виду просто вариант с проваливанием таких трупов вниз до пола. и пофигу, что края обрежутся.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 11th, 2023 - 10:54 am |
---|
| | | (Link) |
|
анон явно имел в виду ragdolls. но в думе трупы как поленья: не гнутся.
а проваливать так нельзя, потому что придёт архвайл, оживит — а оно в стене застряло. я до этого делал вариант, когда у трупов радиус был меньше живых — они тогда цеплялись реже, но вот проблемы с архвайлами в полный рост.
From: | (Anonymous) |
Date: | August 17th, 2023 - 01:23 pm |
---|
| | | (Link) |
|
ну и окей тащемта, пусть в стене и сидит раз провалилось и застряло, не повезло, се ля ви и всё такое
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 17th, 2023 - 01:34 pm |
---|
| | | (Link) |
|
как я где-то уже писал — нельзя: архвайлы. мало того, что оживлённые застрянут, так ты не поверишь, но есть карты, где на оживлении архвайлами даже необходимая для прохождения механика строится. а бухают архи годно, в стену улетит только так.
я, конечно, очень извиняюсь, но если оживлённых обратно вверх поднимать? прямо во время оживления
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 18th, 2023 - 01:47 pm |
---|
| | | (Link) |
|
тут дело не вверх, а чтобы в стене не застряло. и нет, просто выпихивать из стены не вариант: во-первых, это тоже нихера не раз пёрнуть, а во-вторых, ты не поверишь… ну да, даже такую ебаторию как застрявшие монстры в картах используют.
дальше ты предложишь запоминать, кто изначально застрял, а кто трупом, конечно. на что я отвечу, что физоний и так перегружен, там каждый опкод на счету. я уже был вынужден сделать эвристический детектор в крестокоде, который пытается скипать вызов вм для физония (а весь физоний в вм сделан) для объектов, где без этого можно обойтись. да, надо: та же карта Memorial (все карты дума2, объединённые в одну большую) иначе наглухо неиграбельна, там тыщи монстров, всё тормозит как пизда.
ну, и уменьшение радиуса всё ещё не помогает во всех случаях, только в самых явных. а то, что я сейчас запилил — и помогает в подавляющем большинстве, и физоний лишним не грузит, и хорошо изолировано от остального кода.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 18th, 2023 - 01:50 pm |
---|
| | | (Link) |
|
а, ну да. это ещё и не говоря о том, что оживляется монстр после того, как анимация оживления проигралась, специальным вызовом метода в машине состояний. и получится так, что оно там где-то в стене оживляется, а потом ХУЯК! и выпрыгнуло. nekulturna.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 18th, 2023 - 01:51 pm |
---|
| | | (Link) |
|
и p.p.s.: а просто скольжение тут безопасно. потому что и в оригинале труп может уехать, это фича стандартного движка. и что в оригинале, что у меня — труп не сможет переехать линию с флагом "block monsters".
From: | (Anonymous) |
Date: | August 10th, 2023 - 05:36 am |
---|
| | | (Link) |
|
По сути, ты физоний и хочешь сделать.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 07:17 am |
---|
| | | (Link) |
|
угу. только очень своеобразный, и не могу придумать, как выкрутиться при описаных ограничениях. было б фул3д, где можно кубики крутить — я бы какие-нибудь верлеты въебал, а так…
Не, ну, после такого введения хочется искромётно пошутить.
Например, нужно ввести в игру монстров-анонов, которые будут летать по уровню и пожирать трупы и говно. Многие спросят, а кто разрешит им вылетать за границы секторов?.. но это ведь аноны - они не знают границ.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 07:26 am |
---|
| | | (Link) |
|
трупы и так умеют растворяться, но фи, это какая-то консольщина!
Ну, а если серьёзно, то можно, например, "пружинками" центр трупа толкать, - как в соответствующем алгоритме визуализации графов.
От каждой (прямой) границы сектора действует сила по нормали вовне, действующая на центр. Она пропорциональна расстоянию от центра до границы. Можно также силу домножить на длину сегмента границы, но не более чем размер трупа (чтобы уменьшить вклад коротких сегментов).
Силы складываются как векторы, и на каждом апдейте центр трупа продвигается по результирующей сумме пропорционально модулю и дельте-времени. Через время или установится равновесие сил (сумма будет близка к нулю), или труп выедет за все границы (как вышеупомянутый анон).
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 07:25 am |
---|
| | | (Link) |
|
у меня что-то отдалённо похожее и делается (правда, без учёта длин, только нормали).
за границы труп выехать не может, у него колдет есть жы.
тут проблема скорее определить «устойчивое положение», причём желательно быстро. если оно неустойчивое — то не особо важно, куда труп сталкивать, пусть едет куда-нибудь (сейчас по сумме нормалей и едет). и чтобы не проверять это на каждом тике, потому что дорого.
![[User Picture]](http://lj.rossia.org/userpic/1762/2926) | From: | illyge |
Date: | August 10th, 2023 - 07:07 am |
---|
| | | (Link) |
|
По точкам контакта строим выпуклый многоугольник, проверяем, лежит ли центр трупа внутри многоугольника, профит
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 07:20 am |
---|
| | | (Link) |
|
хм. спасибо, очень похоже на что-то, что может сработать. надо подумать и попробовать.
From: | (Anonymous) |
Date: | August 11th, 2023 - 07:55 am |
---|
| | | (Link) |
|
кажется сто пудов должно работать центр тяжести проецируется в пятно опоры - критерий устойчивости вроде какой-то наверно можно это вывести из равновесия моментов через какой-то матан
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 11th, 2023 - 10:52 am |
---|
| | | (Link) |
|
да, у меня тоже какие-то такие смутные воспоминания бродят. люди, помнящие физоний и механиконий, наверное, будут ржать что мы тут очевидную вещь ниасилили (все кроме одного).
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 11th, 2023 - 10:58 am |
---|
| | | (Link) |
|
блядь, по-моему это вообще школьная физика. позор на мои седины.
From: | (Anonymous) |
Date: | August 10th, 2023 - 11:56 am |
---|
| | | (Link) |
|
К сожалению, я не могу предоставить аналитическое решение для данной задачи. Тем не менее, я могу предложить вам некоторые подходы, которые могут помочь решить проблему.
Алгоритм пересечения: Вы можете реализовать алгоритм пересечения для каждого полигона карты и проверять, соприкасается ли он с боксом. Если полигон пересекается с боксом, вы можете определить, насколько близко он находится к краю и рассчитать вектор отталкивания с учетом большей массы части бокса, которая свесилась со скалы.
Простейшая проверка точки: Как вы уже упомянули, вы можете проверить, находится ли центр бокса над уступом, используя простейшую проверку точки. Если центр находится за пределами уступа, вы можете толкнуть бокс вниз.
Проверка касания сторон: Вы можете проверить касание каждой стороны бокса с полигонами и вычислить касательные векторы. Затем вы можете найти наименьшую дистанцию от каждой стороны бокса до полигона и определить, с какой стороны нужно толкнуть бокс.
Использование физического движка: Вы можете использовать физический движок, который поддерживает статические тела или collision detection, чтобы определить, где бокс пересекает полигоны и рассчитать вектор отталкивания.
Надеюсь, эти подходы помогут вам найти решение вашей задачи.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | August 10th, 2023 - 04:27 pm |
---|
| | | (Link) |
|
бормоталка ака чатгопота традиционно бесполезна. | |