利用three.js畫一個3D立體的正方體示例代碼
簡介
three.js 是一款WebGL框架,WebGL可以讓我們在canvas上實現(xiàn)3D效果。實現(xiàn)3D效果在國內(nèi)來說還算是比較新的東西,可供查閱的資料也不多。這篇文章僅是一個入門篇,介紹如何繪制一個3D正方體。
Three.js中的基本概念
Three.js包含3個基本概念:場景(Scene)、相機(Camera)和渲染器(Renderer)。
場景就是需要繪制的對象,相機代表取景的視角,渲染器是繪制的載體(可以掛靠到瀏覽器的DOM元素中),
也就是我們通過相機拍攝場景然后繪制到目標(biāo)介質(zhì)中去。
創(chuàng)建場景、相機和渲染器
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)建一個場景,然后創(chuàng)建一個PerspectiveCamera(立體感的相機),接著創(chuàng)建了一個WebGL的渲染器(注意Three.js也支持非3D的Canvas 2D的渲染器),然后掛靠為HTML文檔body的DOM子元素。
介紹完畢,首先奉上實現(xiàn)的效果圖:

這就是實現(xiàn)的效果圖,還是挺有立體感的吧?
繪制前的準(zhǔn)備
寫代碼前,要先下載最新的three.js框架包,引入自己的頁面。
具體實現(xiàn)過程
準(zhǔn)備一個canvas畫布
這個畫布是我們展現(xiàn)整個3D正方形的畫布,也就是上圖那個黑色的方框。
<!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 相機</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>
明確繪制思路
接下來的繪制過程會涉及到多個概念:canvas、scene、camera、renderer。
為了能更好理解繪制過程的代碼和有助于記憶,我們先來理解這幾個概念:
假設(shè)我們現(xiàn)在正在旅游的途中,看到了一個很唯美的畫面,想把這個3D世界記錄下來
- 這個唯美的場景就是scene,我們用相機camera拍攝下來形成照片
- 為了能看清楚這個照片,我們把這個照片放置在一個畫布canvas上
- 最后,我們再用renderer修飾渲染一下
這樣,我們就能成功展現(xiàn)這個3D世界了。
【程序還是很貼近生活噠😊】
通過現(xiàn)實世界的理解,我們接下來開始代碼啦o( ̄▽ ̄)ブ
準(zhǔn)備好canvas、scene、camera、renderer,給一個初始化的方法
<script>
var camera, scene, renderer, canvas;
init();
function init () {
canvas = document.getElementById('canvas');
}
接下來我們要做的就是完善這個init()方法啦。
創(chuàng)建一個3D場景scene
場景最簡單了,只需要用Scene聲明一個scene對象。
scene = new THREE.Scene();
準(zhǔn)備好camera
我們這里設(shè)置的相機是一個透視的相機PerspectiveCamera
camera有四個參數(shù)
- 第一個參數(shù)是視線輻射的角度,這個參數(shù)越大,我們能看到的視覺越廣,這個物體看上去會更小。
- 第二個參數(shù)是圖像內(nèi)容展示的比例:width/height。我們一般把這個比例設(shè)置為和畫布的比例一樣,這樣看到的圖片才不會變形。
- 第三四個參數(shù)分別是相機離展示內(nèi)容(正方體)最近的距離和最遠(yuǎn)的距離。
camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);
接下來給camera設(shè)置擺放的位置,并把camera放到場景scene中
由于我們的世界是3D的,camera的擺放位置也是三維的,涉及三個參數(shù):X軸、Y軸、Z軸。(0, 0, 0)是相機的原點,(1, 1, 5)就是把我們的相機往右和往上移動了1個單位,往后移動了5個單位。
ps: 這個時候畫布canvas的大小正好是正方體的5倍。
camera.position.set(1, 1, 5); scene.add(camera);
在場景中添加一個立方體
每個形狀都是一個mesh,geometry可以理解為物體的骨骼, material可以理解為物體的皮囊
再創(chuàng)建一個可填充的形狀cube
這樣就構(gòu)成了完整的實物
我們再將這個形狀放入場景scene中
CubeGeometry參數(shù)設(shè)置為1:1:1表示這是一個正方體,當(dāng)然可以自行修改比例,變成不一樣的立方體
var geometry = new THREE.CubeGeometry(1, 1, 1);
// 添加three自帶的最簡單的一種材質(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對圖像進行渲染
將canvas交給renderer,也就是一個渲染的容器
antialias: true 平滑,抗鋸齒,輸出的畫面會進行優(yōu)化,不會帶毛邊
renderer = new THREE.WebGLRenderer({
canvas: canvas,
antialias: true
});
// 設(shè)置renderer的樣式
renderer.setSize(canvas.width, canvas.height);
renderer.render(scene, camera);
經(jīng)過以上步驟,我們的的正方體就成功創(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 相機</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 是一個可以填充的形狀
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
renderer = new THREE.WebGLRenderer({
// 將canvas交給renderer 一個渲染的容器
canvas: canvas,
// 平滑, 抗鋸齒 輸出的畫面會進行優(yōu)化,不會帶毛邊
antialias: true
});
// 設(shè)置renderer的樣子
renderer.setSize(canvas.width, canvas.height);
renderer.render(scene, camera);
}
</script>
</body>
</html>
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
html+css+js實現(xiàn)xp window界面及有關(guān)功能
xp window界面及有關(guān)功能使用前端技術(shù)實現(xiàn)不可思議吧不夠該程序在IE調(diào)試的,其他瀏覽器可能有BUG,感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03
JavaScript canvas實現(xiàn)圍繞旋轉(zhuǎn)動畫
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實現(xiàn)圍繞旋轉(zhuǎn)動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
JavaScript Event學(xué)習(xí)第五章 高級事件注冊模型
在這一章我會講解兩種高級時間注冊模型:W3C和微軟的。因為這兩個方法都不能跨瀏覽器,所以在現(xiàn)在看來他們的使用場合并不多。2010-02-02
深入理解事件冒泡(Bubble)和事件捕捉(capture)
下面小編就為大家?guī)硪黄钊肜斫馐录芭?Bubble)和事件捕捉(capture)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
JS實現(xiàn)求數(shù)組起始項到終止項之和的方法【基于數(shù)組擴展函數(shù)】
這篇文章主要介紹了JS實現(xiàn)求數(shù)組起始項到終止項之和的方法,基于數(shù)組擴展函數(shù)實現(xiàn)該功能,涉及javascript針對數(shù)組的簡單判斷、遍歷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
JS獲取多維數(shù)組中相同鍵的值實現(xiàn)方法示例
這篇文章主要介紹了JS獲取多維數(shù)組中相同鍵的值實現(xiàn)方法,結(jié)合實例形式分析了JS數(shù)組遍歷、判斷、鍵值獲取等操作技巧,需要的朋友可以參考下2017-01-01

