【Three.js基础】创建场景、渲染场景、创建轨道控制器(一)
创始人
2025-05-28 03:17:10

🐱 个人主页:不叫猫先生
🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通、TypeScript从入门到实践
📢 资料领取:前端进阶资料以及文中源码可以找我免费领取
🔥 前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)

目录

  • 一、 WebGL与Three.js的关系
  • 二、打包工具 [parcel](https://zh.parceljs.org/getting_started.html)
    • 1.安装
    • 2.配置package.json
  • 三、搭建three.js环境
    • 1.项目目录
    • 2.安装`three`
    • 3.新建`main.js`并在`index.html`引用
    • 4.创建一个场景(Creating a scene)
      • (1)创建场景
      • (2)创建相机
      • (3)设置相机的位置
      • (4)相机添加到场景
      • (5)创建几何体
      • (6)设置材质
      • (7)创建物体
      • (8)将几何体添加到场景
    • 5.渲染场景
      • (1)初始化渲染器
      • (2)设置渲染的尺寸大小
      • (3)将`webgl`渲染的`canvas`内容添加到`body`
      • (4)使用渲染器通过相机将场景渲染进来
    • 6.展示1(几何体静止)
    • 7.创建轨道控制器
    • 8.展示2(几何体可旋转)
  • 四、源码

在这里插入图片描述

一、 WebGL与Three.js的关系

WebGL(Web Graphics Library)是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 3D 和 2D 图形,不需要插件,即专门处理计算或处理3D图像的JS API。
Three.js 是一款 WebGL 框架,其WebGL 的 API 接口基础上又进行的一层封装。由西班牙巴塞罗那的程序员 Ricardo Cabbello Miguel 所开发,人称Mr.doob。

二、打包工具 parcel

Parcel 是 Web 应用打包工具,适用于经验不同的开发者。它利用多核处理提供了极快的速度,并且不需要任何配置。其他详细用法详见官网。

1.安装

yarn add parcel -D

2.配置package.json

{"scripts": {"dev": "parcel src/index.html","build": "parcel build src/index.html"}
}

三、搭建three.js环境

博主建议搭建一个本地的three.js环境,方便快速查看文档。

1.项目目录

├─ .parcel-cache
│  ├─ data.mdb
│  └─ lock.mdb
├─ dist
│  ├─ index.07fedde6.css
│  ├─ index.07fedde6.css.map
│  ├─ index.246235aa.js
│  ├─ index.246235aa.js.map
│  ├─ index.html
│  ├─ main.0632549a.js
│  ├─ main.0632549a.js.map
│  ├─ style.a11e3109.css
│  ├─ style.a11e3109.css.map
│  ├─ style.a11e3109.js
│  └─ style.a11e3109.js.map
├─ package.json
├─ src
│  ├─ assets
│  │  ├─ css
│  │  │  └─ style.css
│  │  └─ img
│  ├─ index.html
│  └─ main
│     └─ main.js
└─ yarn.lock

2.安装three

yarn add three -S

3.新建main.js并在index.html引用



Document




4.创建一个场景(Creating a scene)

创建场景借助three.js来进行显示,需要场景、相机和渲染器3个对象,透过然后通过摄像机渲染出场景。

(1)创建场景

new THREE.Scence();

(2)创建相机

three.js里有几种不同的相机,这使用的是PerspectiveCamera(透视摄像机),接收四个参数:

  • 视野角度(FOV):摄像机视锥体垂直视野角度,从视图的底部到顶部,显示器上能看到的场景范围,单位是角度,默认是50
  • 长宽比(aspect ratio):物体的宽/物体的高,比如(window.innerWidth / window.innerHeight),通常是使用画布的宽/画布的高,默认值是1(正方形画布)
  • 近截面(near plane):摄像机的近端面,默认值是0.1,其有效值范围是0到当前摄像机far plane(远端面)的值之间。
  • 远截面(far):摄像机的远端面,默认值是2000。

当物体某些部分比摄像机的远截面远或者比近截面近的时候,该这些部分将不会被渲染到场景中。该值必须大于near plane(摄像机视锥体近端面)的值。

new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)

