Threejs 三维开发系列之Threejs基础概念

这篇具有很好参考价值的文章主要介绍了Threejs 三维开发系列之Threejs基础概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Threejs 三维开发系列之Threejs基础概念,前端开发,Threejs,三维开发

  • Threejs简介
  • (是什么)Threejs是一个web端的3D图形引擎,能利用js创建和控制各种三维模型和场景
  • (能用来做什么)可以用js开发各种复杂的三维场景、空间模型动画展示、各种三维小游戏(比如微信跳一跳就是Threejs开发)。
  • (优势) 传统三维开发一般是c++ openGl,开发成本大效率低,threejs封装了大量底层图形计算,在js应用层能以很高的效率完成各种三维产品开发。
  • (劣势) 学习曲线比较陡峭,需要掌握一定图形和数学知识,大模型3D场景对设备性能有一定的要求,小型场景问题不大。

基础坐标系概念

  • 不同于常规前端开发只有xy两个坐标系,threejs多了一个z坐标轴,因此开发场景从二维的平面转换为了三维的立体空间,z轴是往屏幕外面朝向
  • Threejs坐标系采用的是右手坐标系

Threejs 三维开发系列之Threejs基础概念,前端开发,Threejs,三维开发

Threejs安装

  • npm模式安装:npm install three
// 方式 1: 导入整个 three.js核心库
import * as THREE from 'three';

const scene = new THREE.Scene();


// 方式 2: 仅导入你所需要的部分
import { Scene } from 'three';

const scene = new Scene();
  • cdn模式安装,由于 three.js 依赖于ES module,因此任何引用它的script标签必须使用type="module"。如下所示:
<script type="importmap">
	{
	"imports": {
		"three": "https://unpkg.com/three@<version>/build/three.module.js"
	}
	}
</script>

<script type="module">

	import * as THREE from 'three';

	const scene = new THREE.Scene();

</script>

基础结构搭建

  • html 中 引入canvas组件
<canvas class="webgl"></canvas>

<style>
.webgl {
  position: fixed;
  top: 0;
  left: 0;
  outline: none;
}
</style>

渲染器 WebGLRenderer

  • 渲染器是用来将Threejs的各种三维元素,通过canvas展示出来的一种渲染引擎。
  • 设置好渲染器各种参数后,通过调用render方法来进行界面渲染
//先定义渲染器尺寸,下面是浏览器全屏
const size = {
  width: window.innerWidth,
  height: window.innerHeight,
}

//获取canvas Dom元素
const canvas = document.querySelector('canvas.webgl')
//将dom引入传入渲染器,用来创建渲染器
const renderer = new THREE.WebGLRenderer({ canvas })
//设置渲染器尺寸
renderer.setSize(size.width, size.height)
//设置渲染器像素比 避免有些高分辨率的设备把屏幕弄得太模糊,设置像素比最大2X
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))

场景 Scene

  • 场景就是整个三维空间所有虚拟元素容器,有点类似于前端的虚拟Dom
  • 主要常用的方法是 add(),用来给场景添加各种元素
  • 真正让场景生效的是渲染器的render方法会传入场景参数
//创建场景
const scene = new THREE.Scene()

网格对象 Mesh

  • Mesh是一种三维网格对象,也就是放在三维空间种的实物,Mesh由2种东西合成:
    1. Geometry 几何体,用来定义是三维物体的形状大小和网格分段密度,比如BoxGeometry是长方体,可以传入长宽高参数。
    2. Material 附着在几何体上的材质,用来定义颜色、透明度等等
  • 可以通过 mesh.position.set(0,0,0) 用来调整网格对象中心点的坐标
  • 最后把网格对象加入场景中 scene.add(mesh)
//创建mesh模型(由几何体+材质)  正方体
//长宽高为1的立方体 长宽高的线条分段是5条,用来调整网格密度
const geometry = new THREE.BoxGeometry(1, 1, 1, 5, 5, 5)   
const material = new THREE.MeshBasicMaterial({
  color: 0x03c03c, // 材质的颜色
  transparent:true,// 开启透明
  opacity:0.5,// 设置透明度
  wireframe: true, //显示网格虚线
})
const mesh = new THREE.Mesh(geometry, material)
mesh.position.set(0,0,0)
scene.add(mesh)

