十分钟快速实战Three.JS感受它的无限魅力!

开发 前端
本文不会对Three.js几何体、材质、相机、模型、光源等概念详细讲解,会首先分成几个模块给大家快速演示一盒小案例。大家可以根据这几个模块快速了解Three.js的无限魅力。

[[353538]]

 前言

本文不会对Three.js几何体、材质、相机、模型、光源等概念详细讲解,会首先分成几个模块给大家快速演示一盒小案例。大家可以根据这几个模块快速了解Three.js的无限魅力。

学习

我们会使用Three.js简单做一个立方体,为了大家更能宏观的了解Three.js。我将会分解成代码段(模块)来进行开发。模块如下:

  • 场景对象
  • 网格模型
  • 光源
  • 相机
  • 渲染器对象
  • 渲染操作

1. 创建html文件

首先,我们得创建一个html文件,这样才有地方开发。创建完成后,我们可以引入Three.js文件,今天,它可是主角。我是直接引入远程URL地址进行加载,你也可以去官网进行下载到本地引入。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.    
  12.   </body> 
  13. </html> 

2. 创建场景对象

借助Three.js引擎创建好一个虚拟的三维场景。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.   <script>   
  12.       /* 
  13.        * 创建场景对象Scene 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.     </script> 
  17.   </body> 
  18. </html> 

3. 创建网格模型

这行代码new THREE.BoxGeometry(200, 200, 200)的意思是创建了一个长200、宽200、高200的立方体对象。然后并通过代码new THREE.MeshLambertMaterial给立方体对象定义材质,这里可以理解成立方体的属性(包含了颜色、透明度等属性),这里暂时列举颜色属性。然后我们需要将立方体与属性联系起来,就用到网格模型,将两者作为构造函数Mesh的两个参数传进去,最后添加到场景里面。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.   <script>   
  12.       /* 
  13.        * 创建场景对象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 创建网格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //创建一个立方体几何对象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材质对象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
  24.       scene.add(mesh); //网格模型添加到场景中 
  25.     </script> 
  26.   </body> 
  27. </html> 

4. 设置光源

代码new THREE.PointLight('#fff')创建了一个点光源对象,参数#fff定义的是光照强度, 你可以尝试把参数更改为#666,你会看到立方体的表面颜色变暗,这很好理解,实际生活中灯光强度变低了,周围的景物自然暗淡。比如夜空中的照明弹就是一个点光源例子。代码THREE.AmbientLight('#333')创建了一个环境光对象,环境光的颜色会影响到整个场景,环境光没有特定的光源,是模拟漫反射的一种光源,因此不需要指定位置它能将灯光均匀地照射在场景中每个物体上面,一般情况下用来弱化阴影或者添加一些颜色到环境中,因此不能将环境光作为场景中的唯一光源。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.   <script>   
  12.       /* 
  13.        * 创建场景对象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 创建网格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //创建一个立方体几何对象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材质对象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
  24.       scene.add(mesh); //网格模型添加到场景中 
  25.       /* 
  26.        * 设置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //点光源 
  29.       point.position.set(300, 100, 200); //点光源位置 
  30.       scene.add(point); //点光源添加到场景中 
  31.        
  32.       var ambient = new THREE.AmbientLight('#333');//环境光 
  33.       scene.add(ambient); //环境光添加到场景中 
  34.     </script> 
  35.   </body> 
  36. </html> 

5.设置相机

代码new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000)创建了一个正射投影相机对象, 什么是“正射投影”,什么是“相机对象”, 比如把该构造函数参数中用到的参数s,也就是代码var s = 200中定义的一个系数,可以把200更改为300,你会发现立方体显示效果变小,这很好理解,相机构造函数的的前四个参数定义的是拍照窗口大小, 就像平时拍照一样,取景范围为大,被拍的人相对背景自然变小了。camera.position.set(200, 300, 200);和camera.lookAt(scene.position)定义的是相机的位置和拍照方向,可以更改camera.position.set(200,300,200)参数重新定义的相机位置,把第一个参数也就是x坐标从200更改为250, 你会发现立方的在屏幕上呈现的角度变了,这就像你生活中拍照人是同一个人,但是你拍照的位置角度不同,显示的效果肯定不同。这些具体的参数细节可以不用管, 至少你知道相机可以缩放显示三维场景、对三维场景的不同角度进行取景显示。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.   <script>   
  12.       /* 
  13.        * 创建场景对象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 创建网格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //创建一个立方体几何对象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材质对象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
  24.       scene.add(mesh); //网格模型添加到场景中 
  25.       /* 
  26.        * 设置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //点光源 
  29.       point.position.set(300, 100, 200); //点光源位置 
  30.       scene.add(point); //点光源添加到场景中 
  31.       var ambient = new THREE.AmbientLight('#333');//环境光 
  32.       scene.add(ambient); //环境光添加到场景中 
  33.       /* 
  34.        * 设置相机 
  35.        */ 
  36.       var width = window.innerWidth; //窗口宽度 
  37.       var height = window.innerHeight; //窗口高度 
  38.       var k = width / height; //窗口宽高比 
  39.       var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大 
  40.       //创建相机对象 
  41.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  42.       camera.position.set(200, 300, 200); //设置相机位置 
  43.       camera.lookAt(scene.position); //设置相机方向(指向的场景对象) 
  44.     </script> 
  45.   </body> 
  46. </html> 

