First-Person Camera
WASD movement with mouse look controls for immersive navigation.
What this code does
- Pointer Lock API: captures mouse for smooth look controls without cursor limits.
- WASD Movement: standard FPS controls for forward/back/strafe movement.
- Mouse Look: pitch and yaw rotation based on mouse movement with sensitivity control.
- Collision Detection: prevents camera from moving through terrain boundaries.
- Procedural World: randomly generated boxes and trees for exploration.
- Click Canvas: to enable mouse capture, ESC to release.
JavaScript (plain)
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000)
camera.position.set(0, 1.8, 5)
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(width, height)
document.querySelector('#app').appendChild(renderer.domElement)
let moveSpeed = 0.1
let mouseSensitivity = 0.002
let keys = {}
let pitch = 0, yaw = 0
// WASD movement
document.addEventListener('keydown', (e) => keys[e.code] = true)
document.addEventListener('keyup', (e) => keys[e.code] = false)
// Mouse look
document.addEventListener('mousemove', (e) => {
if (document.pointerLockElement) {
yaw -= e.movementX * mouseSensitivity
pitch -= e.movementY * mouseSensitivity
pitch = Math.max(-Math.PI/2, Math.min(Math.PI/2, pitch))
camera.rotation.set(pitch, yaw, 0, 'YXZ')
}
})
function animate() {
requestAnimationFrame(animate)
// Handle WASD movement logic
renderer.render(scene, camera)
}
animate()