fixed mouse interaction and removed most debugging

This commit is contained in:
2025-07-28 23:06:20 +01:00
parent 5aa2210b8a
commit a04cbe048f
4 changed files with 30 additions and 45 deletions

View File

@@ -22,25 +22,38 @@ export class EventManager {
} }
setupEventListeners(): void { setupEventListeners(): void {
// Mouse move event // Get the canvas element to ensure we're listening on the right element
window.addEventListener('mousemove', (event) => { const canvas = this.renderer.domElement
this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1
this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1 // Mouse move event - listen on both window and canvas for better coverage
const handleMouseMove = (event: MouseEvent) => {
// Calculate mouse position relative to the renderer's canvas
const rect = canvas.getBoundingClientRect()
this.mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1
this.mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1
// Update raycaster // Update raycaster
this.raycaster.setFromCamera(this.mouse, this.camera) this.raycaster.setFromCamera(this.mouse, this.camera)
// Calculate mouse position in world space // Project mouse position to the Z=0 plane (where most objects are)
const distance = 10 // Distance from camera const targetPlane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0)
const direction = this.raycaster.ray.direction.clone() const intersection = new THREE.Vector3()
direction.multiplyScalar(distance) this.raycaster.ray.intersectPlane(targetPlane, intersection)
// Update the mouse world position by setting its components directly if (intersection) {
this.mouseWorldPosition.copy(this.camera.position).add(direction) this.mouseWorldPosition.copy(intersection)
} else {
// Fallback: use a fixed distance projection
const distance = Math.abs(this.camera.position.z)
const direction = this.raycaster.ray.direction.clone()
direction.multiplyScalar(distance)
this.mouseWorldPosition.copy(this.camera.position).add(direction)
}
}
// Debug log to verify mouse interaction is working // Listen on both window and canvas
console.log('Mouse world position:', this.mouseWorldPosition.x.toFixed(2), this.mouseWorldPosition.y.toFixed(2), this.mouseWorldPosition.z.toFixed(2)) window.addEventListener('mousemove', handleMouseMove)
}) canvas.addEventListener('mousemove', handleMouseMove)
// Window resize event // Window resize event
window.addEventListener('resize', () => { window.addEventListener('resize', () => {

View File

@@ -22,16 +22,12 @@ class AAFHomepage {
private eventManager: EventManager private eventManager: EventManager
constructor() { constructor() {
console.log('AAFHomepage constructor started')
this.scene = new THREE.Scene() this.scene = new THREE.Scene()
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
const canvas = document.getElementById('three-canvas') as HTMLCanvasElement const canvas = document.getElementById('three-canvas') as HTMLCanvasElement
console.log('Canvas element:', canvas)
if (!canvas) { if (!canvas) {
console.error('Canvas element not found!')
throw new Error('Canvas element not found') throw new Error('Canvas element not found')
} }
@@ -61,8 +57,6 @@ class AAFHomepage {
} }
private init(): void { private init(): void {
console.log('Init method started')
// Setup renderer // Setup renderer
this.renderer.setSize(window.innerWidth, window.innerHeight) this.renderer.setSize(window.innerWidth, window.innerHeight)
this.renderer.setPixelRatio(window.devicePixelRatio) this.renderer.setPixelRatio(window.devicePixelRatio)
@@ -72,35 +66,21 @@ class AAFHomepage {
this.renderer.toneMapping = THREE.ACESFilmicToneMapping this.renderer.toneMapping = THREE.ACESFilmicToneMapping
this.renderer.toneMappingExposure = 1 this.renderer.toneMappingExposure = 1
console.log('Renderer configured')
// Setup camera (moved closer to the action) // Setup camera (moved closer to the action)
this.camera.position.set(0, 0, 6) this.camera.position.set(0, 0, 6)
this.camera.lookAt(this.attractionPoint) this.camera.lookAt(this.attractionPoint)
console.log('Camera positioned')
console.log('Physics world setup')
// Setup lighting // Setup lighting
LightingManager.setupLighting(this.scene) LightingManager.setupLighting(this.scene)
console.log('Lighting setup complete')
// Load and create objects from the main model // Load and create objects from the main model
this.loadAndCreateObjects() this.loadAndCreateObjects()
console.log('Model loading initiated')
// Setup event listeners // Setup event listeners
this.eventManager.setupEventListeners() this.eventManager.setupEventListeners()
console.log('Event listeners setup')
// Start animation loop // Start animation loop
this.animate() this.animate()
console.log('Animation loop started')
} }
private async loadAndCreateObjects(): Promise<void> { private async loadAndCreateObjects(): Promise<void> {

View File

@@ -241,18 +241,13 @@ export class ModelLoader {
physicsObjects: PhysicsObject[] physicsObjects: PhysicsObject[]
): Promise<void> { ): Promise<void> {
try { try {
console.log('Loading main_model.glb...')
const gltf = await this.loader.loadAsync('/models/main_model.glb') const gltf = await this.loader.loadAsync('/models/main_model.glb')
console.log('Model loaded successfully:', gltf)
// Extract and downsample the geometry for collision detection // Extract and downsample the geometry for collision detection
const originalGeometry = this.extractModelGeometry(gltf) const originalGeometry = this.extractModelGeometry(gltf)
if (originalGeometry) { if (originalGeometry) {
console.log('Extracted geometry with', originalGeometry.vertices.length / 3, 'vertices')
this.modelGeometry = this.downsampleGeometry(originalGeometry, 0.3) // 30% of original detail this.modelGeometry = this.downsampleGeometry(originalGeometry, 0.3) // 30% of original detail
console.log('Downsampled to', this.modelGeometry.vertices.length / 3, 'vertices for collision')
} else { } else {
console.warn('Failed to extract geometry, will use simple collision shapes')
this.modelGeometry = null this.modelGeometry = null
} }
@@ -308,7 +303,6 @@ export class ModelLoader {
// Add collision event listener with rotational effects // Add collision event listener with rotational effects
body.addEventListener('collide', (event: any) => { body.addEventListener('collide', (event: any) => {
console.log('Collision detected!')
// Add some spin on collision for more dynamic movement // Add some spin on collision for more dynamic movement
const impactStrength = event.contact?.getImpactVelocityAlongNormal() || 1 const impactStrength = event.contact?.getImpactVelocityAlongNormal() || 1
@@ -342,6 +336,7 @@ export class ModelLoader {
} }
console.log('Created', numInstances, 'instances of main_model with custom collision shapes') console.log('Created', numInstances, 'instances of main_model with custom collision shapes')
console.log('Total physics objects:', physicsObjects.length)
} catch (error) { } catch (error) {
console.error('Failed to load main_model.glb:', error) console.error('Failed to load main_model.glb:', error)

View File

@@ -79,8 +79,8 @@ export class PhysicsManager {
repulsionForce.z * repulsionForce.z repulsionForce.z * repulsionForce.z
) )
if (mouseDistance < 3 && mouseDistance > 0) { if (mouseDistance < 5 && mouseDistance > 0) { // Increased from 3 to 5
const repulsionStrength = 5.0 / (mouseDistance * mouseDistance + 0.1) const repulsionStrength = 15.0 / (mouseDistance * mouseDistance + 0.1) // Increased from 10.0 to 15.0
repulsionForce.scale(repulsionStrength, repulsionForce) repulsionForce.scale(repulsionStrength, repulsionForce)
obj.body.force.set( obj.body.force.set(
obj.body.force.x + repulsionForce.x, obj.body.force.x + repulsionForce.x,
@@ -88,9 +88,6 @@ export class PhysicsManager {
obj.body.force.z + repulsionForce.z obj.body.force.z + repulsionForce.z
) )
// Debug log to verify mouse repulsion is working
console.log('Mouse repulsion applied, distance:', mouseDistance.toFixed(2), 'strength:', repulsionStrength.toFixed(2))
// Add rotational torque from mouse interaction // Add rotational torque from mouse interaction
const torque = new CANNON.Vec3( const torque = new CANNON.Vec3(
(Math.random() - 0.5) * repulsionStrength * 0.1, (Math.random() - 0.5) * repulsionStrength * 0.1,