Box2D
GameDev.ru / Сообщества / Box2D / Форум / Несколько миров

Несколько миров

Поделиться
ProQsyПользовательwww25 авг. 20176:49#0
Возможно ли что бы физическое тело (b2Body) было сразу в двух мирах ?

У меня большой мир, который поделен на чанки. В каждом чанке свой мир и при переходе объекта в другой чанк проблема со столкновениями.
Когда объект между двумя чанками, то тут вот и проблема((
Что можно придумать?

Правка: 27 авг. 2017 22:33

DenBraunПостоялецwww25 авг. 201710:55#1
Если физ тело в двух мирах, то это два тела, не?
И про переход не понятно, по сути там же массив тел и между ними идет обработка коллизий, как я понимаю переход - это мы берем тело из одного массива и пихаем в другой, или не так. Я к тому, что как может получится состояние когда тело между чанками?

Правка: 25 авг. 2017 10:55

ProQsyПользовательwww25 авг. 201712:10#2
Безымянный | Несколько миров
синий прямоугольник пусть будет чанк 1, а красный чанк 2. Черный круг это игрок.
В данном случае игрок между двумя чанками и его физическое тело должно обрабатываться двумя мирами.

Может я не понимаю как чанки делать?
Вот если бы объект телепортировался в чанк 2 при соприкосновении с чанком 2, то проблем бы не было (но телепортировать не получится вдруг будет стена).Вообще как чанки устроены можете объяснить?

SuslikМодераторwww25 авг. 201715:22#3
ProQsy
чанки лучше делать такого размера, чтобы в памяти всегда был текущий и все к нему прилегающие. никаких телепортаций и клонирования объектов изобретать не надо.
ProQsyПользовательwww25 авг. 201717:04#4
Suslik

Это я понимаю, дело в том что я организовал свои чанки так: в каждом чанке свой b2World и свой список объектов. Проблема возникает тогда, когда игрок подходит к другому чанку. Игрок принадлежит к чанку 1, другой чанк 2 к которому подошел игрок не знает о игроке и этот чанк не обрабатывает его.
//
Я могу сделать что бы при вхождении в другой чанк игрок переносился в список другого чанка, но тогда он перестанет сталкиваться с объектами из другого чанка, в котором был ранее (выше картинка, если он будет между чанками, то он должен быть в списке объектов левого и правого чанка, но тогда получится что будет два независимых игрока и будет непонятка)

DenBraunПостоялецwww25 авг. 201718:07#5
ProQsy
Я б наверное так сделал, как только физ.тело приближается к границе чанка, дублировать его в другом чанке в тех же координатах, чтоб как бы наложенные были. Как только тело удаляется от границы, то так же удалять соответствующий дубль.

Правка: 25 авг. 2017 18:08

ProQsyПользовательwww25 авг. 201719:27#6
DenBraun

Будет не правильно работать, вот например создастся дублированное физ. тело в чанке 2, а объект будет на границе чанков 1 и 2. Вот если другой объект чанка 2 толкнет игрока, то будет оттолкнуто дублирование физ. тело, но на физ. тело от чанка 1 оно ни как не повлияет, получится хрен пойми что.

Вы знаете как переходы объектов в другие чанки сделано, например, в том же майнкрафт?

DeirelПостоялецwww25 авг. 201719:59#7
ProQsy
Не скажу, что я подробно ориентируюсь в этом вопросе, но пришла в голову такая мысль. Наверняка можно получить список всех импульсов (или суммарный импульс), приложенных к телу.
Тогда, когда тело между мирами, мы можем создать еще одно дело в другом мире, в том же положении и с той же скоростью движения/вращения.
Затем, пока тело полностью не перейдет в один из миров, мы синхронизируем импульсы: каждый шаг симуляции к телу в одном мире прибавляем суммарный импульс, действующий на тело в другом мире.
DenBraunПостоялецwww25 авг. 201720:01#8
ProQsy
> Вот если другой объект чанка 2 толкнет игрока, то будет оттолкнуто дублирование
> физ. тело, но на физ. тело от чанка 1 оно ни как не повлияет, получится хрен
> пойми что.
В течении времени дублирования тел, слушать необходимые события мира и дублировать их на тела. Согласен что идеально не получится, из-за плавающей точки для обработки физики, но не должно быть сильно заметно, не пробовал).

ProQsy
> Вы знаете как переходы объектов в другие чанки сделано, например, в том же
> майнкрафт?
Честно не знаю, не узнавал, просто с box2d много поработал, свою версию высказал реализации, а в майнкрафте скорее всего упрощенная физика, навряд ли там такой решение как я предложил.

DenBraunПостоялецwww25 авг. 201720:08#9
ProQsy
> Будет не правильно работать, вот например создастся дублированное физ. тело в
> чанке 2, а объект будет на границе чанков 1 и 2. Вот если другой объект чанка 2
> толкнет игрока, то будет оттолкнуто дублирование физ. тело, но на физ. тело от
> чанка 1 оно ни как не повлияет, получится хрен пойми что.

Deirel
> пока тело полностью не перейдет в один из миров, мы синхронизируем импульсы:
> каждый шаг симуляции к телу в одном мире прибавляем суммарный импульс,
> действующий на тело в другом мире.
+

SuslikМодераторwww26 авг. 20174:14#10
ProQsy
> Это я понимаю, дело в том что я организовал свои чанки так: в каждом чанке свой
> b2World и свой список объектов. Проблема возникает тогда, когда игрок подходит
> к другому чанку. Игрок принадлежит к чанку 1, другой чанк 2 к которому подошел
> игрок не знает о игроке и этот чанк не обрабатывает его.
мало ли, как ты это организовал. я тебе говорю, как это обычно делается. мир (b2World) всегда один, но в него добавляются и удаляются объекты по необходимости. чанк — это множество объектов, принадлежащих какой-то зоне. при добавлении чанка эти объекты добавляются в мир, при удалении — удаляются. в мир всегда должны быть добавлены те чанки, которые игрок непосредственно видит и все к ним прилегающие.

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

Правка: 26 авг. 2017 4:16

TymonrПостоялецwww26 авг. 201713:04#11
Поддерживаю Suslik. Создавать несколько миров не только бесполезно, но еще и вредно. Если нужно подгружать отдельные куски(Чанки) - подгружать их в один мир, по скорости выполнения это еще и быстрее будет работать. Те куски что близко к игроку, но вне зоны действия - усыплять(Будут храниться в памяти, но не будут пересчитываться), те что ушли совсем далеко - сохранять и выгружать.

У меня есть подозрения что у ТС какой-то готовый загрузчик есть, который сразу создает b2World из файла с уровнем, и просто кажется что проще соединить миры, чем дописать загрузчик.

З.Ы. Я сам пользуюсь готовым кодом для загрузки R.U.B.E. миров, когда-нибудь планирую дописать что бы подгружать подуровни через слои, а не отдельным миром(cocos2d-x), в целом делов на несколько часов, как руки дойдут обязательно выложу

Deirel
> Тогда, когда тело между мирами, мы можем создать еще одно дело в другом мире, в
> том же положении и с той же скоростью движения/вращения.
Для этого существует конструктор копирования, хотя в данном случае это вообще не нужно обсуждать, обрабатывать несколько миров, которые должны друг с другом взаимодействовать - как минимум неразумно

DenBraunПостоялецwww26 авг. 201713:08#12
Suslik
> все эти рассказы про "дублировать все события на тела в обоих мирах" — это
> выдумки тех, кто это никогда не писал.
я честно признался, не писал))), только предположение решения задачи, когда именно два мира
ProQsyПользовательwww27 авг. 201722:24#13
Всем спасибо, решил сделать один мир, тогда все проблемы уйдут)

С усыплением чанков хорошая идея.

Правка: 27 авг. 2017 22:33

/ Форум / Box2D / Общее

2001—2017 © GameDev.ru — Разработка игр