Возможно ли что бы физическое тело (b2Body) было сразу в двух мирах ?
У меня большой мир, который поделен на чанки. В каждом чанке свой мир и при переходе объекта в другой чанк проблема со столкновениями.
Когда объект между двумя чанками, то тут вот и проблема((
Что можно придумать?
Если физ тело в двух мирах, то это два тела, не?
И про переход не понятно, по сути там же массив тел и между ними идет обработка коллизий, как я понимаю переход - это мы берем тело из одного массива и пихаем в другой, или не так. Я к тому, что как может получится состояние когда тело между чанками?
Может я не понимаю как чанки делать?
Вот если бы объект телепортировался в чанк 2 при соприкосновении с чанком 2, то проблем бы не было (но телепортировать не получится вдруг будет стена).Вообще как чанки устроены можете объяснить?
ProQsy
чанки лучше делать такого размера, чтобы в памяти всегда был текущий и все к нему прилегающие. никаких телепортаций и клонирования объектов изобретать не надо.
Suslik
Это я понимаю, дело в том что я организовал свои чанки так: в каждом чанке свой b2World и свой список объектов. Проблема возникает тогда, когда игрок подходит к другому чанку. Игрок принадлежит к чанку 1, другой чанк 2 к которому подошел игрок не знает о игроке и этот чанк не обрабатывает его.
//
Я могу сделать что бы при вхождении в другой чанк игрок переносился в список другого чанка, но тогда он перестанет сталкиваться с объектами из другого чанка, в котором был ранее (выше картинка, если он будет между чанками, то он должен быть в списке объектов левого и правого чанка, но тогда получится что будет два независимых игрока и будет непонятка)
ProQsy
Я б наверное так сделал, как только физ.тело приближается к границе чанка, дублировать его в другом чанке в тех же координатах, чтоб как бы наложенные были. Как только тело удаляется от границы, то так же удалять соответствующий дубль.
DenBraun
Будет не правильно работать, вот например создастся дублированное физ. тело в чанке 2, а объект будет на границе чанков 1 и 2. Вот если другой объект чанка 2 толкнет игрока, то будет оттолкнуто дублирование физ. тело, но на физ. тело от чанка 1 оно ни как не повлияет, получится хрен пойми что.
Вы знаете как переходы объектов в другие чанки сделано, например, в том же майнкрафт?
ProQsy
Не скажу, что я подробно ориентируюсь в этом вопросе, но пришла в голову такая мысль. Наверняка можно получить список всех импульсов (или суммарный импульс), приложенных к телу.
Тогда, когда тело между мирами, мы можем создать еще одно дело в другом мире, в том же положении и с той же скоростью движения/вращения.
Затем, пока тело полностью не перейдет в один из миров, мы синхронизируем импульсы: каждый шаг симуляции к телу в одном мире прибавляем суммарный импульс, действующий на тело в другом мире.
ProQsy
> Вот если другой объект чанка 2 толкнет игрока, то будет оттолкнуто дублирование
> физ. тело, но на физ. тело от чанка 1 оно ни как не повлияет, получится хрен
> пойми что.
В течении времени дублирования тел, слушать необходимые события мира и дублировать их на тела. Согласен что идеально не получится, из-за плавающей точки для обработки физики, но не должно быть сильно заметно, не пробовал).
ProQsy
> Вы знаете как переходы объектов в другие чанки сделано, например, в том же
> майнкрафт?
Честно не знаю, не узнавал, просто с box2d много поработал, свою версию высказал реализации, а в майнкрафте скорее всего упрощенная физика, навряд ли там такой решение как я предложил.
ProQsy
> Будет не правильно работать, вот например создастся дублированное физ. тело в
> чанке 2, а объект будет на границе чанков 1 и 2. Вот если другой объект чанка 2
> толкнет игрока, то будет оттолкнуто дублирование физ. тело, но на физ. тело от
> чанка 1 оно ни как не повлияет, получится хрен пойми что.
Deirel
> пока тело полностью не перейдет в один из миров, мы синхронизируем импульсы:
> каждый шаг симуляции к телу в одном мире прибавляем суммарный импульс,
> действующий на тело в другом мире.
+
ProQsy
> Это я понимаю, дело в том что я организовал свои чанки так: в каждом чанке свой
> b2World и свой список объектов. Проблема возникает тогда, когда игрок подходит
> к другому чанку. Игрок принадлежит к чанку 1, другой чанк 2 к которому подошел
> игрок не знает о игроке и этот чанк не обрабатывает его.
мало ли, как ты это организовал. я тебе говорю, как это обычно делается. мир (b2World) всегда один, но в него добавляются и удаляются объекты по необходимости. чанк — это множество объектов, принадлежащих какой-то зоне. при добавлении чанка эти объекты добавляются в мир, при удалении — удаляются. в мир всегда должны быть добавлены те чанки, которые игрок непосредственно видит и все к ним прилегающие.
все эти рассказы про "дублировать все события на тела в обоих мирах" — это выдумки тех, кто это никогда не писал. хотя бы потому что солвер контактов — это в общем случае не просто события, которые можно дублировать, а часть общей системы связей, которую решает солвер. если что-то и получится, то на границах будет выглядеть как отстой.
Поддерживаю Suslik. Создавать несколько миров не только бесполезно, но еще и вредно. Если нужно подгружать отдельные куски(Чанки) - подгружать их в один мир, по скорости выполнения это еще и быстрее будет работать. Те куски что близко к игроку, но вне зоны действия - усыплять(Будут храниться в памяти, но не будут пересчитываться), те что ушли совсем далеко - сохранять и выгружать.
У меня есть подозрения что у ТС какой-то готовый загрузчик есть, который сразу создает b2World из файла с уровнем, и просто кажется что проще соединить миры, чем дописать загрузчик.
З.Ы. Я сам пользуюсь готовым кодом для загрузки R.U.B.E. миров, когда-нибудь планирую дописать что бы подгружать подуровни через слои, а не отдельным миром(cocos2d-x), в целом делов на несколько часов, как руки дойдут обязательно выложу
Deirel
> Тогда, когда тело между мирами, мы можем создать еще одно дело в другом мире, в
> том же положении и с той же скоростью движения/вращения.
Для этого существует конструктор копирования, хотя в данном случае это вообще не нужно обсуждать, обрабатывать несколько миров, которые должны друг с другом взаимодействовать - как минимум неразумно
Suslik
> все эти рассказы про "дублировать все события на тела в обоих мирах" — это
> выдумки тех, кто это никогда не писал.
я честно признался, не писал))), только предположение решения задачи, когда именно два мира
Всем спасибо, решил сделать один мир, тогда все проблемы уйдут)
С усыплением чанков хорошая идея.
Тема в архиве.