From f8af4259d15cc4f4760249385726efa8270e975a Mon Sep 17 00:00:00 2001 From: age2pierre Date: Fri, 5 Mar 2021 00:19:18 +0100 Subject: [PATCH 1/6] feat(body): adds trigger option --- src/objects/Body.ts | 19 +++++++++++-------- src/solver/Solver.ts | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/objects/Body.ts b/src/objects/Body.ts index d630710e9..ed7c2936c 100644 --- a/src/objects/Body.ts +++ b/src/objects/Body.ts @@ -9,18 +9,18 @@ import type { Material } from '../material/Material' import type { World } from '../world/World' export const BODY_TYPES = { - DYNAMIC: 1 as const, - STATIC: 2 as const, - KINEMATIC: 4 as const, -} + DYNAMIC: 1, + STATIC: 2, + KINEMATIC: 4, +} as const export type BodyType = typeof BODY_TYPES[keyof typeof BODY_TYPES] export const BODY_SLEEP_STATES = { - AWAKE: 0 as const, - SLEEPY: 1 as const, - SLEEPING: 2 as const, -} + AWAKE: 0, + SLEEPY: 1, + SLEEPING: 2, +} as const export type BodySleepState = typeof BODY_SLEEP_STATES[keyof typeof BODY_SLEEP_STATES] @@ -44,6 +44,7 @@ export type BodyOptions = { linearFactor?: Vec3 angularFactor?: Vec3 shape?: Shape + isTrigger?: boolean } /** @@ -130,6 +131,7 @@ export class Body extends EventTarget { aabbNeedsUpdate: boolean // Indicates if the AABB needs to be updated before use. boundingRadius: number // Total bounding radius of the Body including its shapes, relative to body.position. wlambda: Vec3 + isTrigger: boolean // When true "collide" events are still triggered but bodies do not interact. static idCounter: number static COLLIDE_EVENT_NAME: 'collide' @@ -246,6 +248,7 @@ export class Body extends EventTarget { this.aabbNeedsUpdate = true this.boundingRadius = 0 this.wlambda = new Vec3() + this.isTrigger = Boolean(options.isTrigger) if (options.shape) { this.addShape(options.shape) diff --git a/src/solver/Solver.ts b/src/solver/Solver.ts index 1d4777f5d..c2455b2c9 100644 --- a/src/solver/Solver.ts +++ b/src/solver/Solver.ts @@ -34,7 +34,7 @@ export class Solver { * @param {Equation} eq */ addEquation(eq: Equation): void { - if (eq.enabled) { + if (eq.enabled && !eq.bi.isTrigger && !eq.bj.isTrigger) { this.equations.push(eq) } } From 6ca609ce1375f09a6bdbb7db8c6aa9737dbe199c Mon Sep 17 00:00:00 2001 From: age2pierre Date: Fri, 5 Mar 2021 01:09:37 +0100 Subject: [PATCH 2/6] feat(demo): adds trigger minimal example --- examples/js/Demo.js | 8 ++--- examples/trigger.html | 68 ++++++++++++++++++++++++++++++++++++++++ index.html | 1 + screenshots/trigger.png | Bin 0 -> 23651 bytes 4 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 examples/trigger.html create mode 100644 screenshots/trigger.png diff --git a/examples/js/Demo.js b/examples/js/Demo.js index 77abab8ba..052c3bd2d 100644 --- a/examples/js/Demo.js +++ b/examples/js/Demo.js @@ -547,6 +547,7 @@ class Demo extends CANNON.EventTarget { this.currentMaterial = this.solidMaterial const contactDotMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff }) this.particleMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000 }) + this.triggerMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true }) const contactPointGeometry = new THREE.SphereGeometry(0.1, 6, 6) this.contactMeshCache = new GeometryCache(this.scene, () => { @@ -894,10 +895,9 @@ class Demo extends CANNON.EventTarget { throw new Error('The argument passed to addVisual() is not a body') } - // if it's a particle paint it red, otherwise just gray - const material = body.shapes.every((s) => s instanceof CANNON.Particle) - ? this.particleMaterial - : this.currentMaterial + // if it's a particle paint it red, if it's a trigger paint it as green, otherwise just gray + const isParticule = body.shapes.every((s) => s instanceof CANNON.Particle) + const material = isParticule ? this.particleMaterial : body.isTrigger ? this.triggerMaterial : this.currentMaterial // get the correspondant three.js mesh const mesh = bodyToMesh(body, material) diff --git a/examples/trigger.html b/examples/trigger.html new file mode 100644 index 000000000..192fc1c46 --- /dev/null +++ b/examples/trigger.html @@ -0,0 +1,68 @@ + + + + + cannon.js - trigger demo + + + + + + + diff --git a/index.html b/index.html index bf2674c0b..59ffe66d8 100644 --- a/index.html +++ b/index.html @@ -153,6 +153,7 @@ 'spring', 'stacks', 'tear', + 'trigger', 'trimesh', 'tween', ] diff --git a/screenshots/trigger.png b/screenshots/trigger.png new file mode 100644 index 0000000000000000000000000000000000000000..95cac91e3aed910215058c977d72a6778fbb3d15 GIT binary patch literal 23651 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 literal 0 HcmV?d00001 From 5c1d70fe7fc073113f3c064bd19686940050b2b2 Mon Sep 17 00:00:00 2001 From: age2pierre Date: Fri, 5 Mar 2021 17:22:31 +0100 Subject: [PATCH 3/6] docs(readme): add isTrigger to list of changes --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 9f224fee5..be3f4d108 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,7 @@ These minor changes and improvements were also made: - Added a property `World.hasActiveBodies: boolean` which will be false when all physics bodies are sleeping. This allows for invalidating frames when physics aren't active for increased performance. - Deprecated properties and methods have been removed. - The [original cannon.js debugger](https://github.com/schteppe/cannon.js/blob/master/tools/threejs/CannonDebugRenderer.js), which shows the wireframes of each body, has been moved to its own repo [cannon-es-debugger](https://github.com/pmndrs/cannon-es-debugger). +- Added a property `Body.isTrigger : boolean` which, when true allows for the body to trigger collision events without interacting physically with the other colliding bodies. If instead you're using three.js in a **React** environment with [react-three-fiber](https://github.com/pmndrs/react-three-fiber), check out [use-cannon](https://github.com/pmndrs/use-cannon)! It's a wrapper around cannon-es. From 21764c9c48d99683d5bf1ae14405f1f82a947f73 Mon Sep 17 00:00:00 2001 From: Marco Fugaro Date: Sat, 6 Mar 2021 18:57:06 +0100 Subject: [PATCH 4/6] Adjust the trigger demo --- examples/js/Demo.js | 4 +-- examples/trigger.html | 64 ++++++++++++++++++++++------------------ readme.md | 4 +-- screenshots/trigger.png | Bin 23651 -> 54434 bytes src/objects/Body.ts | 7 ++++- 5 files changed, 45 insertions(+), 34 deletions(-) diff --git a/examples/js/Demo.js b/examples/js/Demo.js index 052c3bd2d..320f5bda4 100644 --- a/examples/js/Demo.js +++ b/examples/js/Demo.js @@ -896,8 +896,8 @@ class Demo extends CANNON.EventTarget { } // if it's a particle paint it red, if it's a trigger paint it as green, otherwise just gray - const isParticule = body.shapes.every((s) => s instanceof CANNON.Particle) - const material = isParticule ? this.particleMaterial : body.isTrigger ? this.triggerMaterial : this.currentMaterial + const isParticle = body.shapes.every((s) => s instanceof CANNON.Particle) + const material = isParticle ? this.particleMaterial : body.isTrigger ? this.triggerMaterial : this.currentMaterial // get the correspondant three.js mesh const mesh = bodyToMesh(body, material) diff --git a/examples/trigger.html b/examples/trigger.html index 192fc1c46..ca7699b34 100644 --- a/examples/trigger.html +++ b/examples/trigger.html @@ -12,46 +12,52 @@ import { Demo } from './js/Demo.js' /** - * Demonstrates how to make use of trigger to allow others body to pass through them, yet still emit collision events + * Demonstrates the use of trigger bodies, bodies which don't + * collide with other bodies and allow you to run callbacks + * when another body enters/exits them. */ const demo = new Demo() demo.addScene('Trigger', () => { const world = setupWorld(demo) - const boxShape = new CANNON.Box(new CANNON.Vec3(1, 1, 1)) - const sphereShape = new CANNON.Sphere(1) + const radius = 1 - // Trigger body - const triggerBox = new CANNON.Body({ isTrigger: true }) - triggerBox.addShape(boxShape) - triggerBox.position.set(-5, 0, 0) - world.addBody(triggerBox) - demo.addVisual(triggerBox) + // Sphere moving towards right + const sphereShape = new CANNON.Sphere(radius) + const sphereBody = new CANNON.Body({ mass: 1 }) + sphereBody.addShape(sphereShape) + sphereBody.position.set(-5, 0, 0) + const impulse = new CANNON.Vec3(5.5, 0, 0) + const topPoint = new CANNON.Vec3(0, radius, 0) + sphereBody.applyImpulse(impulse, topPoint) + sphereBody.linearDamping = 0.3 + sphereBody.angularDamping = 0.3 + world.addBody(sphereBody) + demo.addVisual(sphereBody) - // Sphere - const movingSphere = new CANNON.Body({ mass: 5 }) - movingSphere.addShape(sphereShape) - movingSphere.position.set(5, 0, 0) - movingSphere.velocity.set(-5, 0, 0) - movingSphere.linearDamping = 0 - world.addBody(movingSphere) - demo.addVisual(movingSphere) + // Trigger body + const boxShape = new CANNON.Box(new CANNON.Vec3(2, 2, 5)) + const triggerBody = new CANNON.Body({ isTrigger: true }) + triggerBody.addShape(boxShape) + triggerBody.position.set(5, radius, 0) + world.addBody(triggerBody) + demo.addVisual(triggerBody) - // When a body collides with another body, they both dispatch the "collide" event. - triggerBox.addEventListener('collide', (event) => { - console.log('The box trigger was collided!', event) - }) - movingSphere.addEventListener('collide', (event) => { - console.log('The sphere was collided!', event) + // It is possible to run code on the exit/enter + // of the trigger. + triggerBody.addEventListener('collide', (event) => { + if (event.body === sphereBody) { + console.log('The sphere entered the trigger!', event) + } }) - - // When two bodies collide they also emit contact events world.addEventListener('endContact', (event) => { - console.log('World end contact event', event) - }) - world.addEventListener('beginContact', (event) => { - console.log('World begin contact event', event) + if ( + (event.bodyA === sphereBody && event.bodyB === triggerBody) || + (event.bodyB === sphereBody && event.bodyA === triggerBody) + ) { + console.log('The sphere exited the trigger!', event) + } }) }) diff --git a/readme.md b/readme.md index be3f4d108..014db7a42 100644 --- a/readme.md +++ b/readme.md @@ -6,16 +6,16 @@ It's a type-safe flatbundle (esm and cjs) which allows for **tree shaking** and These minor changes and improvements were also made: -- These PRs from the original repo were merged: [schteppe/cannon.js#433](https://github.com/schteppe/cannon.js/pull/433), [schteppe/cannon.js#430](https://github.com/schteppe/cannon.js/pull/430), [schteppe/cannon.js#418](https://github.com/schteppe/cannon.js/pull/418), [schteppe/cannon.js#360](https://github.com/schteppe/cannon.js/pull/360), [schteppe/cannon.js#265](https://github.com/schteppe/cannon.js/pull/265), [schteppe/cannon.js#392](https://github.com/schteppe/cannon.js/pull/392) +- These PRs from the original repo were merged: [schteppe/cannon.js#433](https://github.com/schteppe/cannon.js/pull/433), [schteppe/cannon.js#430](https://github.com/schteppe/cannon.js/pull/430), [schteppe/cannon.js#418](https://github.com/schteppe/cannon.js/pull/418), [schteppe/cannon.js#360](https://github.com/schteppe/cannon.js/pull/360), [schteppe/cannon.js#265](https://github.com/schteppe/cannon.js/pull/265), [schteppe/cannon.js#392](https://github.com/schteppe/cannon.js/pull/392), [schteppe/cannon.js#424](https://github.com/schteppe/cannon.js/pull/424) - The `ConvexPolyhedron` constructor now accepts an object instead of a list of arguments. [#6](https://github.com/pmndrs/cannon-es/pull/6) - The `Cylinder` is now oriented on the Y axis. [#30](https://github.com/pmndrs/cannon-es/pull/30) - The `type` property of the `Cylinder` is now equal to `Shape.types.CYLINDER`. [#59](https://github.com/pmndrs/cannon-es/pull/59) - `Body.applyImpulse()` and `Body.applyForce()` are now relative to the center of the body instead of the center of the world [86b0444](https://github.com/schteppe/cannon.js/commit/86b0444c93356aeaa25dd1af795fa162574c6f4b) - Sleeping bodies now wake up if a force or an impulse is applied to them [#61](https://github.com/pmndrs/cannon-es/pull/61) - Added a property `World.hasActiveBodies: boolean` which will be false when all physics bodies are sleeping. This allows for invalidating frames when physics aren't active for increased performance. +- Add support for [Trigger bodies](https://pmndrs.github.io/cannon-es/examples/trigger). [#79](https://github.com/pmndrs/cannon-es/pull/79) - Deprecated properties and methods have been removed. - The [original cannon.js debugger](https://github.com/schteppe/cannon.js/blob/master/tools/threejs/CannonDebugRenderer.js), which shows the wireframes of each body, has been moved to its own repo [cannon-es-debugger](https://github.com/pmndrs/cannon-es-debugger). -- Added a property `Body.isTrigger : boolean` which, when true allows for the body to trigger collision events without interacting physically with the other colliding bodies. If instead you're using three.js in a **React** environment with [react-three-fiber](https://github.com/pmndrs/react-three-fiber), check out [use-cannon](https://github.com/pmndrs/use-cannon)! It's a wrapper around cannon-es. diff --git a/screenshots/trigger.png b/screenshots/trigger.png index 95cac91e3aed910215058c977d72a6778fbb3d15..2313233ddfe5e5520e5d82d0cd4ea1d710c24682 100644 GIT binary patch literal 54434 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 diff --git a/src/objects/Body.ts b/src/objects/Body.ts index ed7c2936c..7d51a4643 100644 --- a/src/objects/Body.ts +++ b/src/objects/Body.ts @@ -131,7 +131,12 @@ export class Body extends EventTarget { aabbNeedsUpdate: boolean // Indicates if the AABB needs to be updated before use. boundingRadius: number // Total bounding radius of the Body including its shapes, relative to body.position. wlambda: Vec3 - isTrigger: boolean // When true "collide" events are still triggered but bodies do not interact. + /** + * When true the body behaves like a trigger. It does not collide + * with other bodies but collision events are still triggered. + * @default false + */ + isTrigger: boolean static idCounter: number static COLLIDE_EVENT_NAME: 'collide' From 65e71956a8fe40653c42e3830cfa1aaec12abf7a Mon Sep 17 00:00:00 2001 From: Marco Fugaro Date: Sat, 6 Mar 2021 19:01:04 +0100 Subject: [PATCH 5/6] Revert as const change --- src/objects/Body.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/objects/Body.ts b/src/objects/Body.ts index 7d51a4643..6b2fcd613 100644 --- a/src/objects/Body.ts +++ b/src/objects/Body.ts @@ -9,18 +9,18 @@ import type { Material } from '../material/Material' import type { World } from '../world/World' export const BODY_TYPES = { - DYNAMIC: 1, - STATIC: 2, - KINEMATIC: 4, -} as const + DYNAMIC: 1 as const, + STATIC: 2 as const, + KINEMATIC: 4 as const, +} export type BodyType = typeof BODY_TYPES[keyof typeof BODY_TYPES] export const BODY_SLEEP_STATES = { - AWAKE: 0, - SLEEPY: 1, - SLEEPING: 2, -} as const + AWAKE: 0 as const, + SLEEPY: 1 as const, + SLEEPING: 2 as const, +} export type BodySleepState = typeof BODY_SLEEP_STATES[keyof typeof BODY_SLEEP_STATES] From de322f9b37d66ed1c3df4448989087f15d95aacc Mon Sep 17 00:00:00 2001 From: Marco Fugaro Date: Sat, 6 Mar 2021 19:01:17 +0100 Subject: [PATCH 6/6] Update readme with correct PR number --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 014db7a42..b2f269227 100644 --- a/readme.md +++ b/readme.md @@ -13,7 +13,7 @@ These minor changes and improvements were also made: - `Body.applyImpulse()` and `Body.applyForce()` are now relative to the center of the body instead of the center of the world [86b0444](https://github.com/schteppe/cannon.js/commit/86b0444c93356aeaa25dd1af795fa162574c6f4b) - Sleeping bodies now wake up if a force or an impulse is applied to them [#61](https://github.com/pmndrs/cannon-es/pull/61) - Added a property `World.hasActiveBodies: boolean` which will be false when all physics bodies are sleeping. This allows for invalidating frames when physics aren't active for increased performance. -- Add support for [Trigger bodies](https://pmndrs.github.io/cannon-es/examples/trigger). [#79](https://github.com/pmndrs/cannon-es/pull/79) +- Add support for [Trigger bodies](https://pmndrs.github.io/cannon-es/examples/trigger). [#83](https://github.com/pmndrs/cannon-es/pull/83) - Deprecated properties and methods have been removed. - The [original cannon.js debugger](https://github.com/schteppe/cannon.js/blob/master/tools/threejs/CannonDebugRenderer.js), which shows the wireframes of each body, has been moved to its own repo [cannon-es-debugger](https://github.com/pmndrs/cannon-es-debugger).