Войти
Box2DФорумОбщее

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

#0
6:49, 25 авг. 2017

Возможно ли что бы физическое тело (b2Body) было сразу в двух мирах ?

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


#1
10:55, 25 авг. 2017

Если физ тело в двух мирах, то это два тела, не?
И про переход не понятно, по сути там же массив тел и между ними идет обработка коллизий, как я понимаю переход - это мы берем тело из одного массива и пихаем в другой, или не так. Я к тому, что как может получится состояние когда тело между чанками?

#2
12:10, 25 авг. 2017
Безымянный | Несколько миров

синий прямоугольник пусть будет чанк 1, а красный чанк 2. Черный круг это игрок.
В данном случае игрок между двумя чанками и его физическое тело должно обрабатываться двумя мирами.

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

#3
15:22, 25 авг. 2017

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

#4
17:04, 25 авг. 2017

Suslik

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

#5
18:07, 25 авг. 2017

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

#6
19:27, 25 авг. 2017

DenBraun

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

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

#7
19:59, 25 авг. 2017

ProQsy
Не скажу, что я подробно ориентируюсь в этом вопросе, но пришла в голову такая мысль. Наверняка можно получить список всех импульсов (или суммарный импульс), приложенных к телу.
Тогда, когда тело между мирами, мы можем создать еще одно дело в другом мире, в том же положении и с той же скоростью движения/вращения.
Затем, пока тело полностью не перейдет в один из миров, мы синхронизируем импульсы: каждый шаг симуляции к телу в одном мире прибавляем суммарный импульс, действующий на тело в другом мире.

#8
20:01, 25 авг. 2017

ProQsy
> Вот если другой объект чанка 2 толкнет игрока, то будет оттолкнуто дублирование
> физ. тело, но на физ. тело от чанка 1 оно ни как не повлияет, получится хрен
> пойми что.
В течении времени дублирования тел, слушать необходимые события мира и дублировать их на тела. Согласен что идеально не получится, из-за плавающей точки для обработки физики, но не должно быть сильно заметно, не пробовал).

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

#9
20:08, 25 авг. 2017

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

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

#10
4:14, 26 авг. 2017

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

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

#11
13:04, 26 авг. 2017

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

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

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

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

#12
13:08, 26 авг. 2017

Suslik
> все эти рассказы про "дублировать все события на тела в обоих мирах" — это
> выдумки тех, кто это никогда не писал.
я честно признался, не писал))), только предположение решения задачи, когда именно два мира

#13
22:24, 27 авг. 2017

Всем спасибо, решил сделать один мир, тогда все проблемы уйдут)

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

Box2DФорумОбщее

Тема в архиве.