欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用three.js畫一個3D立體的正方體示例代碼

 更新時間:2017年11月19日 16:21:29   作者:TeanLee  
Three.js是一個3DJavaScript庫,基于右手坐標(biāo)系,可以創(chuàng)建簡單或是比較復(fù)雜的三維圖形并應(yīng)用豐富多彩的紋理和材質(zhì),可以添加五光十色的光源,可以在3D場景中移動物體或是添加腳本動畫等等。本文介紹了利用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對圖像進(jìn)行渲染

將canvas交給renderer,也就是一個渲染的容器

antialias: true 平滑,抗鋸齒,輸出的畫面會進(jìn)行優(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,
 // 平滑, 抗鋸齒 輸出的畫面會進(jìn)行優(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)文章

  • 基于JS如何實現(xiàn)類似QQ好友頭像hover時顯示資料卡的效果(推薦)

    基于JS如何實現(xiàn)類似QQ好友頭像hover時顯示資料卡的效果(推薦)

    通過本文給大家介紹鼠標(biāo)經(jīng)過好友列表中的好友頭像時顯示資料卡的效果,非常不錯具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-06-06
  • JavaScript對象拷貝與賦值操作實例分析

    JavaScript對象拷貝與賦值操作實例分析

    這篇文章主要介紹了JavaScript對象拷貝與賦值操作,結(jié)合實例形式分析了javascript對象定義、拷貝、賦值等相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-12-12
  • JavaScript實現(xiàn)頁面定時刷新(定時器,meta)

    JavaScript實現(xiàn)頁面定時刷新(定時器,meta)

    很多朋友看到定時,很容易想到用js定時器,還有盆友用meta來設(shè)置,下面小編給大家介紹js實現(xiàn)頁面定時刷新的方法,一起看看吧
    2016-10-10
  • momentjs使用詳細(xì)說明

    momentjs使用詳細(xì)說明

    這篇文章主要介紹了momentjs詳細(xì)使用說明,使用 Moment.js 可以輕松地獲取上周、上月和前三個月的起始和結(jié)束時間,在示例中,我們傳入了 '2023-07-15',并將返回的日期信息存儲在 dateInfo 變量中,然后將其打印到控制臺上,需要的朋友可以參考下
    2023-07-07
  • echarts學(xué)習(xí)之legend點擊事件解讀

    echarts學(xué)習(xí)之legend點擊事件解讀

    這篇文章主要介紹了echarts學(xué)習(xí)之legend點擊事件解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JS獲取并操作iframe中元素的方法

    JS獲取并操作iframe中元素的方法

    JS獲取并操作iframe中元素的方法,需要的朋友可以參考一下
    2013-03-03
  • 史上最全JavaScript數(shù)組去重的十種方法(推薦)

    史上最全JavaScript數(shù)組去重的十種方法(推薦)

    這篇文章主要介紹了JavaScript數(shù)組去重的十種方法,利用元素的屬性和特性進(jìn)行不同的去重方法,并實例演示如何測試去重超大數(shù)組,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • Bootstrap模態(tài)框插件使用詳解

    Bootstrap模態(tài)框插件使用詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap模態(tài)框插件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • JavaScript操作Oracle數(shù)據(jù)庫示例

    JavaScript操作Oracle數(shù)據(jù)庫示例

    這篇文章主要介紹了JavaScript操作Oracle數(shù)據(jù)庫示例,本文使用ActiveXObject實現(xiàn)訪問Oracle數(shù)據(jù)庫,需要的朋友可以參考下
    2015-03-03
  • js實現(xiàn)axios限制請求隊列

    js實現(xiàn)axios限制請求隊列

    本文主要介紹了js實現(xiàn)axios限制請求隊列,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評論