相机 Camera

  • 横看成岭侧成峰,不同于二维平面,在三维世界中从不角度看同一样东西,会有完全不同的呈现,所以在Threejs中引入Camera的概念,也就是不同的观察视角
  • PerspectiveCamera(fov, aspect, near, far) 相机有四个参数
    • fov 视线观察角度 比如45就是以45度角来观察
    • aspect 渲染器的宽高比
    • near 从多近的距离才开始渲染,就是相机能看到的最近的距离
    • far 最多渲染多远的距离,就是相机能看到的最远的距离

如图所示

Threejs 三维开发系列之Threejs基础概念,前端开发,Threejs,三维开发

//初始化相机 透视相机 
//这里是以45度观察 不设最远最近距离
const camera = new THREE.PerspectiveCamera(45, size.width/size.height)
//相机的位置放在在 x=3 y=3 z=3的位置
camera.position.set(3, 3, 3)
//然后相机看向 x=0 y=0 z=0的位置
camera.lookAt(0, 0, 0)
//场景添加相机
scene.add(camera) 

渲染

已经完成所有场景布置了, 可以调用渲染器的render渲染方法,需要传入参数场景Scene和相机camera

renderer.render(scene, camera)

这个时候就可以看到一个网格立方体了

Threejs 三维开发系列之Threejs基础概念,前端开发,Threejs,三维开发

辅助观察坐标系

但是这种太模糊,没有位置概念,可以引入辅助坐标系,以方便更好观察

💡 Tips:以下代码需要在render渲染调用之前加,render执行过后渲染就完毕了

//添加坐标轴 辅助查看 
const axesHelper = new THREE.AxesHelper(150)
scene.add(axesHelper)

可以看到多了三个线,其中红色的是x轴、绿色是 y轴、蓝色的是z轴,xyz交汇处就是0,0,0原点

Threejs 三维开发系列之Threejs基础概念,前端开发,Threejs,三维开发

动态渲染

目前我们上面看到的渲染是静态渲染,只渲染了一次,可以利用requestAnimationFrame浏览器自带的刷新器,动态的去改变网格对象的参数,达到视线动态渲染旋转的效果

在最后面加上如下代码

// 动态渲染
const tick = () => {
  renderer.render(scene, camera)
  mesh && (mesh.rotation.x += 0.02)     //以x轴旋转
  // mesh && (mesh.rotation.y += 0.02)     //以y轴旋转
  // mesh && (mesh.rotation.z += 0.02)     //以z轴旋转
  window.requestAnimationFrame(tick)
}
tick()

就能看到立方体开始旋转了

调整观察视角

目前相机观察视角是固定的,利用OrbitControls可以利用鼠标或者手势拖拽调整相机的观察视角

//在代码最前面import 轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

//在渲染前创建轨道控制器 用来用鼠标控制相机
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true

// 动态渲染 更新控制器update
const tick = () => {
  renderer.render(scene, camera)
  mesh && (mesh.rotation.x += 0.02)     //以x轴旋转
  // mesh && (mesh.rotation.y += 0.02)     //以y轴旋转
  // mesh && (mesh.rotation.z += 0.02)     //以z轴旋转
  controls.update()  // 更新控制器
  window.requestAnimationFrame(tick)
}
tick()

附 gitte源码: ThreeJsDemo: ThreeJs Demo文章来源地址https://www.toymoban.com/news/detail-718551.html

