【three.js系列一】入门教程

一、搭建项目

  1. 创建文件夹并下载依赖

这里用 vite 打包,也可以选择其他打包构建工具

css 复制代码
mkdir three-demo
cd three-demo

npm i --save three
npm i --save-dev vite
  1. 新建 index.htmlmain.js
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>03 - First Three.js Project</title>
</head>
<body>
    <h1>Soon to be a Three.js website</h1>
    
    <canvas class="webgl"></canvas>
    
    <script type="module" src="/main.js"></script>
</body>
</html>

main.js导入并打印(后续 js 都添加到此文件)

js 复制代码
import * as THREE from 'three';

console.log(THREE)
  1. 修改 package.json, 配置打包和运行2个命令
js 复制代码
  "scripts": {
    "dev": "vite",
    "build": "vite build"
  },
  1. Vite 应该显示一个类似于 的 URL http://localhost:5173/。将其复制并粘贴到浏览器中,即可像打开任何网站一样打开它。

二、创建场景并制作物品

需要4个元素才能开始:

  • 包含对象的场景
  • 一些物体
  • 相机
  • 渲染器

场景

好比容器,将对象、模型、粒子、灯光等放入,指定时间渲染场景

Scene类创建场景

arduino 复制代码
const scene = new THREE.Scene()

对象

对象可以是很多东西。可以拥有原始几何图形、导入的模型、粒子、灯光等。

创建一个简单的红色立方体,使用BoxGeometry类,其前 3 个参数对应于盒子的大小

arduino 复制代码
// 创建立方体
const geometry = new THREE.BoxGeometry(1, 1, 1)

为了创建材质,使用带有一个参数的MeshBasicMaterial类:一个{}包含所有选项的对象。指定它的color属性。

php 复制代码
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })

颜色值可为:

  1. JS 十六进制,如0xff0000
  2. 字符串十六进制,如'#ff0000'
  3. 颜色名称,如red

创建最终的网格,使用Mesh类并发送geometry和 作为material参数

arduino 复制代码
const mesh = new THREE.Mesh(geometry, material)

使用add(...)方法将网格添加到场景中,不然看不见它:

csharp 复制代码
scene.add(mesh)

相机

相机不可见。当渲染场景时,它将是从该摄像机的角度进行的。一般只使用一台相机。

为了创建相机,我们使用PerspectiveCamera类。

我们需要提供两个基本参数。

1. 视野范围

视野是指你的视角有多大。如果您使用非常大的角度,您将能够同时看到每个方向,但会出现很大的失真,因为结果将绘制在一个小矩形上。如果使用小角度,物体看起来会放大。视野(或fov)以度数表示,对应于垂直视角。在本练习中,我们将使用75度角。

3. 纵横比

在大多数情况下,长宽比是画布的宽度除以高度。目前我们还没有指定任何宽度或高度,但稍后我们需要指定。与此同时,我们将创建一个具有可以重复使用的临时值的对象。

js 复制代码
// Sizes
const sizes = {
    width: 800,
    height: 600
}

// Camera
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
camera.position.z = 3
scene.add(camera)

ps: 相机必须添加到场景,不然会导致未知错误!

position属性是一个具有三个相关属性的对象:xyz。默认情况下,Three.js 认为前/后轴为z

渲染器

渲染器的工作就是进行渲染。

使用带有一个参数的WebGLRenderer类:一个{}包含所有选项的对象,指定canvas<canvas>为相对应的属性。

canvas在代码开头创建一个变量,然后获取在 HTML 中使用创建的元素并将其存储在其中document.querySelector(...)。 该setSize(...)方法将自动相应地调整我们的<canvas>,即渲染器大小:

arduino 复制代码
// Canvas
const canvas = document.querySelector('canvas.webgl')

// ...

// Renderer
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)

第一次渲染

调用render(...)渲染器上的方法并向其发送scene和 作为camera参数:

js 复制代码
renderer.render(scene, camera)

添加动画

js 复制代码
function animate() {
	requestAnimationFrame( animate );

	mesh.rotation.x += 0.01;
	mesh.rotation.y += 0.01;

	renderer.render( scene, camera );
}
animate();

全部代码

js 复制代码
import * as THREE from "three";

console.log(THREE);

// 场景 scene
const scene = new THREE.Scene();

// object
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(geometry, material);

scene.add(mesh);

const sizes = {
  width: 800,
  height: 600,
};

// Camera
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height);
camera.position.z = 5;
scene.add(camera);

const canvas = document.querySelector("canvas.webgl");

const renderer = new THREE.WebGLRenderer({ canvas: canvas });
renderer.setSize(sizes.width, sizes.height);

renderer.render(scene, camera);

function animate() {
  requestAnimationFrame(animate);

  mesh.rotation.x += 0.01;
  mesh.rotation.y += 0.01;

  renderer.render(scene, camera);
}

animate();

附录

参考官网demo: threejs-journey.com/lessons/fir...

相关推荐
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie1 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic2 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿2 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具3 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
qq_390161773 小时前
防抖函数--应用场景及示例
前端·javascript
John.liu_Test4 小时前
js下载excel示例demo
前端·javascript·excel
Yaml44 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事4 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶4 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json