【Three.js基础】创建场景、渲染场景、创建轨道控制器(一)

news2025/7/19 5:42:39

🐱 个人主页:不叫猫先生
🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏: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引用

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<link rel="stylesheet" href="./assets/css/style.css">
</head>
<body>
	<script src="./main/main.js" type="module"></script>
</body>
</html>

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web服务器配置管理

作者&#xff1a;敲代码の流川枫 博客主页&#xff1a;流川枫的博客 专栏&#xff1a;和我一起学java 语录&#xff1a;Stay hungry stay foolish 工欲善其事必先利其器&#xff0c;给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 文章目录…

CSS,HTML,JS 以及Vue前端面试题八股文总结【看完你就变高手】

■ 符号说明&#x1f498; 主题&#x1f31f; 常见重要&#x1f31b; 需要有印象的&#x1f195; v3新特性■ 杂谈&#x1f31b; SEO优化合理的title、description、keywords&#xff1a;搜索对着三项的权重逐个减小&#xff0c;title值强调重点即可&#xff1b;description把页…

vue3面试题:2022 最新前端 Vue 3.0 面试题及答案(持续更新中……)

1、 Vue2.0 和 Vue3.0 有什么区别&#xff1f; 响应式系统的重新配置&#xff0c;使用代理替换对象.define属性&#xff0c;使用代理优势&#xff1a; 可直接监控阵列类型的数据变化监听的目标是对象本身&#xff0c;不需要像Object.defineProperty那样遍历每个属性&#xff0…

20分钟上手ES6,不会ES6好意思说自己会JS ?

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;大二计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击查看更多 &#x1f310;关键&#xff1a;ES6 javascript 前端 文章目录理解ES6ES6 块级作用域 letES6 解构数组ES6 解构对象ES6 模板字符串ES6 判…

【Spring】IOC,你真的懂了吗?

作者:狮子也疯狂 专栏:《spring开发》 坚持做好每一步,幸运之神自然会驾凌在你的身上 目录 一. 🦁 前言二. 🦁 控制反转(IOC)Ⅰ. 🐇主要思想Ⅱ. 🐇原生技术创建实例弊端Ⅲ. 🐇自定义对象容器3.1 准备数据3.2 创建配置文件3.3 创建容器管理类3.4 创建StudentSer…

JS 数组中的 filter 方法

1、定义 filter()创建一个新的数组&#xff0c;新数组中的元素是通过检查指定数组中符合条件的所有元素。 2、语法 array.filter(function(currentValue,index,arr), thisValue); 3、参数说明 返回 4、用法 filter() 方法用于把Array中的某些元素过滤掉&#xff0c;然后返回…

echarts实现3d柱状图的两种方式

echarts实现3d柱状图的两种方式 看了不少关于3d柱状图的案例,发现做3d柱状图 常用的两种方式就是 自定义图形和象型柱图, 两种实现方式效果如下: 方法1: echarts.graphic.extendShape 自定义图形 echarts自定义图形的详细用法点这里, 官网点这里, 图中第一个3d柱状图我参考…

unplugin-auto-import 和 unplugin-vue-components

背景 unplugin-auto-import&#xff1a;为 Vite、Webpack、Rollup 和 esbuild 按需自动导入 API。支持 TypeScript。 unplugin-vue-components&#xff1a;Vue 的按需组件自动导入。 这两个插件都是涉及到按需自动导入&#xff0c;所以我们在使用 Vue 和其对应的 组件之类时…

最全的—— ES6有哪些新特性?

目录ES6新特性1、let和const2、symbol3、模板字符串3.1 字符串新方法&#xff08;补充&#xff09;4、解构表达式4.1 数组解构4.2 对象解构5、对象方面5.1 Map和Set5.1.1 Map5.1.2 Set5.3 数组的新方法5.3.1 Array.from()方法5.3.2 includes()方法5.3.3 map()、filter() 方法5.…

ES6中的箭头函数详细梳理

一、箭头函数的介绍 1.1 什么是箭头函数 ES6中允许使用>来定义函数。箭头函数相当于匿名函数&#xff0c;并简化了函数定义。 1.2 基本语法 // 箭头函数 let fn (name) > {// 函数体return Hello ${name} !; };// 等同于 let fn function (name) {// 函数体return …