6.创建渲染器对象

Three.js是基于原生WebGL封装运行的三维引擎。所以浏览器利用代码new THREE.WebGLRenderer()就会渲染出一帧图像。可以设置渲染区域尺寸和背景颜色。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.   <script>   
  12.       /* 
  13.        * 创建场景对象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 创建网格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //创建一个立方体几何对象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材质对象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
  24.       scene.add(mesh); //网格模型添加到场景中 
  25.       /* 
  26.        * 设置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //点光源 
  29.       point.position.set(300, 100, 200); //点光源位置 
  30.       scene.add(point); //点光源添加到场景中 
  31.       var ambient = new THREE.AmbientLight('#333');//环境光 
  32.       scene.add(ambient); //环境光添加到场景中 
  33.       /* 
  34.        * 设置相机 
  35.        */ 
  36.       var width = window.innerWidth; //窗口宽度 
  37.       var height = window.innerHeight; //窗口高度 
  38.       var k = width / height; //窗口宽高比 
  39.       var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大 
  40.       //创建相机对象 
  41.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  42.       camera.position.set(200, 300, 200); //设置相机位置 
  43.       camera.lookAt(scene.position); //设置相机方向(指向的场景对象) 
  44.       /* 
  45.        * 创建渲染器对象 
  46.        */ 
  47.       var renderer = new THREE.WebGLRenderer(); 
  48.       renderer.setSize(width, height); //设置渲染区域尺寸 
  49.       renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色 
  50.     </script> 
  51.   </body> 
  52. </html> 

7.执行渲染操作

将渲染好的区域指定场景、相机作为参数,并且把区域添加到页面上。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <!--引入three.js--> 
  7.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  8.   </head> 
  9.  
  10.   <body> 
  11.   <script>   
  12.       /* 
  13.        * 创建场景对象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 创建网格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //创建一个立方体几何对象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材质对象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
  24.       scene.add(mesh); //网格模型添加到场景中 
  25.       /* 
  26.        * 设置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //点光源 
  29.       point.position.set(300, 100, 200); //点光源位置 
  30.       scene.add(point); //点光源添加到场景中 
  31.       var ambient = new THREE.AmbientLight('#333');//环境光 
  32.       scene.add(ambient); //环境光添加到场景中 
  33.       /* 
  34.        * 设置相机 
  35.        */ 
  36.       var width = window.innerWidth; //窗口宽度 
  37.       var height = window.innerHeight; //窗口高度 
  38.       var k = width / height; //窗口宽高比 
  39.       var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大 
  40.       //创建相机对象 
  41.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  42.       camera.position.set(200, 300, 200); //设置相机位置 
  43.       camera.lookAt(scene.position); //设置相机方向(指向的场景对象) 
  44.       /* 
  45.        * 创建渲染器对象 
  46.        */ 
  47.       var renderer = new THREE.WebGLRenderer(); 
  48.       renderer.setSize(width, height); //设置渲染区域尺寸 
  49.       renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色 
  50.       /* 
  51.        * 执行渲染操作   
  52.        */  
  53.       renderer.render(scene, camera); //指定场景、相机作为参数 
  54.       document.body.appendChild(renderer.domElement); //body元素中插入canvas对象 
  55.     </script> 
  56.   </body> 
  57. </html> 

