白天过节,晚上了解了下 Threejs3D

简介: 白天过节,晚上了解了下 Threejs3D

I. 介绍Three.js 3D

A. 什么是Three.js

Three.js是一款基于WebGLJavaScript 3D库,它提供了各种功能和工具,使开发者能够创建高质量、互动式的3D图形、动画及应用程序。

Three.js让开发者能够轻松地在现代浏览器中创建复杂的3D场景,且不需要深入学习WebGL底层原理。

Three.js也提供了许多附加功能,例如材质和灯光系统、动画引擎、几何体、骨骼、粒子系统、后期处理、VR和AR支持等。

Three.js用于建立交互式3D应用程序,包括游戏、数据可视化、模拟、虚拟现实和产品展示等领域。由于其易于学习、广泛可用的文档和社区支持,Three.js成为了3D Web开发的首选工具之一。

B. Three.js的历史

Three.js的开发始于2010年,由Mr.doob(创造者Fernando Jiménez Moreno)创建。当时WebGL刚刚出现,现有的工具和库在实现3D图形方面存在许多障碍。Mr.doob决定创建一款易用、高效的3D图形引擎,这就是Three.js的诞生。

最初的版本只有几百行代码,提供了基本的3D图形工具。随着时间的推移,Three.js不断发展,增加了更多的特性,例如材质、物理引擎、动画系统等。Three.js亦成为了许多WebGL库和工具的基础,例如Babylon.js和A-Frame等。同时,它也因其易用的API和活跃的社区得到了广泛的使用,被许多大型项目所采用,例如百度地图、华为云、物理引擎Cannon.js等。

现在,Three.js已经发展成为一个成熟的3D库,其API、性能、功能和文档都已经得到广泛的认可。Three.js的开发团队也在不断努力改进和增加其特性,使它成为一个更加先进、全面的3D库。

C. Three.js的应用领域

Three.js的应用领域非常广泛,它可以用于所有需要在Web浏览器中展现3D图形的场景,包括但不限于:

  1. 游戏开发:Three.js提供了许多游戏开发所需的功能和工具,例如模型导入、材质、骨骼、物理引擎、音频等,游戏开发者可以使用Three.js开发出高品质的3D游戏,例如《Quadropolis》和《Minecraft Earth》等。
  2. 数据可视化:Three.js提供了众多的数据可视化工具,可以帮助开发者在Web上展示各种类别的数据,例如地球的温度、人口等等。一个例子是Three.js中的D3库,让开发者可以将数据可视化制作成3D的热力图、气泡图和柱状图等等。
  3. 建筑和室内设计:Three.js可以帮助建筑和室内设计师创建真实的3D模型,以便更好地展示其设计成果。Three.js的精细建模工具、贴图和材质等,可以让设计师模拟出更真实的房屋、建筑和景观等。
  4. 艺术创作:Three.js提供了大量的3D建模和渲染工具,帮助艺术家将其创意转变为真实的3D艺术品。鲜为人知的,Three.js已经找到了许多应用于经典艺术作品和当代艺术品制作的场景,例如在2020年的《费城婚礼》展览中的场景就使用了Three.js。
  5. VR/AR:Three.js提供了VR/AR的支持,可以在任何通过浏览器访问的平台上,以及大多数智能手机上展示完整的3D场景,从而使其成为创建注重移动性的3D应用程序的首选工具之一。

总之,Three.js凭借着其灵活、易用和可定制的特点,在各种3D应用领域都得到广泛的应用。

II. 开始使用Three.js 3D

A. 安装和引入Three.js

要开始使用Three.js,首先需要下载它的库文件,并将其添加到您的项目中。您可以从官方网站 https://threejs.org/ 下载最新的稳定版,也可以通过CDN等方式获取三个主要的JavaScript文件:

  1. three.min.js:Three.js的核心文件,包括场景、相机、渲染器、灯光、材质等基本组件。
  2. OrbitControls.js:可选择下载的轨道控制器,用于交互式控制场景中的相机,例如通过鼠标拖拽实现视角变化。
  3. GLTFLoader.js:可选择下载的模型加载器,用于将3D模型加载到场景中。

一旦获得了这些文件,就可以将它们引入到您的HTML页面中。最简单的方法是将它们直接添加到您的HTML页面中:

<script src="path/to/three.min.js"></script>
<script src="path/to/OrbitControls.js"></script>
<script src="path/to/GLTFLoader.js"></script>

这样就可以在您的JavaScript代码中创建并操作Three.js场景和对象了。请注意,如果您使用模块化方式组织代码,则可以使用您所使用的模块化包管理器(例如webpack或者parcel)安装和导入Three.js库文件。

