này có thể đóng vai trò như một điểm khởi đầu tốt cho việc di chuyển/xoay/phóng to máy ảnh bằng chuột/bàn di chuột (theo loại):
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()
})
}
}
thả nó trong như:
this.cameraControl = new CameraControl(renderer, camera,() => {
// you might want to rerender on camera update if you are rerendering all the time
window.requestAnimationFrame(() => renderer.render(scene, camera))
})
Controls:
- di chuyển trong khi [giữ chuột trái/ngón tay duy nhất trên trackpad] để di chuyển camera trong x/y máy bay
- di chuyển [ bánh xe chuột/hai ngón tay trên bàn di chuột] để di chuyển lên/xuống theo hướng z
- giữ shift + [con chuột/hai fi ngers trên trackpad] để zoom in/out thông qua việc tăng/giảm lĩnh vực-of-view
- di chuyển trong khi giữ [chuột phải/hai ngón tay trên trackpad] để xoay camera (quaternion)
Ngoài :
Nếu bạn muốn phóng to bằng cách thay đổi 'khoảng cách' (thay vì yz) thay vì thay đổi trường, bạn có thể tăng/giảm vị trí của máy ảnh y và z trong khi vẫn giữ tỷ lệ y và z không thay đổi như:
// 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)
Đảm bảo bạn thêm trình xử lý sự kiện. Trong nguồn, chúng trông như thế này: document.addEventListener ('mousemove', onDocumentMouseMove, false); – meetar
Nó thất bại trong khi làm tương tự như đối với các điều khiển trackball trực quan. Vui lòng giúp tôi thực hiện điều này bằng các điều khiển trackball trực quan bằng camera chỉnh hình. –
Bạn đã đề cập đến mã nguồn nhưng tôi dường như không thể tìm thấy nó. Khi tôi xem các tệp JS được yêu cầu bởi ứng dụng bạn đã liên kết trong Công cụ dành cho Chrome Dev, tôi không thấy mã bạn đã đăng ở trên. Bạn có thể liên kết với nguồn hoặc giải thích cách bạn tìm thấy nó không? Tôi chủ yếu là curios nơi/cách biến isMouseDown và máy chiếu tham chiếu đoạn mã của bạn được xác định. Cảm ơn! – Casey