成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

十分鐘快速實(shí)戰(zhàn)Three.JS感受它的無(wú)限魅力!

開(kāi)發(fā) 前端
本文不會(huì)對(duì)Three.js幾何體、材質(zhì)、相機(jī)、模型、光源等概念詳細(xì)講解,會(huì)首先分成幾個(gè)模塊給大家快速演示一盒小案例。大家可以根據(jù)這幾個(gè)模塊快速了解Three.js的無(wú)限魅力。

[[353538]]

 前言

本文不會(huì)對(duì)Three.js幾何體、材質(zhì)、相機(jī)、模型、光源等概念詳細(xì)講解,會(huì)首先分成幾個(gè)模塊給大家快速演示一盒小案例。大家可以根據(jù)這幾個(gè)模塊快速了解Three.js的無(wú)限魅力。

學(xué)習(xí)

我們會(huì)使用Three.js簡(jiǎn)單做一個(gè)立方體,為了大家更能宏觀的了解Three.js。我將會(huì)分解成代碼段(模塊)來(lái)進(jìn)行開(kāi)發(fā)。模塊如下:

  • 場(chǎng)景對(duì)象
  • 網(wǎng)格模型
  • 光源
  • 相機(jī)
  • 渲染器對(duì)象
  • 渲染操作

1. 創(chuàng)建html文件

首先,我們得創(chuàng)建一個(gè)html文件,這樣才有地方開(kāi)發(fā)。創(chuàng)建完成后,我們可以引入Three.js文件,今天,它可是主角。我是直接引入遠(yuǎn)程URL地址進(jìn)行加載,你也可以去官網(wǎng)進(jìn)行下載到本地引入。

  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. 創(chuàng)建場(chǎng)景對(duì)象

借助Three.js引擎創(chuàng)建好一個(gè)虛擬的三維場(chǎng)景。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象Scene 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.     </script> 
  17.   </body> 
  18. </html> 

3. 創(chuàng)建網(wǎng)格模型

這行代碼new THREE.BoxGeometry(200, 200, 200)的意思是創(chuàng)建了一個(gè)長(zhǎng)200、寬200、高200的立方體對(duì)象。然后并通過(guò)代碼new THREE.MeshLambertMaterial給立方體對(duì)象定義材質(zhì),這里可以理解成立方體的屬性(包含了顏色、透明度等屬性),這里暫時(shí)列舉顏色屬性。然后我們需要將立方體與屬性聯(lián)系起來(lái),就用到網(wǎng)格模型,將兩者作為構(gòu)造函數(shù)Mesh的兩個(gè)參數(shù)傳進(jìn)去,最后添加到場(chǎng)景里面。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 創(chuàng)建網(wǎng)格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材質(zhì)對(duì)象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh 
  24.       scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 
  25.     </script> 
  26.   </body> 
  27. </html> 

4. 設(shè)置光源

