Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

这篇具有很好参考价值的文章主要介绍了Three.js--》前端开发者掌握3d技术不再是梦,初识threejs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        这十年来 web 得到了快速的发展,随着 webgl 的普及,网页的表现能力越来越强大,网页上已经开始可以做出很多复杂的动画和精美的效果,还可以通过 webgl 在网页中绘制高性能的3d图形,别的不说,凡是入门程序员都离不开github这个网站,细心的人都会发现,github首页就使用了3d可视化技术,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

对于网站而言,web 3d 技术应用,实现了企业网站的三维呈现,让企业形象更加直观更立体的展现给客户,打破传统平面展示模式,而传统的3d技术shader直接让前端开发者去挑战的话其实是有难度的,因为其和前端真的就是两种不一样的东西,由此适配前端开发者使用3d技术的three.js应运而生,让前端开发者掌握3d技术不再是梦,接下来本专栏将详细介绍three.js的详细使用,以及相关项目的展现,关注博主订阅专栏,让学习之路不再迷茫。

目录

初识Three.js

Three.js的下载与使用

空间实现3d立方体旋转

空间实现3d立方体移动

空间实现3d立方体缩放与旋转

空间实现3d立方体地面以及阴影效果


初识Three.js

Three.js是浏览器调用电脑渲染模块的webgl框架,但threejs并不是webgl,webgl本身也有自己非常底层的代码,这方面就涉及一些3d逻辑了,感兴趣的朋友可以自己去了解一下,本专栏将着重讲解threejs,讲解threejs执行的一些webgl的一些功能。

注意:会three.js并不意味着你已经非常掌握了3d建模了,这是两个概念,建模需要的是专业的建模软件如:3dmax、rhino、maya、blender等,复杂的项目需要专门的建模师搭建模型,然后交给前端来呈现在网页上,并不是前端来实现建模,而three.js就是建模师和前端沟通的桥梁,当然threejs也能实现一些简单的3d效果,但是非常复杂的3d建模还是需要专门的建模师来完成。

Three.js版本问题:Three.js处于飞速发展之中,过去几年和现在的Three.js基本上每个月都会发布一个新的版本,主要是增加一些新的功能,也可能废弃或更改某些API,去three.js官网下载的three.js默认都是最新版本的,在实际开发过程中,three.js中的API的使用规则,一切以你项目中的three.js版本对应的文档为准。

Three.js的下载与使用

关注我的人都知道,在很早的之前我就说过,博主不可能会将所有的知识讲解全都面面俱到,我个人仅仅是对知识的一个抛砖引玉而言,算是一个引路人,要想了解更加具体的知识,还是推荐大家详细看看 three.js官方文档 的讲解。如果你想查看three.js的所有版本文档 推荐网址 ,里面详细介绍了每个版本新添加的功能以及相关的使用方法,下载的话滑到当前版本的最下面,点击下面的zip进行解压缩下载即可:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

在项目中引入three.js的话,比如说你采用的是Vue+threejs或React+threejs技术栈,这很简单啊threejs就是一个js库,直接通过npm命令行安装就行, 注意:使用哪个版本的threejs,查文档就查对应的版本。安装方式可参考官方文档,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

如果你是正式项目的话一定是选择npm安装而不是使用CDN,官方虽然推荐我们使用webpack,但是我个人还是选择使用vite来使用,因为其打包的速度更快效率高一点,不过这个还是看个人选择,接下来我将使用vite来创建react项目,不知道如何使用vite来创建项目的可以参考我之间写的文章:超详细教程——vite脚手架的搭建与使用 。

入门three.js的第一步就是认识场景Scene、相机Camera、渲染器Renderer三个基本概念

三维场景Scene:理解为虚拟的3D场景,用来表示模拟生活中的真实三维场景或三维世界

透视相机Camera:模拟人眼所看到的景象,是3D场景的渲染中使用得最普遍的投影模式。

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

渲染器Renderer:用WebGL渲染出精心制作的场景。

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

空间实现3d立方体旋转

接下来实现个小Demo,我使用的是React+Vite,代码如下:

import * as THREE from 'three';

// 1.创建场景
const scene = new THREE.Scene();
// 2.创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
// 设置x、y、z轴坐标,即设置相机位置
camera.position.set(0,0,10)
// 将相机添加到场景之中
scene.add(camera)
// 3.添加物体,创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1) // 设置几何体大小
const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00}) // 设置几何体材质
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
// 将几何体添加到场景之中
scene.add(cube)
// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight)
// 将webgl渲染的canvas内容添加到body上
document.body.appendChild(renderer.domElement)
// 使用渲染器,通过相机将场景渲染出来
export const result = renderer.render(scene,camera)
import { result } from "./three/three1"
import './App.css'

const App = () => {
  return (
    <div className="container">
      {result}
    </div>
  )
}
export default App

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

因为React的渲染机制,不建议将three.js代码直接写在函数式组件中,而是要单独封装在一个js文件中,通过按需导入导出即可,结果如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