到了这里,关于Threejs 三维开发系列之Threejs基础概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Threejs进阶之一:基于vite+vue3+threejs构建三维场景

    前面的章节我们都是通过HTML+JS的方式创建三维场景,从这一章节开始,我们后面将使用vite+vue3+threejs来构建三维场景。 打开vscode的终端管理器,输入如下命令 在弹出的选择框架提醒中,按上下键盘键,选择Vue,然后回车 选择JavaScript,回车 提示项目创建完成, 输入cd vue3-t

    2024年02月12日
    浏览(34)
  • threejs点击获取三维坐标(Three.js获取鼠标点击的三维坐标)

    绑定点击事件,通过 THREE.Raycaster 光线投射,用于确定鼠标点击位置上有哪些物体, raycaster.intersectObjects(scene.children) 返回点击位置上所有的物体的数组;我们用 var selected = intersects[0] 取第一个,也就是最前面的那个物体;在通过 selected.point 取点坐标

    2024年02月11日
    浏览(81)
  • Threejs进阶之十一:使用FontLoader和TextGeometry创建三维文字

    在Threejs中我们可以通过FontLoader和TextGeometry结合使用来创建三维文字,FontLoader用于加载JSON格式的字体,FontLoader返回值是表示字体的Shape类型的数组;TextGeometry用于将文本生成为单一的几何体。下面我们先来了解下这两个类 用于加载JSON格式的字体的类。返回font, 返回值是表示

    2024年02月06日
    浏览(32)
  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十一章 基础界面开发 (组件封装和使用)

    Vue 是前端开发中非常常见的一种框架,它的易用性和灵活性使得它成为了很多开发者的首选。而在 Vue2 版本中,组件的开发也变得非常简单,但随着 Vue3 版本的发布,组件开发有了更多的特性和优化,为我们的业务开发带来了更多便利。本文将介绍如何使用 Vue3 开发业务组件

    2024年02月19日
    浏览(49)
  • ADC学习系列(一):ADC基础概念

            本章主要是进行ADC的基础概念学习,从模拟和数字信号进行入手,分析各自的优缺点和应用场合,从而引出数模转换的重要性。紧接着提到了ADC部分最重要的奈奎斯特采样定理,了解采样频率和被测信号频率之间的关系。最后介绍了ADC的采样保持放大电路,作为ADC部

    2024年02月03日
    浏览(24)
  • 【云原生|云计算系列】云计算基础概念

    欢迎来到云原生专题的云计算系列第一篇博客,我们将探索云计算的基础知识,以帮助您深入了解这个迅速发展的领域。在前一篇博客中,我们介绍了云原生的概念和重要性,强调了它作为云计算的核心理念和实践的关键角色。本篇博客将进一步扩展我们的视野,探讨云计算

    2024年02月13日
    浏览(36)
  • YOLOv5目标检测学习(1):yolo系列算法的基础概念

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关于深度学习目标检测,有许多概念性的东西需要先了解一下。这里主要以基于深度学习的目标检测算法的部署实现来学习。 以yolov5为例: 使用YOLOv5进行车辆和行人的目标检测通常涉及以下步骤: 数据

    2024年04月09日
    浏览(46)
  • 零基础学前端(二)用简单案例去理解 HTML 、CSS 、JavaScript 概念

    该篇适用于从零基础学习前端的小白 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 HTML,CSS,JavaScript 都是单独的语言;他们构成前端技术基础; (1)HTML:负责网页的架构; (2)CSS:负责网页的样式,美化; (3)JavaScript(JS):负责

    2024年02月08日
    浏览(39)
  • 后端开发基础概念

    目前处于项目上手阶段,在学习项目过程中,有一些一知半解或者不明白含义的专业名词或者缩写,在此汇总。里面的内容很多都是基于个人理解,水平有限如果有出错的地方还请各位大佬批评指正。 2023年8月31日00:34:22,已经比较晚了,后续的内容之后再补充吧,一口吃不了

    2024年02月10日
    浏览(31)
  • threejs贴图系列(一)canvas贴图

    threejs不仅支持各种texture的导入生成贴图,还可以利用canvas绘制图片作为贴图。这就用到了CanvasTexture,它接受一个canas对象。只要我们绘制好canvas,就可以作为贴图了。这里我们利用一张图片来实现这个效果。 基础代码: 最后的展示效果如下:  这里特别要注意贴图异步问题

    2024年02月11日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包