vue是什么?vue的优点有哪些?

目录 一、vue是什么 二、为什么要用Vue&#xff1f; 1. 组件化 2. MVVM 数据双向绑定 3. 响应式 虚拟DOM 4.生命周期 三、Vue的优点 1. 轻量级 2. 高性能 3. 好上手 4. 插件化 5. 便于测试 6.运行速度更快 7.视图,数据,结构分离 一、vue是什么 Vue是一套用于构建…

vue基础用法基础原理整理

vue基础用法&基础原理整理 md文件地址&#xff1a;https://gitee.com/gaohan888/note 1. vue基础知识和原理 1.1 初识Vue 想让Vue工作&#xff0c;就必须创建一个Vue实例&#xff0c;且要传入一个配置对象demo容器里的代码依然符合html规范&#xff0c;只不过混入了一些特…

Vue3 中路由Vue Router 的使用

目录前言&#xff1a;一、什么是 Vue Router &#xff1f;二、路由的使用1、路由的安装2、路由的模式3、创建路由模块4、声明路由链接和占位符三、路由的重定向和别名四、嵌套路由五、声明式和编程式导航1、声明式导航2、编程式导航3、替换当前位置4、路由历史总结&#xff1a;…

如何使用vue-cli来搭建vue项目?详细步骤跟着我来吧!

目录 一、什么是vue-cli? 二、前提&#xff1a;搭建好NodeJS环境 安装vue-cli 三、使用脚手架vue-cli(2.X版)来构建项目 第一步 第二步 第三步 第三步 第四步 三、SPA完成路由的开发 第一步 ​编辑第二步 第三步 第四步 第四步 四、嵌套路由 使用children属性 五、知…

SpringMVC的文件上传

6.SpringMVC的文件上传 6.1-SpringMVC的请求-文件上传-客户端表单实现(应用) 文件上传客户端表单需要满足&#xff1a; 表单项type“file” 表单的提交方式是post 表单的enctype属性是多部分表单形式&#xff0c;及enctype“multipart/form-data” <form action"…

怎样创建一个VUE项目(超简单)

目录 一、安装node.js 二、搭建vue环境 1、全局安装vue/cli模块包 2、执行命令 3、检查是否安装成功 三、创建vue项目 1、创建项目 2、选择模板和包管理器&#xff0c;等待项目创建完毕 四、启动vue项目 1、执行命令 2、浏览项目页面 五、vue项目目录文件含义和作用…

2022 uniapp基础掌握及面试题整理

1.uniapp优缺点 优点: a. 一套代码可以生成多端 b. 学习成本低,语法是vue的,组件是小程序的 c. 拓展能力强 d. 使用HBuilderX开发,支持vue语法 e. 突破了系统对H5调用原生能力的限制 缺点: a. 问世时间短,很多地方不完善 b. 社区不大 c. …

2022前端面试题汇总(持续更新中~)

目录 1. 防抖和节流 2. js闭包 vue中的data为什么是一个函数&#xff1f;&#xff08;面试常问&#xff09; 3. ES6面试题 3.1 var let const 区别 3.2 解构 3.3 如何利用es6快速的去重&#xff1f; 3.4 Promise 面试题 以下代码的执行结果是&#xff1f; 4. Vue相关…

前端面试八股文(超详细)

JavaScript \1. Promise 的理解 Promise 是一种为了避免回调地狱的异步解决方案 2. Promise 是一种状态机&#xff1a; pending&#xff08;进行中&#xff09;、fulfilled&#xff08;已成功&#xff09;和rejected&#xff08;已失败&#xff09; 只有异步操作的结果&#…

2022最全最新前端面试题(附加解答)

JS 1、说一下innerHTML 与 innerText的作用与区别&#xff1f; 作用&#xff1a;都可以获取或者设置元素的内容区别&#xff1a;innerHTML可以解析内容中的html标签innerText不能解析内容中的html标签 2、JavaScript 由以下三部分组成&#xff1a; ECMAScript&#xff08;语…