【threejs教程】场景视角切换的神器:轨道控制器

简介: 【8月更文挑战第5天】threejs教程:场景视角切换的神器,轨道控制器

简介

本系列教程需要具备threejs的基础入门知识,了场景、几何体、相机等基础概念。

使用threejs的基础知识,可以很快的开发一个3D页面。
GIF 2023-11-16 15-26-23.gif
其核心代码如下:

<template>
  <div class="wrap" ref="threeContainer"></div>
</template>

<script setup>
import * as THREE from "three";
import {
   
    onMounted, ref } from "vue";

const threeContainer = ref(null);

// 1、创建3D场景对象Scene
const scene = new THREE.Scene();
// 添加网格地面
const gridHelper = new THREE.GridHelper(200, 10);
scene.add(gridHelper);

// 2、创建几何体Geometry模型
const geometry = new THREE.BoxGeometry(20, 20, 20);
const material = new THREE.MeshBasicMaterial({
   
   
  color: "blue",
});
const mesh = new THREE.Mesh(geometry, material);
// 设置模型mesh的xyz坐标
mesh.position.set(0, 40, 0);
scene.add(mesh);

// 3、使用虚拟相机观察模型
const camera = new THREE.PerspectiveCamera();
camera.position.set(0, 50, 200);
camera.lookAt(0, 0, 20); //坐标原点

// 4、渲染3D场景到DOM上
const width = 800; //宽度
const height = 500; //高度
const renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height); //设置three.js渲染区域的尺寸(像素px)
// 动画
renderer.setAnimationLoop(animation);
function animation() {
   
   
  mesh.rotation.x += 0.05;
  mesh.rotation.y += 0.05;
  renderer.render(scene, camera);
}

onMounted(() => {
   
   
  threeContainer.value.appendChild(renderer.domElement);
});
</script>

<style scoped></style>

什么是轨道控制器

Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。
简单拉来说,使用轨道控制器可以让我们的3D场景具备如下功能:

  • 使用鼠标左键旋转物体改变观察视角
  • 使用鼠标滚轮缩放视图
  • 使用右键平移视GIF 2023-11-16 15-52-13.gif

    OrbitControls API

    官方API地址:https://threejs.org/docs/index.html#examples/zh/controls/OrbitControls.enableZoom

    语法简介

    要使用轨道控制器,必须显示的导入该组件

    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
    

    OrbitControls使用方法如下

    OrbitControls( object : Camera, domElement : HTMLDOMElement )
    
  • object: (必须)将要被控制的相机。该相机不允许是其他任何对象的子级,除非该对象是场景自身。

  • domElement: 用于事件监听的HTML元素。

    代码示例

    import { OrbitControls } from "three/addons/controls/OrbitControls.js";
    // .....
    // 创建轨道控制器
    const controls = new OrbitControls( camera, renderer.domElement );
    
    GIF 2023-11-16 16-16-25.gif

    事件

    OrbitControls有三个事件
事件名 触发机制
change 当摄像机被组件改变时触发。
start 初始化交互时触发。
end 当交互结束时触发。

change事件代码示例
GIF 2023-11-16 16-31-22.gif

属性

OrbitControls属性很多,我们展示一些常用属性
image.png

阻尼效果演示

阻尼就是阻力的意思,如果没有阻力,根据牛顿定律,运动的物体将一直保持匀速直线运动。这意味着,如果开启了阻尼效果,旋转物体后,由于惯性,场景会继续运动。阻尼越小,物体运动的时间越久。

// 添加阻尼
controls.enableDamping = true;
controls.dampingFactor = 0.01;
// 必须调用.update()
function animation() {
   
   
  mesh.rotation.x += 0.05;
  mesh.rotation.y += 0.05;
+ controls.update();
  renderer.render(scene, camera);
}

GIF 2023-11-16 17-04-15.gif

自动旋转演示

// 开启自动旋转
controls.autoRotate = true;
// 设置自动旋转速度
controls.autoRotateSpeed = 5;

GIF 2023-11-16 17-09-32.gif

相关文章
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
2864 0
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
|
JavaScript
Threejs实现标签,自定义样式显示标签
Threejs实现标签,自定义样式显示标签
2063 0
Threejs实现标签,自定义样式显示标签
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
3687 0
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
2089 0
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
Threejs实现模拟管道液体流动
Threejs实现模拟管道液体流动
3652 0
Threejs实现模拟管道液体流动
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现下雨,下雪,阴天,晴天,火焰
2779 0
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现天空盒,全景场景,地面草地
Threejs实现天空盒,全景场景,地面草地
1974 0
Threejs实现天空盒,全景场景,地面草地
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
2637 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
902 1
Threejs用切线实现模型沿着轨道行驶
Threejs中导入GLTF模型克隆后合并
这篇文章详细说明了在Three.js中如何导入GLTF模型,对其进行克隆,并将多个克隆模型合并成一个整体模型的过程。
652 2
Threejs中导入GLTF模型克隆后合并