现在您已经成功地安装和引入三个主要的Three.js库文件,可以开始使用Three.js创建您的第一个3D场景了!

B. 创建Three.js场景

创建Three.js场景需要三个主要的组件:场景、相机和渲染器。以下是创建一个简单的Three.js场景的步骤:

1. 创建场景对象

const scene = new THREE.Scene();

2. 创建相机对象

const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

这里使用了透视相机,它可以创建一个视锥体,只有在锥体内的物体才能被渲染出来。参数75表示视点垂直方向上的张角,window.innerWidth / window.innerHeight表示长宽比,0.11000分别表示相机能看到的最近和最远的物体距离。

3. 创建渲染器对象

const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

渲染器会创建一个canvas元素,并将其添加到页面中。setSize方法用于设置渲染器的渲染窗口大小。

4. 创建一个几何体

const geometry = new THREE.BoxGeometry(1, 1, 1);

这将创建一个1x1x1的立方体几何体。

5. 创建一个材质

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

这里使用了基本网格材质。颜色0x00ff00表示绿色。

6. 创建一个网格对象

const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

这将把几何体和材质作为参数传递给网格对象,并将其添加到场景中。

7. 渲染场景

function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();

这将循环运行一个函数来动画化场景中的物体。在这个例子中,它将旋转网格体,并通过渲染器对象渲染场景和相机。

完成以上步骤,您已经成功地创建了一个Three.js场景,并将其渲染在浏览器中。当然,这只是一个简单的例子,您可以通过修改参数和添加其他元素来创建更加复杂的3D场景。

C. 添加3D对象到场景

在Three.js中,可以通过创建一个网格对象,将几何体和材质组合在一起,并将其添加到场景中。以下是一个简单的例子,展示如何将3D对象添加到一个场景中:

1. 创建一个几何体

const geometry = new THREE.BoxGeometry(1, 1, 1);

这里使用了立方体几何体,但您可以选择其他的几何体来创建您想要的形状。

2. 创建一个材质

const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

此处使用了基本网格材质,但您可以选择其他类型的材质,例如PhongMaterial或LambertMaterial等。

3. 创建一个网格对象

const cube = new THREE.Mesh(geometry, material);

使用geometrymaterial作为参数来创建一个网格对象。

4. 将网格对象添加到场景中

scene.add(cube);

这将把网格对象添加到场景中,使其能够被渲染。

现在,您已经成功地将一个3D对象添加到了场景中,并将其渲染出来。您可以在构建更加复杂的场景时,重复使用这个基本的过程。需要注意的是,场景中可以添加多个3D对象,这些对象可以结合使用相机和灯光来渲染出来。

D. 控制相机和灯光

在Three.js中,可以使用控制器来控制相机和鼠标/触摸事件,从而使您能够交互式地修改场景。有多种控制器可用,每个控制器都有自己的行为和选项。这里将介绍两种比较常用的控制器,包括如何控制相机和灯光。

1. 轨道控制器

轨道控制器是一种非常常见的控制器,它可以通过与鼠标/触摸事件交互,来控制相机的位置和旋转。以下是创建轨道控制器的示例代码:

const controls = new THREE.OrbitControls(camera, renderer.domElement);

这里使用了OrbitControls控制器,使用camerarenderer.domElement作为参数。通过添加此代码,您就可以使用鼠标和触摸事件来控制相机。

2. 灯光

灯光是渲染场景所需的重要元素,不同类型的灯光会产生不同的效果。以下是创建三种灯光类型的示例代码:

  • 点光源
const light = new THREE.PointLight(0xffffff, 1, 100);
light.position.set(0, 0, 0);
scene.add(light);

点光源会从一个地方射出光线,会照亮其范围内的所有物体。0xffffff是光的颜色,1是光的强度,100是光照的半径。通过position属性设置光源的位置。

  • 平行光源
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(0, 1, 0);
scene.add(light);

平行光源会以一定方向发射光线,与点光源不同之处在于,它不会随着距离衰减。通过DirectionalLight类型来创建平行光源。0xffffff是光的颜色,1是光的强度。通过position属性设置光源的方向。

  • 环境光源
const light = new THREE.AmbientLight(0x404040, 1);
scene.add(light);

环境光源会照亮场景中的所有物体,并使它们变得更加可见。0x404040是光的颜色,1是光的强度。

现在,您已经成功地了解了如何使用轨道控制器来控制相机,以及如何创建三种不同类型的灯光。在创建和调整三维场景时,控制器和灯光都是非常有用的工具。

