Three.js - 轨迹球控件

Trackball 轨迹球控件类似于轨道控件。但是,它不保持恒定的相机向上矢量。这意味着相机可以绕其极点旋转。它不会翻转以保持正面向上。您可以像上一个一样添加它。

const controls = new THREE.TrackballControls(camera, render.domElement)

示例

查看以下示例。

trackball-controls.html

<!DOCTYPE html>
<html lang="en">
   <head>
      <title>Three.js - Trackball controls</title>
      <meta charset="utf-8" />
      <meta name="viewport" content="width=device-width, user-scalable=no, minimumscale=1.0, maximum-scale=1.0"/>
      <style>
         body {
            background-color: #ccc;
            color: #000;
            font-family: -applesystem, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
            Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
         }
         a {
            color: #f00;
         }
         #info {
            position: absolute;
            top: 0px;
            width: 100%;
            padding: 10px;
            box-sizing: border-box;
            text-align: center;
            -moz-user-select: none;
            -webkit-user-select: none;
            -ms-user-select: none;
            user-select: none;
            pointer-events: none;
            z-index: 1; /* TODO Solve this in HTML */
         }
         a,
         button,
         input,
         select {
            pointer-events: auto;
         }
      </style>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.7/dat.gui.js"></script>
      <script src="http://mrdoob.github.io/stats.js/build/stats.min.js"></script>
   </head>
   <body>
      <div id="info">
         <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - trackball controls<br /> MOVE mouse & press LEFT/A: rotate, MIDDLE/S: zoom, RIGHT/D: pan
      </div>
      <script type="module">
         // Adding trackball controls
         // You can rotate camera any direction you want using Trackball controls
         import { TrackballControls } from 'https://threejs.org/examples/jsm/controls/TrackballControls.js'
         let perspectiveCamera, orthographicCamera, controls, scene, renderer, stats
         const params = {
            orthographicCamera: false
         }
         const frustumSize = 400
         init()
         animate()
         function init() {
            const aspect = window.innerWidth / window.innerHeight
            perspectiveCamera = new THREE.PerspectiveCamera(60, aspect, 1, 1000)
            perspectiveCamera.position.z = 500
            orthographicCamera = new THREE.OrthographicCamera(
               (frustumSize * aspect) / -2,
               (frustumSize * aspect) / 2,
               frustumSize / 2,
               frustumSize / -2,
               1,
               1000
            )
            orthographicCamera.position.z = 500
            // world
            scene = new THREE.Scene()
            scene.background = new THREE.Color(0xcccccc)
            scene.fog = new THREE.FogExp2(0xcccccc, 0.002)
            const geometry = new THREE.CylinderGeometry(0, 10, 30, 4, 1)
            const material = new THREE.MeshPhongMaterial({ color: 0xffffff, flat
            Shading: true })
            for (let i = 0; i < 500; i++) {
               const mesh = new THREE.Mesh(geometry, material)
               mesh.position.x = (Math.random() - 0.5) * 1000
               mesh.position.y = (Math.random() - 0.5) * 1000
               mesh.position.z = (Math.random() - 0.5) * 1000
               mesh.updateMatrix()
               mesh.matrixAutoUpdate = false
               scene.add(mesh)
            }
            // lights
            const dirLight1 = new THREE.DirectionalLight(0xffffff)
            dirLight1.position.set(1, 1, 1)
            scene.add(dirLight1)
            const dirLight2 = new THREE.DirectionalLight(0x002288)
            dirLight2.position.set(-1, -1, -1)
            scene.add(dirLight2)
            const ambientLight = new THREE.AmbientLight(0x222222)
            scene.add(ambientLight)
            // renderer
            renderer = new THREE.WebGLRenderer({ antialias: true })
            renderer.setPixelRatio(window.devicePixelRatio)
            renderer.setSize(window.innerWidth, window.innerHeight)
            document.body.appendChild(renderer.domElement)
            stats = new Stats()
            document.body.appendChild(stats.dom)
            //
            const gui = new dat.GUI()
            gui
            .add(params, 'orthographicCamera')
            .name('use orthographic')
            .onChange(function (value) {
               controls.dispose()
               createControls(value ? orthographicCamera : perspectiveCamera)
            })
            //
            window.addEventListener('resize', onWindowResize)
            createControls(perspectiveCamera)
         }
         function createControls(camera) {
            controls = new TrackballControls(camera, renderer.domElement)
            controls.rotateSpeed = 1.0
            controls.zoomSpeed = 1.2
            controls.panSpeed = 0.8
            controls.keys = ['KeyA', 'KeyS', 'KeyD']
         }
         function onWindowResize() {
            const aspect = window.innerWidth / window.innerHeight
            perspectiveCamera.aspect = aspect
            perspectiveCamera.updateProjectionMatrix()
            orthographicCamera.left = (-frustumSize * aspect) / 2
            orthographicCamera.right = (frustumSize * aspect) / 2
            orthographicCamera.top = frustumSize / 2
            orthographicCamera.bottom = -frustumSize / 2
            orthographicCamera.updateProjectionMatrix()
            renderer.setSize(window.innerWidth, window.innerHeight)
            controls.handleResize()
         }
         function animate() {
            requestAnimationFrame(animate)
            controls.update()
            stats.update()
            render()
         }
         function render() {
            const camera = params.orthographicCamera ? orthographicCamera : pers
            pectiveCamera
            renderer.render(scene, camera)
         }
      </script>
   </body>
</html>

输出

Fly Controls