Fixed dice from falling through the floor when holding them
This commit is contained in:
parent
b94e06b5a7
commit
8b8bfbc0f0
@ -58,9 +58,7 @@ function DiceInteraction({ onSceneMount, onPointerDown, onPointerUp }) {
|
|||||||
);
|
);
|
||||||
const currentPosition = selectedMesh.getAbsolutePosition();
|
const currentPosition = selectedMesh.getAbsolutePosition();
|
||||||
let newPosition = ray.origin.scale(camera.globalPosition.y);
|
let newPosition = ray.origin.scale(camera.globalPosition.y);
|
||||||
// Manually set the y value, using currentPosition.y caused a bug with windows
|
newPosition.y = currentPosition.y;
|
||||||
// where the physics wasn't updated
|
|
||||||
newPosition.y = 1.5;
|
|
||||||
const delta = newPosition.subtract(currentPosition);
|
const delta = newPosition.subtract(currentPosition);
|
||||||
selectedMesh.setAbsolutePosition(newPosition);
|
selectedMesh.setAbsolutePosition(newPosition);
|
||||||
const velocity = delta.scale(1000 / scene.deltaTime);
|
const velocity = delta.scale(1000 / scene.deltaTime);
|
||||||
@ -79,6 +77,7 @@ function DiceInteraction({ onSceneMount, onPointerDown, onPointerUp }) {
|
|||||||
const selectedMeshRef = useRef();
|
const selectedMeshRef = useRef();
|
||||||
const selectedMeshVelocityWindowRef = useRef([]);
|
const selectedMeshVelocityWindowRef = useRef([]);
|
||||||
const selectedMeshVelocityWindowSize = 4;
|
const selectedMeshVelocityWindowSize = 4;
|
||||||
|
const selectedMeshMassRef = useRef();
|
||||||
function handlePointerDown() {
|
function handlePointerDown() {
|
||||||
const scene = sceneRef.current;
|
const scene = sceneRef.current;
|
||||||
if (scene) {
|
if (scene) {
|
||||||
@ -86,6 +85,11 @@ function DiceInteraction({ onSceneMount, onPointerDown, onPointerUp }) {
|
|||||||
if (pickInfo.hit && pickInfo.pickedMesh.name !== "dice_tray") {
|
if (pickInfo.hit && pickInfo.pickedMesh.name !== "dice_tray") {
|
||||||
pickInfo.pickedMesh.physicsImpostor.setLinearVelocity(Vector3.Zero());
|
pickInfo.pickedMesh.physicsImpostor.setLinearVelocity(Vector3.Zero());
|
||||||
pickInfo.pickedMesh.physicsImpostor.setAngularVelocity(Vector3.Zero());
|
pickInfo.pickedMesh.physicsImpostor.setAngularVelocity(Vector3.Zero());
|
||||||
|
|
||||||
|
// Save the meshes mass and set it to 0 so we can pick it up
|
||||||
|
selectedMeshMassRef.current = pickInfo.pickedMesh.physicsImpostor.mass;
|
||||||
|
pickInfo.pickedMesh.physicsImpostor.setMass(0);
|
||||||
|
|
||||||
selectedMeshRef.current = pickInfo.pickedMesh;
|
selectedMeshRef.current = pickInfo.pickedMesh;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,6 +110,10 @@ function DiceInteraction({ onSceneMount, onPointerDown, onPointerUp }) {
|
|||||||
velocity.scaleInPlace(1 / velocityWindow.length);
|
velocity.scaleInPlace(1 / velocityWindow.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-apply the meshes mass
|
||||||
|
selectedMesh.physicsImpostor.setMass(selectedMeshMassRef.current);
|
||||||
|
selectedMesh.physicsImpostor.forceUpdate();
|
||||||
|
|
||||||
selectedMesh.physicsImpostor.applyImpulse(
|
selectedMesh.physicsImpostor.applyImpulse(
|
||||||
velocity.scale(diceThrowSpeed * selectedMesh.physicsImpostor.mass),
|
velocity.scale(diceThrowSpeed * selectedMesh.physicsImpostor.mass),
|
||||||
selectedMesh.physicsImpostor.getObjectCenter()
|
selectedMesh.physicsImpostor.getObjectCenter()
|
||||||
@ -113,6 +121,7 @@ function DiceInteraction({ onSceneMount, onPointerDown, onPointerUp }) {
|
|||||||
}
|
}
|
||||||
selectedMeshRef.current = null;
|
selectedMeshRef.current = null;
|
||||||
selectedMeshVelocityWindowRef.current = [];
|
selectedMeshVelocityWindowRef.current = [];
|
||||||
|
selectedMeshMassRef.current = null;
|
||||||
|
|
||||||
onPointerUp();
|
onPointerUp();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user