E. 渲染场景

在Three.js中,渲染器对象是将场景和相机渲染成2D图像的工具。要呈现场景,您需要调用渲染器的render()方法并将场景和相机作为参数传递进去。以下是渲染场景的基本步骤:

1. 创建渲染器对象

const renderer = new THREE.WebGLRenderer();

您可以设置渲染器的大小、分辨率等参数,例如:

renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);

2. 将渲染器添加到HTML页面中

document.body.appendChild(renderer.domElement);

这将在HTML页面中创建一个canvas元素,您可以将其放在任何需要的位置。

3. 调用渲染器的render()方法

function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
}
animate();

这将循环运行一个函数,以便在每一帧中更新和重新绘制场景。在render()方法中,您将场景和相机对象作为参数传递进去。

现在,您已经成功地了解了如何创建渲染器对象,并将其添加到HTML页面中,并将场景渲染成视频帧。当然,这只是一个基础示例,您可以使用该示例来创建更复杂的场景,并使用更高级的材质、光线、纹理等功能来使场景更加逼真。

III. Three.js 3D中的基本概念

Three.js是一个流行的JavaScript库,用于在Web上创建3D图形,并提供了许多有用的基本概念。

A. 坐标系统和变换

Three.js中使用的坐标系统是右手坐标系。

在这里,x轴是向右的,y轴是向上的,z轴是向屏幕外的

Three.js中的任何对象都可以使用平移、旋转和缩放等变换来改变其位置和方向。

B. 材质和纹理

Three.js中的材质定义了一个对象如何与光线交互

材质可以控制对象的颜色、透明度、反射和折射等。

纹理被认为是一种特殊的材质类型,可以将图像或照片映射到对象的表面上。

C. 几何体和网格

几何体是指3D对象的形状,如立方体、球体、圆柱体等,而网格则是由几何体定义的真正的3D对象。

一个网格由许多三角形面组成,每个面由3个顶点组成。

D. 动画和骨架

Three.js允许您在场景中创建有动画效果的对象。骨架是一种特殊的架构,用于将动画应用于对象,它允许您在动画过程中移动不同的部分。Three.js还提供了许多内置的动画控件,可帮助您快速添加和控制动画效果。

IV. Three.js 3D的高级功能

A. 物理引擎

Three.js可以使用物理引擎库来模拟现实世界中的物理行为,例如重力、碰撞、惯性等。其中,比较常用的物理引擎库包括Cannon.js和Physi.js。使用这些库,您可以创建交互性更强的3D模拟场景,比如真实的物理场景或游戏场景。

B. 后期处理

Three.js包含一些简单的后期处理效果,例如灯光效果、阴影、模糊和扭曲等。此外,Three.js的PostProcessing.js库还提供了更高级的后期处理效果,例如全屏幕抗锯齿、HDR渲染和bloom效果等。

C. VR和AR支持

Three.js是一种可用于虚拟现实(VR)和增强现实(AR)的WebGL库。它可以与各种VR/AR SDK集成,例如WebVR和AR.js等。与这些SDK集成之后,您可以将Three.js应用于创建更具交互性的VR/AR应用程序或游戏。

D. 与其他Web技术的集成

Three.js可以与其他Web技术集成,例如CSS3D,WebSocket和Canvas等。使用这些技术,您可以创建更为复杂的应用程序和游戏,并与其他Web组件进行交互。此外,Three.js还可以使用JavaScript框架(如React、Angular和Vue.js)进行构建,以便更好地管理和维护您的3D应用程序。

V. 最佳实践

A. Three.js 3D性能优化

在Three.js中进行性能优化的关键是减少对象数量和减少重绘次数

可以通过减少透明对象数量、使用LOD(级别在距离)技术、合并几何体和使用缓存等方式来优化性能。

另外,为了避免CPU瓶颈,也可以使用GPU加速库等方式来减轻计算负荷。

B. 代码组织和可维护性

要使Three.js代码易于组织和维护,可以使用模块化编程,将功能拆分为小模块。同时,应使用ES6的类和继承,并遵守SOLID原则和单一职责原则,以确保代码可读性和可维护性。

C. 设计模式和代码风格

在Three.js中,可使用常见的设计模式如MVC观察者和单例来改善代码结构。并且应遵循良好的代码风格和命名约定,以提高代码可读性。

D. 常见问题和解决方案

Three.js中常见的问题包括性能问题、跨浏览器兼容性、材质和纹理问题等。可以通过使用性能分析工具、选择适当的库、减少透明对象数量来解决性能问题。可以通过使用Polyfill新特性的时候谨慎使用等方式来解决跨浏览器兼容性问题。在解决材质和纹理问题时,可以考虑使用缓存等技术来提高渲染性能。