接下来我们需要导入 轨道控制器,目的是通过控制器查看3d物体。就相当于拿着我们定义好的相机,围绕着我们定义的物体360度旋转的去观看,如下:

import * as THREE from 'three';

// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 1.创建场景
const scene = new THREE.Scene();
// 2.创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
// 设置x、y、z轴坐标,即设置相机位置
camera.position.set(0,0,10)
// 将相机添加到场景之中
scene.add(camera)
// 3.添加物体,创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1) // 设置几何体大小
const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00}) // 设置几何体材质
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
// 将几何体添加到场景之中
scene.add(cube)
// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight)
// 将webgl渲染的canvas内容添加到body上
document.body.appendChild(renderer.domElement)
// // 使用渲染器,通过相机将场景渲染出来
// export const result = renderer.render(scene,camera)

// 创建轨道控制器
new OrbitControls(camera,renderer.domElement)
export function render(){
  renderer.render(scene,camera)
  // 接下来渲染下一帧的时候就会调用render函数
  requestAnimationFrame(render)
}
// 先开始就渲染一下
render()

在App中调用我们导出的这个render函数,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

接下来可以给这个立方体添加坐标轴辅助线,让其可以更具体的展示给我们,设置辅助线的话可以参考一下官网给我们提供的函数:AxesHelper

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

空间实现3d立方体移动

承接上文立方体的样式,接下来实现3d立方体的移动,实现移动的话可以使用position的set方法,来改变空间物体的向量值,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

当然我们也可以在每次渲染其函数的地方,设置一下每次渲染加一点位置,超过一定距离从零开始,这样也能实现一下立方体移动的效果,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

空间实现3d立方体缩放与旋转

实现物体的缩放与旋转可以通过操作,然后 .set 进行设置数值,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

空间实现3d立方体地面以及阴影效果

实现生成平面几何的类的方法如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

给出代码如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

首先我们先设置光源,然后设置阴影效果并将其加到场景当中,如下:

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

Three.js--》前端开发者掌握3d技术不再是梦,初识threejs

本篇文章算是three.js的启蒙篇,对于基础不是很好的人可能看的比较吃力,后面我尽量每个案例都写的详细一点,希望大家都能看懂学会,每次写完后,我都会将文章写的three.js代码都共享出来,欢迎大家学习!如果大家觉得不错的话,可以给博主一键三联,您的支持就是博主创作的最大动力。文章来源地址https://www.toymoban.com/news/detail-427163.html

import * as THREE from 'three';

// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 1.创建场景
const scene = new THREE.Scene();
// 2.创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
// 设置x、y、z轴坐标,即设置相机位置
camera.position.set(0,0,10)
// 将相机添加到场景之中
scene.add(camera)
// 3.添加物体,创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1) // 设置几何体大小
const cubeMaterial = new THREE.MeshLambertMaterial({color:0xff0000}) // 设置几何体材质
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)

// 修改物体的位置
// cube.position.set(5,0,0)
cube.position.y = 1.5
// 实现物体的缩放
cube.scale.set(3,2,1) // x、y、z轴的缩放倍数
// Math.PI是180度,rotation也是以x、y、z进行设置
cube.rotation.set(Math.PI / 4,0,0,"XYZ")
cube.castShadow = true

// 将几何体添加到场景之中
scene.add(cube)
// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight)
// 渲染阴影
renderer.shadowMap.enabled = true
// 将webgl渲染的canvas内容添加到body上
document.body.appendChild(renderer.domElement)
// // 使用渲染器,通过相机将场景渲染出来
// export const result = renderer.render(scene,camera)

// 创建地面网格参照
const planeGeometry = new THREE.PlaneGeometry(30,30) // 平面几何的宽高
const PlaneMateial = new THREE.MeshLambertMaterial({color:0xF8F8FF}) // 几何平面的颜色
const plane = new THREE.Mesh(planeGeometry,PlaneMateial)
plane.rotation.x = -0.5*Math.PI
plane.position.set(0,0,0)
plane.receiveShadow = true
scene.add(plane)
// 设置光源投影
const ambienLight = new THREE.AmbientLight(0xAAAAA)
scene.add(ambienLight)

// 设置光源
const spotLight = new THREE.SpotLight(0xFFFFFF) // 设置聚光灯
spotLight.position.set(-60,40,-65)
spotLight.castShadow = true //让聚光灯产生阴影
// 下面三行代码设置阴影效果
spotLight.shadow.mapSize = new THREE.Vector2(1024,1024)
spotLight.shadow.camera.far = 130
spotLight.shadow.camera.near = 40
// 将阴影添加到场景中
scene.add(spotLight)


// 创建轨道控制器
new OrbitControls(camera,renderer.domElement)

// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5) // 数值代表线的长度
scene.add(axesHelper) // 添加到场景之中

