gitee 地址
gitee地址: gittee地址
本篇目标
- 使用
controls控制器对我们创建的模型添加交互添加controls控制器
引入控制器
本文使用的是OrbitControls(轨道控制器)1 2
   |  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
 
  | 
 
控制器列表
| 控制器名称 | 
控制器名称-中文 | 
描述 | 
| DragControls | 
拖放控制器 | 
该类被用于提供一个拖放交互。 | 
FirstPersonControls | 
第一人称控制器 | 
该类是 FlyControls 的另一个实现。 | 
OrbitControls | 
轨道控制器 | 
可以使相机围绕目标进行轨道运动。 | 
PointerLockControls | 
指针锁定控制器 | 
该类的实现是基于Pointer Lock API的。 对于第一人称3D游戏来说, PointerLockControls 是一个非常完美的选择。 | 
TrackballControls | 
轨迹球控制器 | 
TrackballControls 与 OrbitControls 相类似。然而,它不能恒定保持摄像机的up向量。 这意味着,如果摄像机绕过“北极”和“南极”,则不会翻转以保持“右侧朝上”。 | 
TransformControls | 
变换控制器 | 
该类可提供一种类似于在数字内容创建工具(例如Blender)中对模型进行交互的方式,来在3D空间中变换物体。 和其他控制器不同的是,变换控制器不倾向于对场景摄像机的变换进行改变。 | 
FlyControls | 
飞行控制器 | 
FlyControls 启用了一种类似于数字内容创建工具(例如Blender)中飞行模式的导航方式。 你可以在3D空间中任意变换摄像机,并且无任何限制(例如,专注于一个特定的目标)。 | 
 
添加/创建并使用控制器
1 2 3 4
   |  const controls = new OrbitControls( camera, renderer.domElement );
  controls.update()
 
  | 
 
我们需要在渲染函数中再次添加控制器的修改操作
添加后的渲染函数完整代码
1 2 3 4 5 6 7 8 9 10 11 12
   |  function animate() {          requestAnimationFrame(animate)        controls.update()
                     renderer.render(scene, camera) }
 
  | 
 
现在我们就可以使用鼠标拖动进行交互了

我这里将视频转成了gif格式的图片,所以看着就是上面这种画面。
现在看起来不流畅,没有那种拖动的阻尼感,我们给他添加阻尼的效果。
1 2 3 4
   |  const controls = new OrbitControls( camera, renderer.domElement );
  controls.enableDamping = true
 
  | 
 
现在看起来就真实多了。
现在我们看到我们的立方体的边缘有一些锯齿,看起来有点丑,我们给他去除锯齿,开启抗锯齿。
在我们的创建渲染器的时候给它添加antialias: true开启抗锯齿
1 2 3 4
   |  const renderer = new THREE.WebGLRenderer({     antialias: true,  });
 
  | 
 
这样我们的这个盒子看起来就很完美了。
完整代码
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
   | import * as THREE from "three"
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
 
 
 
  const scene = new THREE.Scene()
 
 
 
 
 
 
 
 
 
  const camera = new THREE.PerspectiveCamera(     75,      window.innerWidth / window.innerHeight,      0.1,      1000  )
 
  const renderer = new THREE.WebGLRenderer({     antialias: true,  });
  renderer.setSize(     1000,      500  );
  document.body.appendChild(renderer.domElement)
 
  const controls = new OrbitControls( camera, renderer.domElement );
  controls.enableDamping = true
  controls.update()
 
 
 
 
 
 
  let geometry = new THREE.BoxGeometry(10, 10, 10);
 
 
 
 
  const materials = [] for(let i = 0; i < 6; i++){     materials.push(new THREE.MeshBasicMaterial({ color: Math.random() * 0x00ff0000 })) }
 
  const cube = new THREE.Mesh( geometry, materials ); scene.add( cube );
 
  camera.position.z = 50;
 
  scene.background = new THREE.Color(0xffffcc99)
 
  const axesHelper = new THREE.AxesHelper(20) scene.add( axesHelper )
 
  function animate() {
           requestAnimationFrame(animate)
      controls.update()
                     renderer.render(scene, camera) }    
 
  animate()
   | 
 
下篇文章让我们的盒子动起来,添加动画并结合gsap动画库。使我们的动画更流畅哦。