Added per dice physics properties
This commit is contained in:
parent
d4ec013df2
commit
da84f923d1
@ -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()
|
||||
);
|
||||
}
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user