Feature: guests have collisions + different sizes
This commit is contained in:
parent
b76810e883
commit
c17311036b
@ -9,7 +9,7 @@ const stageDepth = 5;
|
|||||||
const length = 25;
|
const length = 25;
|
||||||
const numGuests = 150;
|
const numGuests = 150;
|
||||||
const moveSpeed = 0.8;
|
const moveSpeed = 0.8;
|
||||||
const movementArea = { x: 20, z: length, y: 0, centerZ: -2 };
|
const movementArea = { x: 15, z: length, y: 0, centerZ: -2 };
|
||||||
const jumpChance = 0.01;
|
const jumpChance = 0.01;
|
||||||
const jumpDuration = 0.3;
|
const jumpDuration = 0.3;
|
||||||
const jumpHeight = 0.2;
|
const jumpHeight = 0.2;
|
||||||
@ -54,6 +54,9 @@ export class PartyGuests extends SceneFeature {
|
|||||||
|
|
||||||
const group = new THREE.Group();
|
const group = new THREE.Group();
|
||||||
|
|
||||||
|
const scale = 0.85 + Math.random() * 0.3;
|
||||||
|
group.scale.setScalar(scale);
|
||||||
|
|
||||||
// Body
|
// Body
|
||||||
const body = new THREE.Mesh(bodyGeo, material);
|
const body = new THREE.Mesh(bodyGeo, material);
|
||||||
body.position.y = 0.7; // Center of capsule (0.8 length + 0.3*2 radius = 1.4 total height. Center at 0.7)
|
body.position.y = 0.7; // Center of capsule (0.8 length + 0.3*2 radius = 1.4 total height. Center at 0.7)
|
||||||
@ -92,7 +95,7 @@ export class PartyGuests extends SceneFeature {
|
|||||||
|
|
||||||
// Position
|
// Position
|
||||||
const pos = new THREE.Vector3(
|
const pos = new THREE.Vector3(
|
||||||
(Math.random() - 0.5) * 10,
|
(Math.random() - 0.5) * movementArea.x,
|
||||||
0,
|
0,
|
||||||
movementArea.centerZ + ( rushIn
|
movementArea.centerZ + ( rushIn
|
||||||
? (((Math.random()-0.5) * length * 0.6) - length * 0.3)
|
? (((Math.random()-0.5) * length * 0.6) - length * 0.3)
|
||||||
@ -129,10 +132,35 @@ export class PartyGuests extends SceneFeature {
|
|||||||
if (this.guests.length === 0 || !state.partyStarted) return;
|
if (this.guests.length === 0 || !state.partyStarted) return;
|
||||||
|
|
||||||
const time = state.clock.getElapsedTime();
|
const time = state.clock.getElapsedTime();
|
||||||
|
const minDistance = 0.8; // Minimum distance to maintain
|
||||||
|
|
||||||
this.guests.forEach(guestObj => {
|
this.guests.forEach((guestObj, i) => {
|
||||||
const { mesh, leftArm, rightArm } = guestObj;
|
const { mesh, leftArm, rightArm } = guestObj;
|
||||||
|
|
||||||
|
// --- Collision Avoidance ---
|
||||||
|
let separationX = 0;
|
||||||
|
let separationZ = 0;
|
||||||
|
|
||||||
|
for (let j = 0; j < this.guests.length; j++) {
|
||||||
|
if (i === j) continue;
|
||||||
|
const otherMesh = this.guests[j].mesh;
|
||||||
|
|
||||||
|
const dx = mesh.position.x - otherMesh.position.x;
|
||||||
|
const dz = mesh.position.z - otherMesh.position.z;
|
||||||
|
const distSq = dx*dx + dz*dz;
|
||||||
|
|
||||||
|
if (distSq < minDistance * minDistance && distSq > 0.0001) {
|
||||||
|
const dist = Math.sqrt(distSq);
|
||||||
|
const force = (minDistance - dist) / minDistance;
|
||||||
|
separationX += (dx / dist) * force;
|
||||||
|
separationZ += (dz / dist) * force;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const separationStrength = 2.0;
|
||||||
|
mesh.position.x += separationX * separationStrength * deltaTime;
|
||||||
|
mesh.position.z += separationZ * separationStrength * deltaTime;
|
||||||
|
|
||||||
if (guestObj.state === 'WAITING') {
|
if (guestObj.state === 'WAITING') {
|
||||||
// Face the stage (approx z = -20)
|
// Face the stage (approx z = -20)
|
||||||
const dx = 0 - mesh.position.x;
|
const dx = 0 - mesh.position.x;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user