(3)设置相机的位置

camera.position.set(0, 0, 10)

(4)相机添加到场景

scene.add(camera)

(5)创建几何体

BoxGeometry是四边形的原始几何类,它通常使用构造函数所提供的“width”、“height”、“depth”参数来创建立方体或者不规则四边形。

BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer)

  • width — X轴上面的宽度,默认值为1。
  • height — Y轴上面的高度,默认值为1。
  • depth — Z轴上面的深度,默认值为1。
  • widthSegments — (可选)宽度的分段数,默认值是1。
  • heightSegments — (可选)高度的分段数,默认值是1。
  • depthSegments — (可选)深度的分段数,默认值是1。
const cubeGeometry = new THREE.BoxGeometry();

(6)设置材质

这里使用的是基础网格材质(MeshBasicMaterial),以简单着色(平面或线框)方式来绘制几何体,不受光照的影响。使用color属性为几何体着色,默认值为白色 (0xffffff)

const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00})

(7)创建物体

根据几何体、材质创建物体。Mesh表示基于以三角形为polygon mesh(多边形网格)的物体的类。把几何体与材料融合就得到了网格,网格才是我们真正渲染的东西。
用法:Mesh( geometry : BufferGeometry, material : Material )

  • geometry(可选):BufferGeometry的实例,默认值是一个新的BufferGeometry。
  • material (可选):一个Material,或是一个包含有Material的数组,默认是一个新的MeshBasicMaterial。
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)

(8)将几何体添加到场景

scene.add(cube)

5.渲染场景

场景写完之后,需要进行渲染。

(1)初始化渲染器

这里使用的是WebGL1Renderer,该版本的渲染器会强制使用 WebGL 1 渲染上下文。注意:自r118起,WebGLRenderer会自动使用 WebGL 2 渲染上下文。

const renderer = new THREE.WebGL1Renderer()
console.log(renderer)//renderer中有一个canvas对象,就是我们看到的画布内容

(2)设置渲染的尺寸大小

renderer.setSize(window.innerWidth ,window.innerHeight)

(3)将webgl渲染的canvas内容添加到body

document.body.appendChild(renderer.domElement)

(4)使用渲染器通过相机将场景渲染进来

创建一个使渲染器能够在每次屏幕刷新时对场景进行绘制的循环。使用requestAnimationFrame时,当用户切换到其它的标签页时会暂停,不会浪费用户处理器资源,也不会损耗电池的使用寿命。

function render(){renderer.render(scene,camera)//渲染下一帧的就会调用requestAnimationFrame(render)
}
render()

6.展示1(几何体静止)

在这里插入图片描述

7.创建轨道控制器

Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。
用法:OrbitControls( object : Camera, domElement : HTMLDOMElement )

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

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

//导入控制器
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
//创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement);

8.展示2(几何体可旋转)

在这里插入图片描述

四、源码

main.js中的源码如下

import * as THREE from 'three'
//导入控制器
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'console.log(THREE)
//创建场景
const scene = new THREE.Scene();
//创建相机(角度,宽高比,,)
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
//相机位置
camera.position.set(0, 0, 10)
scene.add(camera);//添加物体
//创建几何体
const cubeGeometry = new THREE.BoxGeometry();
//设置材质
const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00})//根据几何体,材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
// 将几何体添加到场景
scene.add(cube)//初始化渲染器
const renderer = new THREE.WebGL1Renderer()//设置渲染的尺寸大小
renderer.setSize(window.innerWidth ,window.innerHeight)
console.log(renderer)//renderer中有一个canvas对象// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement)//使用渲染器,通过相机将场景渲染进来
// renderer.render(scene,camera)//创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement);
//创建一个使渲染器能够在每次屏幕刷新时对场景进行绘制的循环
function render(){renderer.render(scene,camera)//渲染下一帧的就会调用requestAnimationFrame(render)
}
render()

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...