export function render(){
  cube.position.x +=0.01
  cube.rotation.x +=0.01
  if(cube.position.x>5){
    cube.position.x = 0
  }
  renderer.render(scene,camera)
  // 接下来渲染下一帧的时候就会调用render函数
  requestAnimationFrame(render)
}
// 先开始就渲染一下
render()

到了这里,关于Three.js--》前端开发者掌握3d技术不再是梦,初识threejs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 除了three.js,还有许多其他前端开发语言和库可以用于创建3D可视化大屏

    hello老铁们...本人熟悉html5,vue对bootsrap,uniapp,layui,element,vite,antd,echarts,jq响应式尤其擅长,ui设计等技能,如果ui前端工作中有遇到烦恼可私信关注评论我们共同交流进步!谢谢       随着前端技术的飞速发展,3D可视化已经成为许多应用场景中不可或缺的一部分。在

    2024年03月15日
    浏览(52)
  • Java开发者的Python快速进修指南:掌握T检验

    T检验是一种用于比较两个独立样本均值差异的统计方法。它通过计算T值和P值来判断样本之间是否存在显著性差异。通常情况下,我们会有两组数据,例如一组实验组和一组对照组。 T检验的原假设是两组样本的均值相等,备假设是两组样本的均值不相等。T检验会计算一个

    2024年03月09日
    浏览(60)
  • 掌握 JavaScript:从初学者到高级开发者的完整指南(三)

    BOM的全称是Browser Object Model,翻译过来是浏览器对象模型。也就是JavaScript将浏览器的各个组成部分封装成了对象。我们要操作浏览器的部分功能,可以通过操作BOM对象的相关属性或者函数来完成。例如:我们想要将浏览器的地址改为 http://www.baidu.com ,我们就可以通过BOM中提供的

    2024年02月06日
    浏览(52)
  • 掌握 JavaScript:从初学者到高级开发者的完整指南(一)

    html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以我们需要学习JavaScript,这门语言会让我们的页面能够和用户进行交互。 同样,js代码也是书写在html中的,那么html中如何引入js代码呢?主要通过下面的2种引入方式: 第一种方式 :内部脚本,将

    2024年02月07日
    浏览(52)
  • .net开发者应掌握的利器CommunityToolkit.HighPerformance——MemoryOwner与SpanOwner

    MemoryOwner和SpanOwner都可以理解为是对ArrayPool的一个包装,无非一个是在堆栈上,一个是在托管堆上。既然做了包装,那肯定随之而来就是改进和优化。 目录 MemoryOwner MemoryOwner解决的问题 SpanOwner 总结 MemoryOwner MemoryOwner解决的问题 1.通过ArrayPool的Api MemoryPool .Shared.Rent(size) 获得的

    2024年02月07日
    浏览(42)
  • 如何成为一名高效的前端开发者(10X开发者)

    如今,每个人都想成为我们所说的“10倍开发者”。然而,这个术语经常被误解和高估。 本质上,一个高效或者10倍开发者,在我看来,是指那些能够充分利用所有可用工具的人,通过让这些工具处理冗余和重复的任务,使他们能够专注于复杂和创造性的工作。以下是一些成

    2024年02月05日
    浏览(64)
  • 掌握 JavaScript:从初学者到高级开发者的完整指南之JavaScript对象(二)

    可以大体分页3大类: 第一类:基本对象,我们主要学习Array和JSON和String 第二类:BOM对象,主要是和浏览器相关的几个对象 第三类:DOM对象,JavaScript中将html的每一个标签都封装成一个对象 1.1.1 基本对象 1.1.1.1 Array对象 语法格式 Array对象时用来定义数组的。常用语法格式有如下

    2024年02月07日
    浏览(52)
  • 推荐前端开发者提升效率的工具

    是否掌握新的技术很大程度决定着你是否被淘汰。 虽然应用程序试图将网站替代,但前端 Web 开发业务仍在快速变化和增长,前端开发人员的功能并没有消失。以下介绍一款前端开发者提升效率的工具。 目录 一、低代码工具前景 二、如何理解低代码工具 三、前端低代码工具

    2024年02月14日
    浏览(48)
  • 短视频矩阵营销系统技术开发者开发笔记分享

    1. 确定系统需求:根据客户的需求,确定系统的功能和特点,例如用户注册登录、视频上传、视频浏览、评论点赞等。 2. 设计系统架构:根据系统需求,设计系统的整体架构,包括前端、后端、数据库等组件的功能和交互方式。 3. 选择技术栈:根据系统的特点和需求,选择

    2024年02月14日
    浏览(47)
  • 低代码前端开发者必备:异常监控日志系统

    某客户:“你们的系统怎么又报错了?给你们一天时间修好,等着用!” 沟通中:询问客户具体问题,他表示某某功能用不了,某某功能也用不了,而且无法复现。 - 你会怎么处理? 答案1:先看看说明书? 答案2:好的,我们马上安排研发团队查找问题,顺便也请您帮忙看

    2024年04月13日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包