第一人称移动 (相机移动)
发表于更新于
阅读量: 成都
技术探索第一人称移动 (相机移动)
Breezli全局变量
移动速度
1
| const moveSpeed = ref(0.02)
|
键盘标识位
1 2 3 4 5 6 7 8 9
| const keys = { w: false, a: false, s: false, d: false, q: false, e: false, shift: false, }
|
键盘事件
按下
1 2 3 4 5 6 7 8 9 10
| function onKeyDown(event) { const key = event.key.toLowerCase() if (keys.hasOwnProperty(key)) { keys[key] = true } if (event.key === 'Shift') { keys.shift = true moveSpeed.value = 0.05 } }
|
释放
1 2 3 4 5 6 7 8 9 10
| function onKeyUp(event) { const key = event.key.toLowerCase() if (keys.hasOwnProperty(key)) { keys[key] = false } if (event.key === 'Shift') { keys.shift = false moveSpeed.value = 0.02 } }
|
第一人称移动
通过更新 camera.position 来实现移动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| function handleFirstPersonMovement(delta) { const speed = moveSpeed.value * (delta * 60)
const direction = new THREE.Vector3() camera.getWorldDirection(direction)
const right = new THREE.Vector3() right.crossVectors(camera.up, direction).normalize()
if (keys.w) { camera.position.addScaledVector(direction, speed) } if (keys.s) { camera.position.addScaledVector(direction, -speed) }
if (keys.a) { camera.position.addScaledVector(right, speed) } if (keys.d) { camera.position.addScaledVector(right, -speed) }
if (keys.q) { camera.position.y += speed } if (keys.e) { camera.position.y -= speed }
controls.target.copy(camera.position).add(direction) }
|
init
相机参数
1 2 3 4 5 6 7
| camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ) camera.position.set(0.3, 0.7, 4)
|
控制参数
1 2 3 4
| controls = new OrbitControls(camera, renderer.domElement) controls.target.set(0, 0.7, 0) controls.enableDamping = true controls.dampingFactor = 0.1
|
键盘监听
1 2
| window.addEventListener('keydown', onKeyDown) window.addEventListener('keyup', onKeyUp)
|
animate
添加第一人称移动逻辑
1 2 3 4 5 6 7 8 9 10 11
| function animate() { const delta = clock.getDelta()
handleFirstPersonMovement(delta)
if (mixer) mixer.update(delta) controls.update() renderer.render(scene, camera) stats.update() }
|