代碼new THREE.PointLight('#fff')創(chuàng)建了一個(gè)點(diǎn)光源對(duì)象,參數(shù)#fff定義的是光照強(qiáng)度, 你可以嘗試把參數(shù)更改為#666,你會(huì)看到立方體的表面顏色變暗,這很好理解,實(shí)際生活中燈光強(qiáng)度變低了,周圍的景物自然暗淡。比如夜空中的照明彈就是一個(gè)點(diǎn)光源例子。代碼THREE.AmbientLight('#333')創(chuàng)建了一個(gè)環(huán)境光對(duì)象,環(huán)境光的顏色會(huì)影響到整個(gè)場(chǎng)景,環(huán)境光沒(méi)有特定的光源,是模擬漫反射的一種光源,因此不需要指定位置它能將燈光均勻地照射在場(chǎng)景中每個(gè)物體上面,一般情況下用來(lái)弱化陰影或者添加一些顏色到環(huán)境中,因此不能將環(huán)境光作為場(chǎng)景中的唯一光源。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 創(chuàng)建網(wǎng)格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材質(zhì)對(duì)象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh 
  24.       scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 
  25.       /* 
  26.        * 設(shè)置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //點(diǎn)光源 
  29.       point.position.set(300, 100, 200); //點(diǎn)光源位置 
  30.       scene.add(point); //點(diǎn)光源添加到場(chǎng)景中 
  31.        
  32.       var ambient = new THREE.AmbientLight('#333');//環(huán)境光 
  33.       scene.add(ambient); //環(huán)境光添加到場(chǎng)景中 
  34.     </script> 
  35.   </body> 
  36. </html> 

5.設(shè)置相機(jī)

代碼new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000)創(chuàng)建了一個(gè)正射投影相機(jī)對(duì)象, 什么是“正射投影”,什么是“相機(jī)對(duì)象”, 比如把該構(gòu)造函數(shù)參數(shù)中用到的參數(shù)s,也就是代碼var s = 200中定義的一個(gè)系數(shù),可以把200更改為300,你會(huì)發(fā)現(xiàn)立方體顯示效果變小,這很好理解,相機(jī)構(gòu)造函數(shù)的的前四個(gè)參數(shù)定義的是拍照窗口大小, 就像平時(shí)拍照一樣,取景范圍為大,被拍的人相對(duì)背景自然變小了。camera.position.set(200, 300, 200);和camera.lookAt(scene.position)定義的是相機(jī)的位置和拍照方向,可以更改camera.position.set(200,300,200)參數(shù)重新定義的相機(jī)位置,把第一個(gè)參數(shù)也就是x坐標(biāo)從200更改為250, 你會(huì)發(fā)現(xiàn)立方的在屏幕上呈現(xiàn)的角度變了,這就像你生活中拍照人是同一個(gè)人,但是你拍照的位置角度不同,顯示的效果肯定不同。這些具體的參數(shù)細(xì)節(jié)可以不用管, 至少你知道相機(jī)可以縮放顯示三維場(chǎng)景、對(duì)三維場(chǎng)景的不同角度進(jìn)行取景顯示。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 創(chuàng)建網(wǎng)格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材質(zhì)對(duì)象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh 
  24.       scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 
  25.       /* 
  26.        * 設(shè)置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //點(diǎn)光源 
  29.       point.position.set(300, 100, 200); //點(diǎn)光源位置 
  30.       scene.add(point); //點(diǎn)光源添加到場(chǎng)景中 
  31.       var ambient = new THREE.AmbientLight('#333');//環(huán)境光 
  32.       scene.add(ambient); //環(huán)境光添加到場(chǎng)景中 
  33.       /* 
  34.        * 設(shè)置相機(jī) 
  35.        */ 
  36.       var width = window.innerWidth; //窗口寬度 
  37.       var height = window.innerHeight; //窗口高度 
  38.       var k = width / height; //窗口寬高比 
  39.       var s = 200; //三維場(chǎng)景顯示范圍控制系數(shù),系數(shù)越大,顯示的范圍越大 
  40.       //創(chuàng)建相機(jī)對(duì)象 
  41.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  42.       camera.position.set(200, 300, 200); //設(shè)置相機(jī)位置 
  43.       camera.lookAt(scene.position); //設(shè)置相機(jī)方向(指向的場(chǎng)景對(duì)象) 
  44.     </script> 
  45.   </body> 
  46. </html> 

6.創(chuàng)建渲染器對(duì)象

Three.js是基于原生WebGL封裝運(yùn)行的三維引擎。所以瀏覽器利用代碼new THREE.WebGLRenderer()就會(huì)渲染出一幀圖像。可以設(shè)置渲染區(qū)域尺寸和背景顏色。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 創(chuàng)建網(wǎng)格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材質(zhì)對(duì)象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh 
  24.       scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 
  25.       /* 
  26.        * 設(shè)置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //點(diǎn)光源 
  29.       point.position.set(300, 100, 200); //點(diǎn)光源位置 
  30.       scene.add(point); //點(diǎn)光源添加到場(chǎng)景中 
  31.       var ambient = new THREE.AmbientLight('#333');//環(huán)境光 
  32.       scene.add(ambient); //環(huán)境光添加到場(chǎng)景中 
  33.       /* 
  34.        * 設(shè)置相機(jī) 
  35.        */ 
  36.       var width = window.innerWidth; //窗口寬度 
  37.       var height = window.innerHeight; //窗口高度 
  38.       var k = width / height; //窗口寬高比 
  39.       var s = 200; //三維場(chǎng)景顯示范圍控制系數(shù),系數(shù)越大,顯示的范圍越大 
  40.       //創(chuàng)建相機(jī)對(duì)象 
  41.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  42.       camera.position.set(200, 300, 200); //設(shè)置相機(jī)位置 
  43.       camera.lookAt(scene.position); //設(shè)置相機(jī)方向(指向的場(chǎng)景對(duì)象) 
  44.       /* 
  45.        * 創(chuàng)建渲染器對(duì)象 
  46.        */ 
  47.       var renderer = new THREE.WebGLRenderer(); 
  48.       renderer.setSize(width, height); //設(shè)置渲染區(qū)域尺寸 
  49.       renderer.setClearColor(0xb9d3ff, 1); //設(shè)置背景顏色 
  50.     </script> 
  51.   </body> 
  52. </html> 

