Nape 2 — Кинематические тела

Интересным типом тела является кинематический. Этот тип дает возможность вручную управлять телом — положение, вращение.
На эти тела не действует гравитация, разные силы. Они не сталкиваются с другими кинематическими и статическими телами. С ними могут сталкиваться динамические тела. При столкновении кинем. и динам. тела, если динам. тело спит то оно пробуждается. Отчасти кинематическое тело можно сравнить с динамическим у которого allowMovement и allowRotation установлены в false (эти параметры отключают возможность динамическому телу двигаться и вращатся).
При столкновении динамического и кинематического тела генерируются те же события, которые генерятся при столкновении динамического с динамическим.

Как можно использовать кинематическое тело?
Например, для создания разного рода движущихся платформ, лифтом, конвейеров.
Для перемещения кинем. тела вы можете непосредственно задавать координаты и поворот так:

_kinematicBody.position.y += 5;
_kinematicBody.rotation += Math.PI/180 * 10;

Но как говорит Лука, «это похоже на телепортацию», потому хорошей симуляции у вас не получится. Вот пример движущийся по средством изменения позиции кинематической платформы и динамического тела на ней. Как видно результат ужасен — динамический кубик прыгает, дергается — вообщем полная фигня. Поэтому, лучше сразу забудьте эту возможность.

Второй способ, который является правильным, это перемещения платформы с помощью задания скорости (velocity) и вращение посредством задания угловой скорости (angularVel):

_kinematicBody.velocity.setxy(0, 100);
_kinematicBody.angularVel = 2;

Вот теперь так выглядит платформа
Значительно лучше!

Далее демонстрация того, что кинематическое тело выводит динамическое из сна.
(две кинематические платформы и динамический кубик, который засыпает)

Есть такие свойства у тела: kinematicVel/kinAngVel
На самом деле они никак не связаны с кинематическим телом, а названы они похоже тому как не изменяется кинематическое тело во время симуляции, так и они являются неизменными, то есть во время симуляции физ движок никак не влияет и не изменяет их.

Также, есть свойство surfaceVel, которое тоже указывает скорость для поверхности.

kinematicVel и surfaceVel очень похоже, но между ними есть разница.
kinematicVel применяется во всех физических стимуляциях (сопротивлении жидкости, вычислениях соединений, вычислениях при столкновении с другими объектами).
surfaceVel применяется только если есть столкновение с другим телом (применяется к этому телу).

Для чего это можно использовать?
Для создания конвейеров и трамплинов.
Есть еще одна разница между kinematicVel и surfaceVel.
Для kinematicVel если вы задаете Vec2(0, -10) — то тело, которое столкнулось с этой платформой будет получать скорость направленную вверх, потому будет подпрыгивать. Ну и наоборот, если +10 тело будет стремится вниз, то есть не будет подпрыгивать (Лука говорит так, представь что земля двигается вниз).
Если тоже значение задать surfaceVel, то тело при столкновении будет двигаться в противоположную сторону, то есть при +10 будет двигаться вверх (+y вдоль нормали).

Ну и на последок демка с лифтом, surfaceVel, kinematicVel…
Исходный код тут и тут.

This movie requires Flash Player 9

Поделиться в соц. сетях

Опубликовать в LiveJournal
Опубликовать в Google Plus
  • ggman

    Недавно в одной игре видел такой-себе эффект притяжения, когда в радиусе круга все тела притягивались к его центру. Не подскажешь, как такое сделать при помощи nape 2.

  • VirtualMaestro

    Честно говоря пока мне не надо было такое, потому надо пробовать. Знаю только, что делается с помощью сил (не манипуляциями гравитации).
    Есть в сети по запросу radial gravity, пример есть для Box2D, но тоже подойдет для нейп.

  • xrapa

    есть небольшой вопросик.
    создаю статическое и кинетическое тело, задаю скорость кинетическому телу, по идеи оно должно врезаться в статическое, но пролетает его. меняю кинетическое на динамическое и все ок. как сделать чтоб кинетическое тело остановилось?

    • VirtualMaestro

      так и должно быть. Кинетическое тело создано, чтобы им вручную управлять, оно не реагирует на физ симуляцию и слушатели не срабатывают если «сталкиваются» кинематическое и статическое тело.

      Но можно сделать хак с использованием динамического тела. Сделать платформу как динамическое тело но параметр allowMovement установить в false. Тогда будет возможность управлять телом вручную и оно будет реагировать на слушатели.

      Или другой вариант, если заданна конкретная линия по которой должна двигаться платформа, тогда можно использовать соединение LineJoint, а также установить параметр тела allowRotation в false.

      На форуме Лука описывает данные моменты в этом топике http://deltaluca.me.uk/forum/index.php/m/4072/50958b99d572c8af84336e04895f16d0