完整代码

代码body {margin: 0;overflow: hidden;}是为了隐藏body窗口区域滚动条。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <title>three.js小案例</title> 
  6.     <style> 
  7.       body { 
  8.         margin: 0; 
  9.         overflow: hidden; 
  10.       } 
  11.     </style> 
  12.     <!--引入three.js--> 
  13.     <script src="https://unpkg.com/three@0.122.0/build/three.js"></script> 
  14.   </head> 
  15.  
  16.   <body> 
  17.   <script>   
  18.       /* 
  19.        * 创建场景对象 
  20.        */ 
  21.       var scene = new THREE.Scene(); 
  22.       /* 
  23.        * 创建网格模型 
  24.        */ 
  25.       var geometry = new THREE.BoxGeometry(200, 200, 200); //创建一个立方体几何对象Geometry 
  26.       var material = new THREE.MeshLambertMaterial({ 
  27.         color: '#f4f4f4'
  28.       }); //材质对象Material 
  29.       var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
  30.       scene.add(mesh); //网格模型添加到场景中 
  31.       /* 
  32.        * 设置光源 
  33.        */ 
  34.       var point = new THREE.PointLight('#fff'); //点光源 
  35.       point.position.set(300, 100, 200); //点光源位置 
  36.       scene.add(point); //点光源添加到场景中 
  37.       var ambient = new THREE.AmbientLight('#333');//环境光 
  38.       scene.add(ambient); //环境光添加到场景中 
  39.       /* 
  40.        * 设置相机 
  41.        */ 
  42.       var width = window.innerWidth; //窗口宽度 
  43.       var height = window.innerHeight; //窗口高度 
  44.       var k = width / height; //窗口宽高比 
  45.       var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大 
  46.       //创建相机对象 
  47.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  48.       camera.position.set(200, 300, 200); //设置相机位置 
  49.       camera.lookAt(scene.position); //设置相机方向(指向的场景对象) 
  50.       /* 
  51.        * 创建渲染器对象 
  52.        */ 
  53.       var renderer = new THREE.WebGLRenderer(); 
  54.       renderer.setSize(width, height); //设置渲染区域尺寸 
  55.       renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色 
  56.       /* 
  57.        * 执行渲染操作   
  58.        */  
  59.       renderer.render(scene, camera); //指定场景、相机作为参数 
  60.       document.body.appendChild(renderer.domElement); //body元素中插入canvas对象 
  61.     </script> 
  62.   </body> 
  63. </html> 

结语

下面这幅图非常形象地说明了场景—相机—渲染器之间的关系。

 

 

责任编辑:姜华 来源: 前端历劫之路
相关推荐

2012-07-10 01:22:32

PythonPython教程

2022-04-13 22:01:44

错误监控系统

2024-11-07 16:09:53

2023-10-27 09:40:52

VitePressGatsby

2019-04-01 14:59:56

负载均衡服务器网络

2009-04-29 17:35:47

LinuxWebMail系统

2020-12-17 06:48:21

SQLkafkaMySQL

2023-03-13 07:52:13

2022-03-04 16:06:33

数据库HarmonyOS鸿蒙

2015-09-06 09:22:24

框架搭建快速高效app

2024-05-13 09:28:43

Flink SQL大数据

2023-11-30 10:21:48

虚拟列表虚拟列表工具库

2022-06-16 07:31:41

Web组件封装HTML 标签

2021-09-07 09:40:20

Spark大数据引擎

2024-06-19 09:58:29

2023-04-12 11:18:51

甘特图前端

2023-11-09 14:44:27

Docker镜像容器

2024-04-01 00:55:51

Canvas前端项目

2020-12-11 09:40:10

DevOpsCICD

2015-11-06 11:03:36

点赞
收藏

51CTO技术栈公众号