Three.js上手——搭建Vue3+Three.js项目

news2024/9/29 19:18:37

上一篇文章 Three.js初试 介绍了一些 Three.js 的基本概念,这一篇主要是介绍一下它的应用。
结合 Vue3 + Vite 一起搭建一个项目。

项目初始化

Vite 项目构建

兼容性注意
Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。

要构建一个 Vite + Vue 项目,在命令行运行:

# npm 6.x
npm create vite@latest vue-three.js --template vue

# npm 7+, extra double-dash is needed:
npm create vite@latest vue-three.js -- --template vue

# yarn
yarn create vite vue-three.js --template vue

# pnpm
pnpm create vite vue-three.js --template vue

这里,我用的是 pnpm 包管理器。具体可以参考中文官网 pnpm。

Three.js 引入

命令行运行:

pnpm add three

版本为0.150.1

package.json
在需要使用 Three.js 的组件内引入

import * as THREE from 'three'

这样,一个 Vue+Three.js 项目搭起来了。

创建容器

<template>
  <div id="container" />
</template>

核心要素:场景、相机、渲染器

创建场景(scene)

// scene
// 创建一个scene
scene = new THREE.Scene()
// 添加颜色
scene.background = new THREE.Color(0x88ccee)
// scene.fog = new THREE.Fog(0x88ccee, 0, 50)
scene.add(new THREE.GridHelper(10))

添加相机(camera)

// camera
// camera用来观看场景里的内容, Three.js提供多种相机,比较常用的是PerspectiveCamera(透视摄像机)以及OrthographicCamera (正交投影摄像机)。
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(0, 0, 0)
camera.rotation.order = 'YXZ'

渲染器(renderer)

// renderer
container = document.getElementById('container');
// 创建一个WebGLRenderer
renderer = new THREE.WebGLRenderer({ antialias: true })  // antialias:true 开启抗锯齿
// 设置设备像素比。通常用于HiDPI设备防止模糊输出canvas
renderer.setPixelRatio(window.devicePixelRatio)
// 设置渲染的宽高 
renderer.setSize(window.innerWidth, window.innerHeight)
// 默认为 false. 如果设置了该参数,则启用在场景中的阴影贴图
renderer.shadowMap.enable = true
// 阴影贴图类型定义
renderer.shadowMap.type = THREE.BasicShadowMap;
renderer.outputEncoding = THREE.sRGBEncoding;
renderer.toneMapping = THREE.ACESFilmicToneMapping;
container.appendChild(renderer.domElement);

基本要素

灯光(light)

// 半球形光源(HemisphereLight)
HemisphereLight( skyColor : Integer, groundColor : Integer, intensity : Float )
  • skyColor - (可选参数) 天空中发出光线的颜色。 缺省值 0xffffff。
  • groundColor - (可选参数) 地面发出光线的颜色。 缺省值 0xffffff。
  • intensity - (可选参数) 光照强度。 缺省值 1。

创建一个半球光。

// White directional light at half intensity shining from the top.
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
scene.add( directionalLight );
DirectionalLight( color : Integer, intensity : Float )
  • color - (可选参数) 16进制表示光的颜色。 缺省值为 0xffffff (白色)。
  • intensity - (可选参数) 光照的强度。缺省值为1。

创建一个新的 DirectionalLight。

// light
// 半球形光源(HemisphereLight)
// 光源直接放置于场景之上,光照颜色从天空光线颜色颜色渐变到地面光线颜色。
// 半球光不能投射阴影。
const fillLight1 = new THREE.HemisphereLight(0x4488bb, 0x002244, 0.5);
fillLight1.position.set(2, 1, 1);
scene.add(fillLight1);

// 平行光(DirectionalLight)
// 平行光是沿着特定方向发射的光。
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
directionalLight.position.set(- 5, 25, - 1);
// 如果设置为 true 该平行光会产生动态阴影
directionalLight.castShadow = true;
scene.add(directionalLight);

动画

需要重复调用。

const animate = () => {
  renderer.render(scene, camera)
  requestAnimationFrame(animate)
}

加载模型

如果想要加载外部3D模型,那么就需要用到加载器(loader),而 Three.js 提供的加载器有好多种类型,分别可以加载不同的文件格式。具体可以查看 Three.js 源码里面的 examples/jsm/loaders 文件夹下的各种加载器。

loaders

这里用到的是 GLTFLoader

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'

有了加载器后,就需要一个3D模型素材,可以在网上下载一个。

