43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
|
|
import type {Testbed} from "../Testbed";
|
||
|
|
|
||
|
|
type RAPIER_API = typeof import("@dimforge/rapier3d");
|
||
|
|
|
||
|
|
export function initWorld(RAPIER: RAPIER_API, testbed: Testbed) {
|
||
|
|
let gravity = new RAPIER.Vector3(0.0, 0.0, 0.0);
|
||
|
|
let world = new RAPIER.World(gravity);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Create the cubes
|
||
|
|
*/
|
||
|
|
let num = 10;
|
||
|
|
let rad = 0.2;
|
||
|
|
|
||
|
|
let subdiv = 1.0 / num;
|
||
|
|
|
||
|
|
let i;
|
||
|
|
for (i = 0; i < num; ++i) {
|
||
|
|
let x = Math.sin(i * subdiv * Math.PI * 2.0);
|
||
|
|
let y = Math.cos(i * subdiv * Math.PI * 2.0);
|
||
|
|
|
||
|
|
// Build the rigid body.
|
||
|
|
let bodyDesc = RAPIER.RigidBodyDesc.dynamic()
|
||
|
|
.setTranslation(x, y, 0.0)
|
||
|
|
.setLinvel(x * 10.0, y * 10.0, 0.0)
|
||
|
|
.setAngvel(new RAPIER.Vector3(0.0, 0.0, 100.0))
|
||
|
|
.setLinearDamping((i + 1) * subdiv * 10.0)
|
||
|
|
.setAngularDamping((num - i) * subdiv * 10.0);
|
||
|
|
let body = world.createRigidBody(bodyDesc);
|
||
|
|
|
||
|
|
// Build the collider.
|
||
|
|
let colliderDesc = RAPIER.ColliderDesc.cuboid(rad, rad, rad);
|
||
|
|
world.createCollider(colliderDesc, body);
|
||
|
|
}
|
||
|
|
|
||
|
|
testbed.setWorld(world);
|
||
|
|
let cameraPosition = {
|
||
|
|
eye: {x: 0, y: 2.0, z: 20},
|
||
|
|
target: {x: 0, y: 2.0, z: 0},
|
||
|
|
};
|
||
|
|
testbed.lookAt(cameraPosition);
|
||
|
|
}
|