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

Взаимодействие тел

Страницы: 1 2 Следующая »
#0
12:53, 11 мар. 2014

Как реализовать следующее взаимодействие: тело А взаимодействует с телами Б, но не взаимодействует с телом С. Тело С не взаимодействует ни с А ни с Б. Тело Б взаимодействует с А, но не с С. Короче герой сталкивается с НПЦ1, а НПЦ2 не сталкивается ни с героем ни с НПЦ1. Через груповой индекс как-то не получается реализовать такую круговую взаимосвязь.


#1
13:04, 11 мар. 2014

https://www.iforce2d.net/b2dtut/collision-filtering

#2
14:57, 11 мар. 2014

За ссылку спасибо, правда я на АС3 пишу. А можна в двух словах минипример на 3 телах написать, как расставить биты или с груповым индексом, если кто разобрался?

#3
18:01, 11 мар. 2014

Ну по ссылке же максимально кратко всю инфу выложили.

Когда происходит collide, а когда нет. Пример есть - можно скачать и посмотреть. Что еще нужно?

#4
5:04, 12 мар. 2014

В указанном случае так:

CATEGORY_A = 1
CATEGORY_B = 2
CATEGORY_C = 4

MASK_A = CATEGORY_B
MASK_B = CATEGORY_A
MASK_C = 0;

Вкратце, простое правило: расставляешь своим телам категории, 1, 2, 4, 8, 16, 32, 64.. (16 категорий)
Маску каждому телу задаешь из категорий тех тел, с которыми оно должно пересекаться используя оператор "или" - ||.

Хотим чтобы тело A сталкивалось с телами категории B, C, D, F?

MASK_A = CAT_B | CAT_C | CAT_D | CAT_F

Не забываем, что у масок соответствующих тел (B, C, D, F) тоже должна стоять категория A:

MASK_B = ... | CAT_A
MASK_C = ... | CAT_A
...

#5
10:55, 12 мар. 2014

Теперь понятно стало. Спасибо огромное за разъяснение!

#6
13:24, 13 мар. 2014

Понятно то стало, но нефига не работает. Элементарное хотел сделать через биты чтоб 2 тела не взаимодействовали между собой.

телу А назначил: 

_fixture.filter.categoryBits=0x0001;

телу B назначил: 

_fixture.filter.categoryBits=0x0001;

В результате сталкиваются друг с другом :(

#7
14:24, 13 мар. 2014

Назначь телу А bits 1 << 1,  телу B 1 << 2.
При этом биты нигде не пересекаются, то есть тела не будут взаимодействовать друг с другом.

#8
14:55, 13 мар. 2014

Не совсем понял выражение 1 << 1 и 1 << 2, пишу на АС3. Тоесть  нада так:
А:

_fixture.filter.categoryBits=0x0001
В:
_fixture.filter.categoryBits=0x0002

И маски не ставить (маски если правильно понял ставят именно биты тех тел с которыми нада взаимодействовать?)

#9
16:15, 13 мар. 2014
А:
_fixture.filter.categoryBits=0x0001
В:
_fixture.filter.categoryBits=0x0002

Так тела всеравно сталкиваются между собой.

#10
1:56, 14 мар. 2014

Wells77
Твоя ошибка в том, что ДОЛЖНЫ использоваться и maskBits, и categoryBits.

Там же даже табличка приведена в качестве примера.
А условие collide считается так (оттуда же).

bool collide =
          (filterA.maskBits & filterB.categoryBits) != 0 &&
          (filterA.categoryBits & filterB.maskBits) != 0;

// The default values are 0x0001 for categoryBits and 0xFFFF for maskBits

И пример дан.

Оператор & на примере

01001000 & 
10111000 = 
--------
00001000

То бишь, если надо чтобы тела collide между собой
то допустим

// А: 
fixture.filter.categoryBits=0x0001 (00000001 в двоичном представлении)
fixture.filter.maskBits=0x0002 (00000010 в двоичном представлении)
// В: 
fixture.filter.categoryBits=0x0002
fixture.filter.maskBits = 0x0001

// или ((0 != fixtureA.filter.categoryBits & fixtureB.filter.maskBits) && (0 != fixtureB.filter.categoryBits & fixtureA.filter.maskBits))
В данном случае
00000001 & (fixtureA.filter.categoryBits) 
00000001 (fixtureB.filter.maskBits)
=
00000001 - тела взаимодействуют (ну там два условия - обе пары должны быть не равны нулю)
и наоборот 

Если не нужен collide, то к примеру

// А: 
fixture.filter.categoryBits=0x0001 
fixture.filter.maskBits=0x0001
// В: 
fixture.filter.categoryBits=0x0002
fixture.filter.maskBits = 0x0002

00000001 & (fixtureA.filter.categoryBits) 
00000010 (fixtureB.filter.maskBits)
=
00000000 (нет совпадающих единиц) - тела НЕ взаимодействуют по условию collide, другая пара фильтров даже не проверяется

Как-то так.

P.S. Учитель из меня никакой, я в курсе.

#11
2:08, 14 мар. 2014

Wells77

А: 
_fixture.filter.categoryBits=0x0001 
В: 
_fixture.filter.categoryBits=0x0002
> Так тела всеравно сталкиваются между собой.

CasDev
> The default values are 0x0001 for categoryBits and 0xFFFF for maskBits

Имеем

const bool collide = 
00000001 (fixtureA.filter.categoryBits)
11111111 (fixtureB.filter.maskBits)
=
00000001 (!= 0, т.е. true)
&&
00000010 (fixtureB.filter.categoryBits)
11111111 (fixtureA.filter.maskBits)
=
00000010 (!= 0, т.е. true)
= true - тела взаимодействуют.

Далее по тексту Daemon19.

#12
11:48, 17 мар. 2014
Если не нужен collide, то к примеру

// А: 
fixture.filter.categoryBits=0x0001 
fixture.filter.maskBits=0x0001
// В: 
fixture.filter.categoryBits=0x0002
fixture.filter.maskBits = 0x0002

При даной установке битов в 2 телах в итоге 2 тело вообще ни с кем не взаимодействует и тупо проваливается вниз. Есть подозрение что всем остальным телам и статическим платформам по-умолчанию 0x0001 биты присваиваются, но только догадка. Вобщем вопрос так и остался открытым.  Как выставить биты и маски 2 телам чтоб а)Они сталкивались б)Не сталкивались (но не проваливались сквозь стены и статические платформы)

#13
12:34, 17 мар. 2014

С горем по полам решил проблему:

Не взаимодействуют между собой но взаимодействуют со всеми остальными телами (как говорил раньше походу у всех тел. по ум категорибитс 0x0001):

//А
_fixture.filter.categoryBits=0x0002;
_fixture.filter.maskBits=0x0001;
//В
_fixture.filter.categoryBits=0x0002;
_fixture.filter.maskBits=0x0001;

Взаимодействуют между собой и со всеми остальными телами:

//А
_fixture.filter.categoryBits=0x0002;
_fixture.filter.maskBits=0x0001  | 0x0002;
//В
_fixture.filter.categoryBits=0x0002;
_fixture.filter.maskBits=0x0001  | 0x0002;

#14
12:37, 17 мар. 2014

Ну раз всем телам по умолчанию задана первая категория, то не используй ее явно =) То есть считаем, что 0x0001 это категория других тел.

а) всем 0x0001 во все маски и категории и все сталкиваются
б)

cat_a = 0x0002; 
cat_b = 0x0004;
mask_a = 0x0001;
mask_b = 0x0001;


Ну вот, опередил =)

Страницы: 1 2 Следующая »
Box2DФорумОбщее

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