|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Apr 2010
Сообщений: 28
|
Реализовать адекватное разрушение объектов в Nape.
Доброго времени суток.
Задача следующая: есть телоА, которое летит в телоБ. При определенном импульсе/силе столкновения телоБ "разрушается" (просто удаляется). При этом телоА получает обратный импульс, достаточный для разрушения телаБ и летит дальше с уменьшенной скоростью. Проблемы: я облазил весь гугл и ничего толком по сабжу не нашел. Все пути ведут сюда: http://deltaluca.me.uk/forum/index.p...8337/#msg_4903 Мысли: я так понимаю, что надо в PreCollisionListener'е получить импульс столкновения, понять, достаточен ли он для уничтожения телаБ. Если да - то дать обратный импульс телуА и вернуть PreFlag.IGNORE, иначе - ничего не делать. Но вот КАК узнать этот импульс - голова кругом идет.. Буду благодарен любым советам.. |
|
|||||
если вы будете вычислять импульс в обработчике, то смысл физ двига пропадает как таковой ибо он уже сам все посчитал...чтобы тело не изменило вектор движения у него должно быть или масса или скорость много больше другого тела.
в любом случае у тела есть арбитры столкновений...вот в нем смотрите http://napephys.com/docs/types/nape/...onArbiter.html
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
Регистрация: Apr 2010
Сообщений: 28
|
Спасибо за отклик!
Проблему решил, используя первую рекомендацию по указанной мной же ссылке Когда открывал тему - был не в адеквате, поэтому не вник. На всякий случай оставлю решение, которое мне подошло. В precollisionlistener: if (obj1 is DestructableActor) { var impactImpulse:Vec2 = obj2.body.velocity.add(callback.arbiter.collisionArbiter.contacts.at(0).position.sub(obj2.body.position).perp().mul(obj2.body.angularVel)).mul(obj2.body.mass); var impactResult:Number = (obj1 as DestructableActor).strike(impactImpulse) / obj2.body.mass; if (impactResult > 0) { var xdy:Number = obj2.body.velocity.y / obj2.body.velocity.x; var otdachaX:Number = Math.sqrt(impactResult * impactResult / (1 + xdy * xdy)); var otdacha:Vec2 = Vec2.get( -otdachaX * obj2.body.velocity.x / Math.abs(obj2.body.velocity.x), - otdachaX * xdy * obj2.body.velocity.y / Math.abs(obj2.body.velocity.y)); obj2.body.applyImpulse(otdacha, callback.arbiter.collisionArbiter.contacts.at(0).position); return PreFlag.IGNORE; } } if (obj2 is DestructableActor) { var impactImpulse2:Vec2 = obj2.body.velocity.add(callback.arbiter.collisionArbiter.contacts.at(0).position.sub(obj2.body.position).perp().mul(obj2.body.angularVel)).mul(obj2.body.mass); var impactResult2:Number = (obj2 as DestructableActor).strike(impactImpulse2) / obj1.body.mass; if (impactResult2 > 0) { var xdy2:Number = obj1.body.velocity.y / obj1.body.velocity.x; var otdachaX2:Number = Math.sqrt(impactResult2 * impactResult2 / (1 + xdy2 * xdy2)); var otdacha2:Vec2 = Vec2.get( -otdachaX2 * obj1.body.velocity.x / Math.abs(obj1.body.velocity.x), - otdachaX2 * xdy2 * obj1.body.velocity.y / Math.abs(obj1.body.velocity.y)); obj1.body.applyImpulse(otdacha2, callback.arbiter.collisionArbiter.contacts.at(0).position); return PreFlag.IGNORE; } } |
Часовой пояс GMT +4, время: 10:09. |
|
« Предыдущая тема | Следующая тема » |
Теги |
nape , импульс , разрушение , Столкновения |
|
|