Страницы

среда, 26 декабря 2012 г.

Взаимодействия объектов в Nape

      У физического движка Nape есть 3 типа взаимодействия объектов:

  • Столкновение (Collision) - это взаимодействие по умолчанию, которое возникает когда две Фигуры пересекаются и могут столкнуться. Сталкивание рассчитывается в зависимости от Материалов Фигур.
  • Датчик (Sensor) - с этим типом взаимодействия две пересекающихся фигуры пройдут друг через друга. Арбитры объектов все еще будут созданы и вы все еще будете получать обратные вызовы (callbacks).
  • Жидкость (Fluid) - этот тип взаимодействия отвечает в Nape за плавучесть. Когда две Фигуры пересекаются, на Тела начинает действовать архимедова сила (свойство Фигур FluidProperties fluidEnabled).
      То, какой из типов взаимодействия произойдет, зависит от фильтра IntercationFilters и флагов Фигур sensorEnabled и fluidEnabled.
      Два статических тела не могут иметь какого либо взаимодействия, за исключением взаимодействия Датчик, по крайней мере хотя бы одно тело должно быть динамическим. Это означает, что единственное взаимодействие, которое может произойти между двумя кинематическими телами - это взаимодействие Датчик.
      Взаимодействия Датчик наступают первыми, затем следуют взаимодействия Жидкость и уже после - взаимодействия Столкновений.
      При использовании InteractionFilters, фильтры определяют группу и маску и два фильтра "соглашаются" взаимодействовать если:

(filterA.group & filterB.mask != 0) && (filterB.group & filterA.mask != 0)

      В Nape есть понятие "На шаг вперед", что позволяет иметь отдельную группу и маски для каждого типа взаимодействия. Благодаря этому расчет взаимодействий осуществляется более точно.
      Рассмотрим понятие группа/маска на примере 3-х типов объектов: Ящики(Boxes), Шары(Balls) и Пончики(Donuts). При этом условимся, что Шары не должны соприкасаться с Ящиками и Пончиками, а Пончики не должны сталкиваться с другими Пончиками.

BallsBoxesDonuts
BallsYesNoNo
BoxesNoYesYes
DonutsNoYesNo


      Группы для фильтров назначаются так:


ballFilter    .collisionGroup = 1; // in binary this is 0000...00001
boxFilter     .collisionGroup = 2; // in binary this is 0000...00010
doughnutFilter.collisionGroup = 4; // in binary this is 0000...00100


      Теперь можно задать маску фильтрам согласно таблице:


ballFilter    .collisionMask = ~(2|4); // in binary this is 1111...11001
boxFilter     .collisionMask = ~1;     // in binary this is 1111...11110
doughnutFilter.collisionMask = ~(1|4); // in binary this is 1111...11010


      Столкновение срабатывает, когда у группы и маски бит = 1.

      Свойство InteractionGroups обеспечивает дополнительное управление взаимодействиями между объектами. InteractionGroups может быть сформировано в деревья и назначено Фигурам, Телам и Объединениям (Составным телам).
      Прежде две Фигуры начнут взаимодействовать, мы ищем общего предка в дереве InteractionGroup; и если эта группа существует и установлено проигнорировать взаимодействия, то эти две Фигуры не будет взаимодействовать.

     Рассмотрим на примере следующего дерева:

физический движок Nape - InteractionGroups
     В этом примере у нас есть группа G1, присвоенная телу B1, группа G2, присвоенная фигуре S2 и объединению C1, и имеет G1 как его родителя. Группа G3 присвоена объединению C2. Мы можем сжать этот пример (правый рисунок), чтобы увидеть ближайший InteractionGroup.
      В этом примере, взглянем на фигуры S2 и S3 - если в G2 установлено использовать взаимодействия, то S2 и S3 будут взаимодействовать. Если в G1 будет установлено игнорировать взаимодействия, то S1 и S2 не будут взаимодействовать.
     

Комментариев нет:

Отправить комментарий