const loader = new GLTFLoader()
loader.load('./src/pages/building/building102.gltf', gltf => {
  scene.add(gltf.scene)
})

加入控制(WASD)

监听键盘按键

document.addEventListener('keydown', e => {
  keyStates[e.code] = true
})
document.addEventListener('keyup', e => {
  keyStates[e.code] = false
})
if (keyStates['KeyW']) {
  // 摁下W,改变水平方向的向量, multiplyScalar 乘积
  player.velocity.add(getForwardVector().multiplyScalar(speedDelta));
}

if (keyStates['KeyS']) {
  player.velocity.add(getForwardVector().multiplyScalar(- speedDelta));
}

if (keyStates['KeyA']) {
  player.velocity.add(getSideVector().multiplyScalar(- speedDelta));
}

if (keyStates['KeyD']) {
  player.velocity.add(getSideVector().multiplyScalar(speedDelta));
}

监听鼠标

document.addEventListener('mousedown', e => {
  document.body.requestPointerLock()
})
document.addEventListener('mousemove', e => {
  // 当鼠标在锁定状态时
  if (document.pointerLockElement === document.body) {
    camera.rotation.y -= e.movementX / 500
    camera.rotation.x -= e.movementY / 500
  }
})

3d

到此,一个简单的3D模型就出来了,作为上手项目,这个很简单,继续在学习中。

完整代码可以参考 代码

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

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

相关文章

代码随想录【Day29】|491. 递增子序列、46. 全排列、47. 全排列 II

491. 递增子序列 题目链接 题目描述&#xff1a; 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: …

教务选课排课系统

技术&#xff1a;Java、JSP等摘要&#xff1a;Internet网是目前全球最大的计算机通信网&#xff0c;它遍及全球几乎所有的国家和地区。www系统是一个大型的分布式超媒体信息数据库&#xff0c;它极大的推动了Internet的发展&#xff0c;己经成为Internet中最流行、最主要的信息…

防抖节流函数

防抖和节流对于每一个开发者来说&#xff0c;都不陌生。防抖和节流的概念其实最早并不是出现在软件工程中&#xff0c;防抖是出现在电子元件中&#xff0c;节流出现在流体流动中。 而JavaScript是事件驱动的&#xff0c;大量的操作会触发事件&#xff0c;加入到事件队列中处理…

骨传导耳机发声原理是什么,如何选购骨传导耳机

骨传导耳机很早以前就已经有了&#xff0c;但真正流行到运动圈里也还是最近两年的时间&#xff0c;所以导致很多人对骨传导耳机还不是很了解&#xff0c;不明白其工作原理是什么&#xff0c;在购买骨传导耳机时也总是会感到纠结&#xff0c;不知如何下手&#xff0c;作为一个多…

香港双重牌照、准入安排和禁止事项等重要制度已明确 20多万字的《虚拟资产咨询文件》以证雄心

前不久&#xff0c;香港证监会就加密货币交易发布的《有关适用于获证券及期货事务监察委员会发牌的虚拟资产交易平台营运者的建议监管规定的咨询文件》&#xff08;以下简称《咨询文件》&#xff09;&#xff0c;并如期就有关监管虚拟资产交易平台的建议展开咨询&#xff0c;以…

制造业数据质量提升的方法和实践

制造业的数据治理尚处于早期阶段&#xff0c;而数据质量管理是所有数据类项目重点关注的领域。数据治理以数据标准、数据质量和元数据的管理为根本&#xff0c;是企业实现数据资产价值创造的基础。上周&#xff0c;在由武汉市经济和信息化局主办的“万企育才工程”之《制造业数…

随机森林在sklearn中的实现

目录 一.集成算法 二.sklearn中的集成算法模块ensemble 三.RandomForestClassifier(随机森林分类器) 四.重要参数 1.基评估器参数 2.随机森林参数 五.重要属性和接口 六.Bagging的另一个必要条件 七.RandomForestRegressor(随机森林回归器) 八.机器学习中调参的基本思…

2023 年 6 大智能合约语言

如果你想成为一名 Web3 开发人员&#xff0c;你需要知道如何编写智能合约&#xff0c;智能合约是所有 Web3 应用程序的支柱。 简而言之&#xff0c;智能合约是在区块链网络上部署和执行的计算机程序&#xff0c;提供确定性保证&#xff0c;使多方能够达成一致的、防篡改的结果…

CSDN时隔一年,我又回来了还愿

