Cela pourrait servir de bon point de départ pour déplacer/ rotatif /zoomer une caméra avec la souris/trackpad (en tapuscrit) :
class CameraControl {
zoomMode: boolean = false
press: boolean = false
sensitivity: number = 0.02
constructor(renderer: Three.Renderer, public camera: Three.PerspectiveCamera, updateCallback:() => void){
renderer.domElement.addEventListener('mousemove', event => {
if(!this.press){ return }
if(event.button == 0){
camera.position.y -= event.movementY * this.sensitivity
camera.position.x -= event.movementX * this.sensitivity
} else if(event.button == 2){
camera.quaternion.y -= event.movementX * this.sensitivity/10
camera.quaternion.x -= event.movementY * this.sensitivity/10
}
updateCallback()
})
renderer.domElement.addEventListener('mousedown', () => { this.press = true })
renderer.domElement.addEventListener('mouseup', () => { this.press = false })
renderer.domElement.addEventListener('mouseleave', () => { this.press = false })
document.addEventListener('keydown', event => {
if(event.key == 'Shift'){
this.zoomMode = true
}
})
document.addEventListener('keyup', event => {
if(event.key == 'Shift'){
this.zoomMode = false
}
})
renderer.domElement.addEventListener('mousewheel', event => {
if(this.zoomMode){
camera.fov += event.wheelDelta * this.sensitivity
camera.updateProjectionMatrix()
} else {
camera.position.z += event.wheelDelta * this.sensitivity
}
updateCallback()
})
}
}
le déposer comme :
this.cameraControl = new CameraControl(renderer, camera, () => {
// you might want to rerender on camera update if you are not rerendering all the time
window.requestAnimationFrame(() => renderer.render(scene, camera))
})
Contrôles :
- déplacer pendant [maintenir la souris à gauche / un seul doigt sur le pavé tactile]. pour déplacer la caméra dans le plan x/y
- déplacer [molette de la souris / deux doigts sur le trackpad] pour se déplacer vers le haut/bas dans la direction z
-
maintenir shift + [molette de la souris / deux doigts sur le trackpad]. pour effectuer un zoom avant/arrière par augmentation/diminution du champ de vision
- déplacer pendant en maintenant [la souris à droite / deux doigts sur le trackpad]. pour faire tourner la caméra (quaternion)
En outre :
Si vous voulez zoomer en changeant la "distance" (le long de yz) au lieu de changer le champ de vision, vous pouvez augmenter ou diminuer la position y et z de la caméra tout en gardant le rapport de la position y et z inchangé :
// in mousewheel event listener in zoom mode
const ratio = camera.position.y / camera.position.z
camera.position.y += (event.wheelDelta * this.sensitivity * ratio)
camera.position.z += (event.wheelDelta * this.sensitivity)