Added per dice physics properties

This commit is contained in:
Mitchell McCaffrey 2020-05-27 14:01:12 +10:00
parent d4ec013df2
commit da84f923d1
8 changed files with 61 additions and 11 deletions

View File

@ -4,7 +4,7 @@ import * as AMMO from "ammo.js";
import "babylonjs-loaders";
import ReactResizeDetector from "react-resize-detector";
const diceThrowSpeed = 20;
const diceThrowSpeed = 2;
function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) {
const sceneRef = useRef();
@ -101,7 +101,7 @@ function DiceScene({ onSceneMount, onPointerDown, onPointerUp }) {
const scene = sceneRef.current;
if (selectedMesh && scene) {
selectedMesh.physicsImpostor.applyImpulse(
velocity.scale(diceThrowSpeed),
velocity.scale(diceThrowSpeed * selectedMesh.physicsImpostor.mass),
selectedMesh.physicsImpostor.getObjectCenter()
);
}

View File

@ -57,7 +57,7 @@ class Dice {
return pbr;
}
static createInstanceFromMesh(mesh, name, scene) {
static createInstanceFromMesh(mesh, name, physicalProperties, scene) {
let instance = mesh.createInstance(name);
instance.position = mesh.position;
for (let child of mesh.getChildTransformNodes()) {
@ -70,13 +70,33 @@ class Dice {
instance.physicsImpostor = new BABYLON.PhysicsImpostor(
instance,
BABYLON.PhysicsImpostor.ConvexHullImpostor,
{ mass: 10, friction: 4 },
physicalProperties,
scene
);
return instance;
}
static getDicePhysicalProperties(diceType) {
switch (diceType) {
case "d4":
return { mass: 4, friction: 4 };
case "d6":
return { mass: 6, friction: 4 };
case "d8":
return { mass: 6.2, friction: 4 };
case "d10":
case "d100":
return { mass: 7, friction: 4 };
case "d12":
return { mass: 8, friction: 4 };
case "20":
return { mass: 10, friction: 4 };
default:
return { mass: 10, friction: 4 };
}
}
static roll(instance) {
instance.physicsImpostor.setLinearVelocity(BABYLON.Vector3.Zero());
instance.physicsImpostor.setAngularVelocity(BABYLON.Vector3.Zero());
@ -118,12 +138,13 @@ class Dice {
);
}
static async createInstance(mesh, scene) {
static async createInstance(mesh, physicalProperties, scene) {
this.instanceCount++;
return this.createInstanceFromMesh(
mesh,
`dice_instance_${this.instanceCount}`,
physicalProperties,
scene
);
}

View File

@ -20,7 +20,11 @@ class GalaxyDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene);
}
return Dice.createInstance(this.meshes[diceType], scene);
return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
}
}

View File

@ -8,6 +8,11 @@ class IronDice extends Dice {
static meshes;
static material;
static getDicePhysicalProperties(diceType) {
let properties = super.getDicePhysicalProperties(diceType);
return { mass: properties.mass * 2, friction: properties.friction };
}
static async createInstance(diceType, scene) {
if (!this.material) {
this.material = this.loadMaterial(
@ -20,7 +25,11 @@ class IronDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene);
}
return Dice.createInstance(this.meshes[diceType], scene);
return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
}
}

View File

@ -20,7 +20,11 @@ class NebulaDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene);
}
return Dice.createInstance(this.meshes[diceType], scene);
return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
}
}

View File

@ -20,7 +20,11 @@ class SunriseDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene);
}
return Dice.createInstance(this.meshes[diceType], scene);
return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
}
}

View File

@ -20,7 +20,11 @@ class SunsetDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene);
}
return Dice.createInstance(this.meshes[diceType], scene);
return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
}
}

View File

@ -20,7 +20,11 @@ class WalnutDice extends Dice {
this.meshes = await this.loadMeshes(this.material, scene);
}
return Dice.createInstance(this.meshes[diceType], scene);
return Dice.createInstance(
this.meshes[diceType],
this.getDicePhysicalProperties(diceType),
scene
);
}
}