7.執(zhí)行渲染操作

將渲染好的區(qū)域指定場(chǎng)景、相機(jī)作為參數(shù),并且把區(qū)域添加到頁(yè)面上。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象 
  14.        */ 
  15.       var scene = new THREE.Scene(); 
  16.       /* 
  17.        * 創(chuàng)建網(wǎng)格模型 
  18.        */ 
  19.       var geometry = new THREE.BoxGeometry(200, 200, 200); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry 
  20.       var material = new THREE.MeshLambertMaterial({ 
  21.         color: '#f4f4f4'
  22.       }); //材質(zhì)對(duì)象Material 
  23.       var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh 
  24.       scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 
  25.       /* 
  26.        * 設(shè)置光源 
  27.        */ 
  28.       var point = new THREE.PointLight('#fff'); //點(diǎn)光源 
  29.       point.position.set(300, 100, 200); //點(diǎn)光源位置 
  30.       scene.add(point); //點(diǎn)光源添加到場(chǎng)景中 
  31.       var ambient = new THREE.AmbientLight('#333');//環(huán)境光 
  32.       scene.add(ambient); //環(huán)境光添加到場(chǎng)景中 
  33.       /* 
  34.        * 設(shè)置相機(jī) 
  35.        */ 
  36.       var width = window.innerWidth; //窗口寬度 
  37.       var height = window.innerHeight; //窗口高度 
  38.       var k = width / height; //窗口寬高比 
  39.       var s = 200; //三維場(chǎng)景顯示范圍控制系數(shù),系數(shù)越大,顯示的范圍越大 
  40.       //創(chuàng)建相機(jī)對(duì)象 
  41.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  42.       camera.position.set(200, 300, 200); //設(shè)置相機(jī)位置 
  43.       camera.lookAt(scene.position); //設(shè)置相機(jī)方向(指向的場(chǎng)景對(duì)象) 
  44.       /* 
  45.        * 創(chuàng)建渲染器對(duì)象 
  46.        */ 
  47.       var renderer = new THREE.WebGLRenderer(); 
  48.       renderer.setSize(width, height); //設(shè)置渲染區(qū)域尺寸 
  49.       renderer.setClearColor(0xb9d3ff, 1); //設(shè)置背景顏色 
  50.       /* 
  51.        * 執(zhí)行渲染操作   
  52.        */  
  53.       renderer.render(scene, camera); //指定場(chǎng)景、相機(jī)作為參數(shù) 
  54.       document.body.appendChild(renderer.domElement); //body元素中插入canvas對(duì)象 
  55.     </script> 
  56.   </body> 
  57. </html> 

完整代碼

