Add mouse picking functionality for spirits in app.js
This commit is contained in:
@@ -418,7 +418,7 @@ async function spawnSpirit(spiritData) {
|
|||||||
const { scene: gltfScene } = await gltfLoader.loadAsync(modelUrl);
|
const { scene: gltfScene } = await gltfLoader.loadAsync(modelUrl);
|
||||||
const spirit = new Spirit(scene, gltfScene, spiritData, spawnPos);
|
const spirit = new Spirit(scene, gltfScene, spiritData, spawnPos);
|
||||||
activeSpirits.push(spirit);
|
activeSpirits.push(spirit);
|
||||||
updateSpiritOverlay(spiritData);
|
//updateSpiritOverlay(spiritData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- Overlay-Logik ----
|
// ---- Overlay-Logik ----
|
||||||
@@ -468,6 +468,36 @@ function showSpiritOverlay(spirit) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mouse-Picking (zentral)
|
||||||
|
const raycaster = new THREE.Raycaster();
|
||||||
|
const mouse = new THREE.Vector2();
|
||||||
|
|
||||||
|
function onClick(e) {
|
||||||
|
// Normierte Koordinaten im WebGL-Fenster:
|
||||||
|
const rect = renderer.domElement.getBoundingClientRect();
|
||||||
|
mouse.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;
|
||||||
|
mouse.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;
|
||||||
|
|
||||||
|
raycaster.setFromCamera(mouse, camera);
|
||||||
|
// Sammle alle Meshes aus allen aktiven Spirits
|
||||||
|
let allMeshes = [];
|
||||||
|
for (const spirit of activeSpirits) {
|
||||||
|
spirit.gltf.traverse(mesh => {
|
||||||
|
if (mesh.isMesh) allMeshes.push(mesh);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const intersects = raycaster.intersectObjects(allMeshes, false);
|
||||||
|
if (intersects.length > 0) {
|
||||||
|
const mesh = intersects[0].object;
|
||||||
|
if (mesh.userData._spiritInfo) {
|
||||||
|
showSpiritOverlay(mesh.userData._spiritInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fügt das Event hinzu:
|
||||||
|
renderer.domElement.addEventListener('pointerdown', onClick);
|
||||||
|
|
||||||
// Kein automatisches Update mehr! Nicht von spawnSpirit aufrufen!
|
// Kein automatisches Update mehr! Nicht von spawnSpirit aufrufen!
|
||||||
// (aber Option: „verstecke Overlay“ falls Spirit verschwindet, kann man so machen...)
|
// (aber Option: „verstecke Overlay“ falls Spirit verschwindet, kann man so machen...)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user