利用three.js畫一個(gè)3D立體的正方體示例代碼
簡(jiǎn)介
three.js 是一款WebGL框架,WebGL可以讓我們?cè)赾anvas上實(shí)現(xiàn)3D效果。實(shí)現(xiàn)3D效果在國(guó)內(nèi)來(lái)說(shuō)還算是比較新的東西,可供查閱的資料也不多。這篇文章僅是一個(gè)入門篇,介紹如何繪制一個(gè)3D正方體。
Three.js中的基本概念
Three.js包含3個(gè)基本概念:場(chǎng)景(Scene)、相機(jī)(Camera)和渲染器(Renderer)。
場(chǎng)景就是需要繪制的對(duì)象,相機(jī)代表取景的視角,渲染器是繪制的載體(可以掛靠到瀏覽器的DOM元素中),
也就是我們通過(guò)相機(jī)拍攝場(chǎng)景然后繪制到目標(biāo)介質(zhì)中去。
創(chuàng)建場(chǎng)景、相機(jī)和渲染器
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement );
上述代碼首先創(chuàng)建一個(gè)場(chǎng)景,然后創(chuàng)建一個(gè)PerspectiveCamera(立體感的相機(jī)),接著創(chuàng)建了一個(gè)WebGL的渲染器(注意Three.js也支持非3D的Canvas 2D的渲染器),然后掛靠為HTML文檔body的DOM子元素。
介紹完畢,首先奉上實(shí)現(xiàn)的效果圖:
這就是實(shí)現(xiàn)的效果圖,還是挺有立體感的吧?
繪制前的準(zhǔn)備
寫代碼前,要先下載最新的three.js框架包,引入自己的頁(yè)面。
具體實(shí)現(xiàn)過(guò)程
準(zhǔn)備一個(gè)canvas畫布
這個(gè)畫布是我們展現(xiàn)整個(gè)3D正方形的畫布,也就是上圖那個(gè)黑色的方框。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Camera 相機(jī)</title> <style> #canvas { width: 400px; height: 300px; border: 1px solid red; margin: 50px auto; display:block; } </style> </head> <body> <canvas id="canvas"></canvas> <script src="./libs/three.min.js"></script> </body> </html>
明確繪制思路
接下來(lái)的繪制過(guò)程會(huì)涉及到多個(gè)概念:canvas、scene、camera、renderer。
為了能更好理解繪制過(guò)程的代碼和有助于記憶,我們先來(lái)理解這幾個(gè)概念:
假設(shè)我們現(xiàn)在正在旅游的途中,看到了一個(gè)很唯美的畫面,想把這個(gè)3D世界記錄下來(lái)
- 這個(gè)唯美的場(chǎng)景就是scene,我們用相機(jī)camera拍攝下來(lái)形成照片
- 為了能看清楚這個(gè)照片,我們把這個(gè)照片放置在一個(gè)畫布canvas上
- 最后,我們?cè)儆胷enderer修飾渲染一下
這樣,我們就能成功展現(xiàn)這個(gè)3D世界了。
【程序還是很貼近生活噠😊】
通過(guò)現(xiàn)實(shí)世界的理解,我們接下來(lái)開(kāi)始代碼啦o( ̄▽ ̄)ブ
準(zhǔn)備好canvas、scene、camera、renderer,給一個(gè)初始化的方法
<script> var camera, scene, renderer, canvas; init(); function init () { canvas = document.getElementById('canvas'); }
接下來(lái)我們要做的就是完善這個(gè)init()方法啦。
創(chuàng)建一個(gè)3D場(chǎng)景scene
場(chǎng)景最簡(jiǎn)單了,只需要用Scene聲明一個(gè)scene對(duì)象。
scene = new THREE.Scene();
準(zhǔn)備好camera
我們這里設(shè)置的相機(jī)是一個(gè)透視的相機(jī)PerspectiveCamera
camera有四個(gè)參數(shù)
- 第一個(gè)參數(shù)是視線輻射的角度,這個(gè)參數(shù)越大,我們能看到的視覺(jué)越廣,這個(gè)物體看上去會(huì)更小。
- 第二個(gè)參數(shù)是圖像內(nèi)容展示的比例:width/height。我們一般把這個(gè)比例設(shè)置為和畫布的比例一樣,這樣看到的圖片才不會(huì)變形。
- 第三四個(gè)參數(shù)分別是相機(jī)離展示內(nèi)容(正方體)最近的距離和最遠(yuǎn)的距離。
camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);
接下來(lái)給camera設(shè)置擺放的位置,并把camera放到場(chǎng)景scene中
由于我們的世界是3D的,camera的擺放位置也是三維的,涉及三個(gè)參數(shù):X軸、Y軸、Z軸。(0, 0, 0)是相機(jī)的原點(diǎn),(1, 1, 5)就是把我們的相機(jī)往右和往上移動(dòng)了1個(gè)單位,往后移動(dòng)了5個(gè)單位。
ps: 這個(gè)時(shí)候畫布canvas的大小正好是正方體的5倍。
camera.position.set(1, 1, 5); scene.add(camera);
在場(chǎng)景中添加一個(gè)立方體
每個(gè)形狀都是一個(gè)mesh,geometry可以理解為物體的骨骼, material可以理解為物體的皮囊
再創(chuàng)建一個(gè)可填充的形狀cube
這樣就構(gòu)成了完整的實(shí)物
我們?cè)賹⑦@個(gè)形狀放入場(chǎng)景scene中
CubeGeometry參數(shù)設(shè)置為1:1:1表示這是一個(gè)正方體,當(dāng)然可以自行修改比例,變成不一樣的立方體
var geometry = new THREE.CubeGeometry(1, 1, 1); // 添加three自帶的最簡(jiǎn)單的一種材質(zhì) var material = new THREE.MeshBasicMaterial({ color: 0xff0000, }); var cube = new THREE.Mesh(geometry, material); var cube = new THREE.Mesh(geometry, material);
最后,創(chuàng)建renderer對(duì)圖像進(jìn)行渲染
將canvas交給renderer,也就是一個(gè)渲染的容器
antialias: true 平滑,抗鋸齒,輸出的畫面會(huì)進(jìn)行優(yōu)化,不會(huì)帶毛邊
renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: true }); // 設(shè)置renderer的樣式 renderer.setSize(canvas.width, canvas.height); renderer.render(scene, camera);
經(jīng)過(guò)以上步驟,我們的的正方體就成功創(chuàng)建好了。
以下是本例完整代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Camera 相機(jī)</title> <style> #canvas { width: 400px; height: 300px; border: 1px solid red; margin: 50px auto; display:block; } </style> </head> <body> <canvas id="canvas"></canvas> <script src="./libs/three.min.js"></script> <script> var camera, scene, renderer, canvas; init(); function init () { canvas = document.getElementById('canvas'); scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10); camera.position.set(1, 1, 5); scene.add(camera); var geometry = new THREE.CubeGeometry(1, 1, 1); var material = new THREE.MeshBasicMaterial({ color: 0xff0000, }); // cube 是一個(gè)可以填充的形狀 var cube = new THREE.Mesh(geometry, material); scene.add(cube); renderer = new THREE.WebGLRenderer({ // 將canvas交給renderer 一個(gè)渲染的容器 canvas: canvas, // 平滑, 抗鋸齒 輸出的畫面會(huì)進(jìn)行優(yōu)化,不會(huì)帶毛邊 antialias: true }); // 設(shè)置renderer的樣子 renderer.setSize(canvas.width, canvas.height); renderer.render(scene, camera); } </script> </body> </html>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Three.js實(shí)現(xiàn)簡(jiǎn)單3D房間布局
- Three.js的使用及繪制基礎(chǔ)3D圖形詳解
- three.js實(shí)現(xiàn)3D模型展示的示例代碼
- Three.js開(kāi)發(fā)實(shí)現(xiàn)3D地圖的實(shí)踐過(guò)程總結(jié)
- Three.js實(shí)現(xiàn)3D機(jī)房效果
- three.js實(shí)現(xiàn)炫酷的全景3D重力感應(yīng)
- three.js中3D視野的縮放實(shí)現(xiàn)代碼
- three.js實(shí)現(xiàn)3D視野縮放效果
- vue頁(yè)面引入three.js實(shí)現(xiàn)3d動(dòng)畫場(chǎng)景操作
- three.js如何實(shí)現(xiàn)3D動(dòng)態(tài)文字效果
相關(guān)文章
基于JS如何實(shí)現(xiàn)類似QQ好友頭像hover時(shí)顯示資料卡的效果(推薦)
通過(guò)本文給大家介紹鼠標(biāo)經(jīng)過(guò)好友列表中的好友頭像時(shí)顯示資料卡的效果,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-06-06JavaScript對(duì)象拷貝與賦值操作實(shí)例分析
這篇文章主要介紹了JavaScript對(duì)象拷貝與賦值操作,結(jié)合實(shí)例形式分析了javascript對(duì)象定義、拷貝、賦值等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12JavaScript實(shí)現(xiàn)頁(yè)面定時(shí)刷新(定時(shí)器,meta)
很多朋友看到定時(shí),很容易想到用js定時(shí)器,還有盆友用meta來(lái)設(shè)置,下面小編給大家介紹js實(shí)現(xiàn)頁(yè)面定時(shí)刷新的方法,一起看看吧2016-10-10echarts學(xué)習(xí)之legend點(diǎn)擊事件解讀
這篇文章主要介紹了echarts學(xué)習(xí)之legend點(diǎn)擊事件解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03史上最全JavaScript數(shù)組去重的十種方法(推薦)
這篇文章主要介紹了JavaScript數(shù)組去重的十種方法,利用元素的屬性和特性進(jìn)行不同的去重方法,并實(shí)例演示如何測(cè)試去重超大數(shù)組,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08JavaScript操作Oracle數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了JavaScript操作Oracle數(shù)據(jù)庫(kù)示例,本文使用ActiveXObject實(shí)現(xiàn)訪問(wèn)Oracle數(shù)據(jù)庫(kù),需要的朋友可以參考下2015-03-03js實(shí)現(xiàn)axios限制請(qǐng)求隊(duì)列
本文主要介紹了js實(shí)現(xiàn)axios限制請(qǐng)求隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07