代碼body {margin: 0;overflow: hidden;}是為了隱藏body窗口區(qū)域滾動(dòng)條。

  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.        * 創(chuàng)建場(chǎng)景對(duì)象 
  20.        */ 
  21.       var scene = new THREE.Scene(); 
  22.       /* 
  23.        * 創(chuàng)建網(wǎng)格模型 
  24.        */ 
  25.       var geometry = new THREE.BoxGeometry(200, 200, 200); //創(chuàng)建一個(gè)立方體幾何對(duì)象Geometry 
  26.       var material = new THREE.MeshLambertMaterial({ 
  27.         color: '#f4f4f4'
  28.       }); //材質(zhì)對(duì)象Material 
  29.       var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對(duì)象Mesh 
  30.       scene.add(mesh); //網(wǎng)格模型添加到場(chǎng)景中 
  31.       /* 
  32.        * 設(shè)置光源 
  33.        */ 
  34.       var point = new THREE.PointLight('#fff'); //點(diǎn)光源 
  35.       point.position.set(300, 100, 200); //點(diǎn)光源位置 
  36.       scene.add(point); //點(diǎn)光源添加到場(chǎng)景中 
  37.       var ambient = new THREE.AmbientLight('#333');//環(huán)境光 
  38.       scene.add(ambient); //環(huán)境光添加到場(chǎng)景中 
  39.       /* 
  40.        * 設(shè)置相機(jī) 
  41.        */ 
  42.       var width = window.innerWidth; //窗口寬度 
  43.       var height = window.innerHeight; //窗口高度 
  44.       var k = width / height; //窗口寬高比 
  45.       var s = 200; //三維場(chǎng)景顯示范圍控制系數(shù),系數(shù)越大,顯示的范圍越大 
  46.       //創(chuàng)建相機(jī)對(duì)象 
  47.       var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); 
  48.       camera.position.set(200, 300, 200); //設(shè)置相機(jī)位置 
  49.       camera.lookAt(scene.position); //設(shè)置相機(jī)方向(指向的場(chǎng)景對(duì)象) 
  50.       /* 
  51.        * 創(chuàng)建渲染器對(duì)象 
  52.        */ 
  53.       var renderer = new THREE.WebGLRenderer(); 
  54.       renderer.setSize(width, height); //設(shè)置渲染區(qū)域尺寸 
  55.       renderer.setClearColor(0xb9d3ff, 1); //設(shè)置背景顏色 
  56.       /* 
  57.        * 執(zhí)行渲染操作   
  58.        */  
  59.       renderer.render(scene, camera); //指定場(chǎng)景、相機(jī)作為參數(shù) 
  60.       document.body.appendChild(renderer.domElement); //body元素中插入canvas對(duì)象 
  61.     </script> 
  62.   </body> 
  63. </html> 

結(jié)語(yǔ)

下面這幅圖非常形象地說(shuō)明了場(chǎng)景—相機(jī)—渲染器之間的關(guān)系。

 

 

責(zé)任編輯:姜華 來(lái)源: 前端歷劫之路
相關(guān)推薦

2012-07-10 01:22:32

PythonPython教程

2024-11-07 16:09:53

2022-04-13 22:01:44

錯(cuò)誤監(jiān)控系統(tǒng)

2020-12-17 06:48:21

SQLkafkaMySQL

2009-04-29 17:35:47

LinuxWebMail系統(tǒng)

2019-04-01 14:59:56

負(fù)載均衡服務(wù)器網(wǎng)絡(luò)

2023-03-13 07:52:13

2023-10-27 09:40:52

VitePressGatsby

2024-06-19 09:58:29

2021-09-07 09:40:20

Spark大數(shù)據(jù)引擎

2022-06-16 07:31:41

Web組件封裝HTML 標(biāo)簽

2023-04-12 11:18:51

甘特圖前端

2022-03-04 16:06:33

數(shù)據(jù)庫(kù)HarmonyOS鴻蒙

2015-09-06 09:22:24

框架搭建快速高效app

2024-05-13 09:28:43

Flink SQL大數(shù)據(jù)

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫(kù)

2023-11-09 14:44:27

Docker鏡像容器

2019-09-16 09:14:51

2009-10-09 14:45:29

VB程序

2023-07-15 18:26:51

LinuxABI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕一区二区三区在线观看 | 国产精品久久久久久久久久 | 久久剧场 | 成人高清在线视频 | 欧美日韩专区 | 男女午夜激情视频 | 久久精品久久久久久 | 精品美女久久久久久免费 | 激情五月激情综合网 | 亚洲成人动漫在线观看 | 啪一啪 | 奇米av| 欧美日韩大片 | 国产免费人成xvideos视频 | 国产精品久久久久久久久久不蜜臀 | 欧洲精品一区 | 极品电影院 | 久久综合香蕉 | 狠狠撸在线视频 | 日韩一级免费电影 | 精品国产乱码久久久久久闺蜜 | 国产a一区二区 | 国产精品美女久久久 | 日本三级电影在线看 | 国产亚洲一区二区三区在线观看 | 久久国产精品一区二区三区 | 一区二区三区四区日韩 | 国产精品a久久久久 | 国产一区二区三区 | 少妇一级淫片免费放播放 | 天天草狠狠干 | 精品国产欧美一区二区三区不卡 | 亚洲成人精品 | 九九精品在线 | 成人精品一区二区三区中文字幕 | 日一区二区三区 | 欧美成人猛片aaaaaaa | aaa一区| 国产美女自拍视频 | 中文字幕视频在线观看 | 久草视频在线播放 |