VI. 未来展望

A. Three.js 3D的发展趋势

随着技术的进步和应用场景的扩大,可预见Three.js的发展方向将是更加开放和可扩展的生态系统。

未来版本可能会更注重性能优化、增强VR/AR支持、实现更高级的后期处理效果和跨平台兼容性

B. 可能的应用场景和创新

  • 可能的应用场景:
    Three.js的应用场景非常广泛,包括游戏开发、虚拟现实、增强现实、数据可视化、建筑和室内设计、艺术和文化领域等。其高度可定制化和易于开发的特性使得它非常适合这些应用场景。
  • 创新:
    在Three.js中,为了开发新创意和实现新领域的应用,可尝试一些新的技术和策略。例如:尝试集成物理引擎以提高游戏的真实感和交互性、尝试使用WebAssembly来加速运行速度、尝试使用WebGPU来实现更高级的渲染效果、尝试使用TensorFlow.js来进行深度学习和人工智能方面的研究、尝试使用WebXR API来实现更高级的虚拟现实体验等。
相关文章
|
C语言 C++
C/C++实现跨年表白烟花
C/C++实现跨年表白烟花
323 0
|
程序员 区块链
面试周连续剧之走马观花
在前面四天的面试中已经适应了面试的套路和节奏,自己的知识储备也越来越完善,而且自己的要求也不是太高,个人以为自己是属于容易满足的那种类型,所以从面试的第三天开始就停止约面试了,但是好多招聘人事不知道在哪里搞得我的联系方式,直接就是安排面试,有一种推着你往前走的赶脚,所以已经开始拒绝约面和电面。俗话说的好,手中有offer,心里不慌,那么接下来就开启新的一天的面试经历吧!
106 1
面试周连续剧之走马观花
|
前端开发 JavaScript
「寒草的中秋献礼🥮,实现30s前端创意动画」陪你看日落和月升|与你赏星空和诗歌
「寒草的中秋献礼🥮,实现30s前端创意动画」陪你看日落和月升|与你赏星空和诗歌
248 1
|
Ubuntu 测试技术 开发工具
画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试
自己的画的炫彩“月饼”到了,本文就开始带大家来玩玩我们自己的月饼 ......by 矜辰所致
515 0
画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试
|
程序员 C++
谁说程序员不浪漫——给女友放个烟花,安排!安排!
谁说程序员不浪漫——给女友放个烟花,安排!安排!
141 0
谁说程序员不浪漫——给女友放个烟花,安排!安排!
|
前端开发 数据可视化 定位技术
Fly哥给粉丝肝了一晚上的地球飞星动画!!
前言 最近有粉丝在群里讨论,如何实现可视化大屏中的飞星动画,Fly哥最近也是抽空简单写了下小demo。读完这篇文章你可以学到 「球面坐标系」 「还有就是三阶贝塞尔曲线」 「二维图形转球面」 直接看效果: 图片 飞星动画 一、 3d绘制场景的构建 绘制一个3d程序首先需要添加 「渲染器」,「场景」,「照相机」 这些元素,这里补充一个灯光; 1、渲染器 首先创建一个渲染器,参数为页面中的canvas元素, 渲染器的作用就是把3d场景的内容结合照相机渲染到页面中, 最后将画布背景设为白色。 const renderer = new Three.WebGLRenderer({canvas
Fly哥给粉丝肝了一晚上的地球飞星动画!!
|
架构师 Java 程序员
码农自述:猝死瞬间,我在想些什么?
「 亲身经历 」 说到猝死,相信很多人都觉得离自己很遥远,那些事情只会发生在新闻里。土叔身为多年的码农,经常熬夜上线调试bug,自认为身强体壮,劳损丝毫不能伤吾身,却意外地经历了一次猝死惊魂的瞬间。
2143 0
|
数据安全/隐私保护
七夕快到了,就帮你到这吧
链接: https://pan.baidu.com/s/1jADup0i_KMOJeULHvdGPUA 密码: 235s 出处:https://www.
943 0
|
小程序 C# 程序员
七夕快到了!表白小程序制作详解,撩翻你的女神!
大家可能都会在抖音上刷过,那种表白小程序,但在我看来表白还是亲口说出来比较好,这类小程序只适合在平常的一些小节日给对方一个惊喜。话不多说,现在进入正题:         首先,要在电脑上安装微软的编译软件,我这里是使用的VS2017,安装的时候如果没有别的需要,直接选择下载wpf的组件就好。
1698 0