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
动画库。使我们的动画更流畅哦。