![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Добрый день!
Что-то пока не могу найти ответ на вопрос. Два мат. тела сталкиваются в nape, как получить значение импульса получившие эти мат. тела и координату столкновения? |
|
|||||
|
Ну там же есть свойства у InteractionCallback, который передается аргументом в обработчик столкновений
private function onCollision(interaction:InteractionCallback):void { var firstBody:Body = interaction.int1.castBody; var impulse:Vec3 = interation.arbiters.at(0).totalImpulse(firstBody); // получаем импульс первого тела } Это при условии, что столкновения проверяются между телами, а не между объектами shape Ну а точку столкновения видимо только перебраться все арбитры. Тоже через interaction.arbiters |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Можно ли по подробнее, не совсем понял
Дело в том, что я пытаюсь сделать простенький ИИ поведения объектов (избегание и преследование, тему видел, но не хватило терпения разбираться в коде, решил сделать по своему, вроде ничего сложного нет), но загвоздка вышла, я использую body.velocity.* и каждые кадр меняю значение в зависимости от ситуации, но из-за этого сильно страдает физика столкновения, вот и хочу выдернуть вектор после столкновения и прибавлять к body.velocity.* п.с. а может есть вариант проще? |
|
|||||
|
Цитата:
Что касается Цитата:
__________________
return this... |
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Цитата:
|
|
|||||
|
Делюсь своими наработками, юзаю precollisionHandler для того чтобы, объекты могли проходить только под определённым углом и collisionHandler для отлова нужных столкновений
package ru.jumper.model.providers { import nape.callbacks.CbEvent; import nape.callbacks.CbType; import nape.callbacks.InteractionListener; import nape.callbacks.InteractionType; import nape.callbacks.ListenerList; import nape.callbacks.PreListener; public class CollisionsProvider { private var _listeners:ListenerList; public function CollisionsProvider(listeners:ListenerList) { _listeners = listeners; } public function bind(emmiter:CbType, target:CbType, callback:Function):CollisionsProvider { _listeners.add( new InteractionListener( CbEvent.BEGIN, InteractionType.COLLISION, emmiter, target, callback ) ); return this; } public function sensor(emmiter:CbType, target:CbType, callback:Function):CollisionsProvider { _listeners.add( new PreListener( InteractionType.COLLISION, emmiter, target, callback, 0, true ) ); return this; } } } var cbType1:CbType = new CbType(); var cbType2:CbType = new CbType(); body.cbTypes.add(cbType1); body.userData.normal = Vec2.fromPolar(1, Math.PI * 0.5); // задаем вектор указывающий вверх объекта body2.cbTypes.add(cbType2); body2.userData.normal = Vec2.fromPolar(1, Math.PI * 0.5); _napeCollision = new CollisionsProvider( _space.listeners ) .bind(cbType1,cbType2,collisionHandler) .sensor( cbType1, CbType.ANY_BODY, precollisionHandler); protected function collisionHandler(collision:InteractionCallback):void { // вектор столкновения var v1:Vec2 = collision.arbiters.at(0).collisionArbiter.normal; } protected function precollisionHandler(cb:PreCallback):PreFlag { var v1:Vec2 = cb.arbiter.collisionArbiter.normal; var body:Body = cb.int1.castBody; var v2:Vec2 = body.userData.normal; // Обработчик который пропускает или не пропускает два объекта, в зависимости от вектора столкновения между ними if (v1.dot(v2) <= 0) return PreFlag.IGNORE else return PreFlag.ACCEPT; } Добавлено через 9 минут собственно в CollisionsProvider можно заменить на и ловить данные после столкновений
__________________
return this... Последний раз редактировалось AlexCooper; 07.07.2015 в 19:38. |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:02. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|