CSDN时隔一年&#xff0c;我又回来了还愿 去年的今天我申请到了Jetbrains学生试用,前两天刚买了JetBrains。 特别感谢Jetbrains和Jetbrains的客服小姐姐。 情况说明&#xff1a; 由于本人读非全日制大学&#xff0c;每周也同全日制一样上五天学放二两天。首先非全日制已经不符…

vue - vue是mvvm模型吗?

先说明一下什么是标准的mvvm模型&#xff1a; M: Model&#xff1b;既是数据&#xff0c;主要负责业务数据相关&#xff1b;V: View&#xff1b;即是视图&#xff0c;展示给用户看的页面&#xff0c;细分下来就是htmlcss层&#xff1b;VM: ViewModel&#xff1b;是连接界面View…

ZOJ-搜索专题

1002 题意 思路 深搜&#xff0c;每个格子都搜一遍。技巧dfs(cnt,ans)dfs(第几个格子&#xff0c;答案)&#xff1b; 代码 #include <iostream>using namespace std;int n,i,j,ans; char s[5][5];int c_put(int n,int m) {for (i n-1;i > 0;i --) {if (s[i][m] …

怎么解决SPA首屏加载速度慢?

首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是用户体验…

LeetCode第2577题-在网格图中访问一个格子的最少时间-python实现-图解思路与手撕代码

LeetCode第2577题-在网格图中访问一个格子的最少时间-python实现-图解思路与手撕代码 文章目录一、题目描述二、解题思路与代码实现1.解题思路2.代码实现总结一、题目描述 二、解题思路与代码实现 1.解题思路 这道题求最短距离&#xff0c;首先检查起始点0,0的右边0,1和下边1…

Linux配置mysql主从复制

Linux配置mysql主从复制 systemctl restart mysqld 重启mysql服务 Mysql主从复制 在linux里面部署mysql 主库Master 192.168.162.138 contos 7 从库Slave 192.168.162.137 contos 7测试 log-binmysql-bin町[必须]启用二进制日志 第三步:登录Mysql数据库&#xff0c;执…

oracle 19c 创建物化视图并测试logminer进行日志挖掘

1、创建物化视图 alter session set containerpdb; grant create materialized view to scott; create materialized view 物化视图名 -- 1. 创建物化视图 build [immediate | deferred] -- 2. 创建方式&#xff0c;默认 immediate refre…

LeetCode-2373. 矩阵中的局部最大值【矩阵,数组】

LeetCode-2373. 矩阵中的局部最大值【矩阵&#xff0c;数组】题目描述&#xff1a;解题思路一&#xff1a;原地修改。首先将每个3*3的矩阵的最大值存放在左上角的点&#xff0c;然后修改给的grid矩阵的大小。解题思路二&#xff1a;暴力&#xff0c;申请一个数组解题思路三&…

想学Java开发,有什么方式可以选择?

想学习软件开发Java高级编程语言的小伙伴看过来&#xff0c;这里有多年Java职业教育经验总结以及学习技巧分享&#xff0c;不容错过的精彩内容&#xff01; 一年之计在于春&#xff0c;阳春三月是学习的好时光。万物复苏&#xff0c;一切都可以重新开始&#xff0c;如果你也在考…

一些开源的,好看的前端组件/样式库

以下是一些受欢迎的开源 CSS 样式库&#xff1a;Bootstrap&#xff1a;https://getbootstrap.com/Materialize CSS&#xff1a;https://materializecss.com/Bulma&#xff1a;https://bulma.io/Foundation&#xff1a;https://foundation.zurb.com/Semantic UI&#xff1a;http…

智慧燃气管理系统

在数字经济时代&#xff0c;迫切需要通过数字化建设智能天然气&#xff0c;提高天然气的基本安全水平&#xff0c;提高企业的智能管理水平。这是人们可以看到、触摸和使用的智能应用&#xff0c;也是为智能城市奠定良好基础的必修课。智能燃气是以GIS为基础&#xff0c;采用物联…

商简智能计划与排程SPS在纺织行业中的应用

企业背景 某织造、染色及后整理一体化工艺的纺织面料企业&#xff0c;主要从事户外功能运动服装、内衣、泳衣、汽车内饰等面料的研发和销售&#xff0c;年产值在20亿左右&#xff0c;是迪卡侬运动面料最优质供应商之一。 纺织行业特点 印染具有典型的流程行业特性&#xff0c…