衝突時に音でもならしてみようかなと思って、cannon.jsの衝突検出時に発生するcollide
イベントについて調べてみた。
衝突イベントは衝突毎に2回発生する
2つの物体が衝突するので、それぞれの物体に対してイベントを発火するようである。
cannon.js/World.js at master · schteppe/cannon.js · GitHubより抜粋:
if (!this.collisionMatrixPrevious.get(bi, bj)) {
// First contact!
// We reuse the collideEvent object, otherwise we will end up creating new objects for each new contact, even if there's no event listener attached.
World_step_collideEvent.body = bj;
World_step_collideEvent.contact = c;
bi.dispatchEvent(World_step_collideEvent);
World_step_collideEvent.body = bi;
bj.dispatchEvent(World_step_collideEvent);
}
きわめて低速でも衝突イベントは発生する
下記を使うと衝突時の速度が得られるようである。これを使用して、速度に応じて処理を切り分けるとよいのではないか。※参考サイトのコードでは絶対値(abs
)を取っている。詳細調べてないので正確な要否は不明だが、付けておいたほうが無難か。
contact.getImpactVelocityAlongNormal()