I just wanted to share a small demo incase it may be of some use to others. The demo starts with one fixed box, then randomly creates 100 hexahedron’s (Hexahedron - Wikipedia) of random sizes. I had to look up that word because the objects created are not all cubes
Hopefully I’m doing this right. Below is the link to the public project, and a link to a release for quick viewing:
https://playcanvas.com/project/340894/overview/collisiontest
A few notable words about this demo include:
Objects are created dynamically Random diffuse color is assigned Collision, and Rigidbody are added dynamically Objects are created with restitution of 1, and when in contact with each other demonstrate an elastic collision (bouncy) Ground has restitution, and friction of 0.5, which gradually brings the objects to rest Ground plane collision box only covers half the total area, and objects may bounce off to oblivion Fixed camera. No support for moving about.
The important part of the code is shown below, mainly because I’m not sure how long it will be available for:
SpawnEntity: function () { if(!this.entityNode || this.spawnedEntities >= this.maxEntities) { return; } var cube = new pc.Entity(); cube.name = 'cube-' + Math.random().toFixed(4); cube.addComponent('model', { type: 'box', castShadows: true, receiveShadows: true }); var a = this.RandomFloat(0.1, 1.0); var r = this.RandomFloat(0.05, 1.0); var g = this.RandomFloat(0.05, 1.0); var b = this.RandomFloat(0.05, 1.0); var material = app.assets.getAssetById(this.material).resource.clone(); material.diffuse.a = a; material.diffuse.r = r; material.diffuse.g = g; material.diffuse.b = b; cube.model.model.meshInstances[0].material = material; var px = this.RandomFloat(-20.0, 20.0); var py = this.RandomFloat(8.5, 35.5); var pz = this.RandomFloat(-20.0, 20.0); cube.setPosition(px, py, pz); var sx = this.RandomFloat(2.5, 4.5); var sy = this.RandomFloat(2.5, 4.5); var sz = this.RandomFloat(2.5, 4.5); cube.setLocalScale(sx, sy, sz); cube.addComponent('collision', { type: 'box', halfExtents: new pc.Vec3(sx * 0.5, sy * 0.5, sz * 0.5) }); cube.addComponent('rigidbody', { type: 'dynamic', mass: 1.0, enabled: true, restitution: 1.0 }); cube.rigidbody.syncEntityToBody(); this.entityNode.addChild(cube); this.spawnedEntities++; }, // // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random // RandomFloat: function (min, max) { return Math.random() * (max - min) + min; }, RandomInteger: function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; },