1. 程式人生 > >Three.js入門——畫星空(star field)

Three.js入門——畫星空(star field)

http://www.wukai.me/2015/11/15/star-field/

Three.js是一個很流行的3D JavaScript庫。這裡有一個three.js的入門教程,在瀏覽器視窗中畫出星空。我按照教程重新實現了一遍,這裡的這篇部落格把教程大致翻譯了一遍。我的demo

變數

定義全域性變數:

1
2
3
4
5
6
7
8
9
10
11
// three.js的主要部分
var camera, scene, renderer,

// 跟蹤滑鼠位置
mouseX = 0, mouseY = 0,

// 一個數組,用於儲存我們的粒子
particles = [];

// 初始化
init();

初始化three.js

為了使用three.js,我們需要在init()函式中設定三個主要的物件:

  • scene(場景): 場景中包含了所有的3D物件資料
  • camera(相機): 相機有位置(position),旋轉(rotation)和視野屬性(field of view)
  • renderer(渲染器): 決定場景中的一個物體在照相機的視角看來是什麼樣子

照相機(Camera)

1
2
3
4
5
6
function init() {
    // 照相機引數
    camera = new THREE.PerspectiveCamera(80, window.innerWidth/window
.innerHeight, 1, 4000);
// 將相機向後(即螢幕外)移 camera.position.z = 1000;

Camera構造器的第一個引數是視野(field of view)。這是一個角度,越大,則表示虛擬的相機鏡片越寬。

第二個引數是輸出的寬和高之比。這個值必須與CanvasRenderer相一致。

相機只能看見一定範圍之內的物體,這個範圍是由near和far來確定的,在這裡分別為1和4000。因而任何比1近的物體或者比4000遠的物體是不會被渲染的。

在預設情況下相機位於3D世界的起始位置(origin)0,0,0(我的上一篇部落格用CSS3繪製一個旋轉的立方體中有關於origin的介紹)。但是你建立的3D物體也會放置在這一點,因而預設值用處並不大。我們需要將相機向後移動一點,即給其一個正的z值(由螢幕內指向外側)。在這裡將其移動1000。

場景(Scene)

1
2
3
// the scene contains all the 3D object data
scene = new THREE.Scene();
scene.add(camera);

注意必須將相機加入到場景中。

渲染器(Renderer)

1
2
3
4
5
6
// 加入CanvasRenderer,由渲染器決定場景中的物體看起來如何,並將其畫出
renderer = new THREE.CanvasRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);

// 將渲染器的canvas domElement加入到body中
document.body.appendChild(renderer.domElement);

這裡的CanvasRenderer建立了它自己的DOM元素,這是一個普通的2D canvas物件,我們需要把它加入到檔案的body部分才能看見它。我們想讓它充滿整個瀏覽器視窗,所以將它的大小設定為window.innerWidthwindow.innerHeight

渲染迴圈

接下來我們需要做的是產生粒子,加入滑鼠移動監聽器(mousemove listener)來追蹤滑鼠位置,最後設定間隔每秒呼叫update函式30次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    makeParticles();

    // add the mouse move listener
    document.addEventListener('mousemove', onMouseMove, false);

    // 每秒渲染30次
    setInterval(update, 1000/30);

其中的`update`函式如下:

    function update() {
        updateParticles();

        // 從相機的視角渲染場景
        renderer.render(scene, camera);
    }
```    

`updateParticles`函式會在後面加以解釋,它的作用是將粒子向前移動。

直到`renderer.render()`方法呼叫之前,你是不會看見任何3D物體的。渲染器(renderer)會把所有的東西畫到canvas上,它決定了場景中的物體在相機的視角看來是什麼樣子的。


## 粒子(Particles)

Three.js有三種主要型別的3D物件:三角形(triangles),直線(lines)和粒子(particles)。粒子表示的是3D空間中的一個點,因而最容易使用。它們可以被渲染成2D的圖片,比如一個簡單的圓或矩形,或是點陣圖圖片。關於粒子有一點很重要,它們從任何角度看起來都是一樣的,當然根據距離的遠近大小會發生變化。


## 建立粒子

```javascript
    // creates a random field of Particle object
    function makeParticles() {
        var particle, material;

        // 將z座標從-1000(最遠處)逐步增加至1000(相機所在處)
        // 每一個位置加入一個隨機的粒子
        for (var zpos = -1000; zpos < 1000; zpos += 20) {

            // 建立一個粒子材質,向其傳入顏色及我們定義的粒子渲染函式
            material = new THREE.ParticleCanvasMaterial( {
                // color: 0xffffff,
                color:   getRandomColor(),
                program: particleRender
            });

            // 建立粒子
            particle = new THREE.Particle(material);

            // 賦給它一個位於-500至500之間的隨機x和y值
            particle.position.x = Math.random() * 1000 - 500;
            particle.position.y = Math.random() * 1000 - 500;

            particle.position.z = zpos;

            // 將其放大一點
            particle.scale.x = particle.scale.y = 10;

            // 把它加入到場景中
            scene.add(particle);

            // 將粒子加入到我們的particles陣列中   
            particles.push(particle);
        }
    }

在for迴圈中zpos以20為步長從-1000增加至1000。

在迴圈中,我們建立一個新的材質(material)然後新建一個粒子。粒子有一個position屬性,它有x, y, z三個值。

我們給每一個粒子一個隨機的x和y位置,將它的z位置設定為zpos

接著將粒子加入到particles陣列中,保證能夠跟蹤所有的粒子並在update迴圈中對它們進行操作。

建立粒子材質(particle material)

所有的3D物件都有材質物件,材質定義了它們是如何畫出來的,顏色及透明度之類的屬性。我們是這樣定義的每個粒子的材質物件:

1
2
3
4
material = new THREE.ParticleCanvasMaterial( {
        color: 0xffffff,
        program: particleRender
    });

three.js並沒有內建圓形粒子材質,所以需要告訴它如何去畫一個圓。我們是通過給particleRender傳遞必要的canvas繪圖API來做到這一點的。

1
2
3
4
5
function particleRender(context) {
    context.beginPath();
    context.arc(0, 0, 1, 0, 2*Math.PI, true);
    context.fill();
}

把一個函式傳遞給材質(material)似乎有點奇怪,但這實際上是一個非常靈活的系統。它獲得了canvas上下文的引用,所以我們可以畫出任何想要的形狀。同時canvas的座標系統將會根據粒子進行縮放和平移,因此我們只需要以起點(origin)為中心畫圖即可。

對於粒子的顏色,可以選取一個固定的顏色,也可以選取隨機的顏色。

1
2
3
4
5
6
7

            
           

相關推薦

Three.js入門——星空star field

http://www.wukai.me/2015/11/15/star-field/ Three.js是一個很流行的3D JavaScript庫。這裡有一個three.js的入門教程,在瀏覽器視窗中畫出星空。我按照教程重新實現了一遍,這裡的這篇部落格把教程大致翻譯了一遍

Three.js入門創建一個場景

style api text webgl () mes utf 動畫 fun 上一面講述了向場景中添加物體對象。這一篇準備把每個功能點細細的講述一遍,一方面是為了加深自己的理解。另一方面希望能夠 幫助到有需要的人。 一、在學習WEBGL的時候,你應該先了解要創建一個WebG

three.js 入門指南敷衍一下

今天看了一本好書three.js,感覺特別適合我這種對three.js 瞭解不深的人。 其實要學習three.js,還有許多其他方面的知識要了解,例如如何繪製多邊形,如何繪製曲線,攝像機的一些基礎知識等等。 推薦一本老外的three.js指南 https://pan.baidu.com/

【帶著canvas去流浪11Three.js入門學習筆記

目錄 一. 資料推薦及建議 二. Three.js中的基本概念 三.重點筆記 四.補充示例 示例程式碼託管在:http://www.github.com/dashnowor

webGL之three.js入門3--材料篇

gmat 深度 官網 像素 face 得到 hba 根據 線框 這幾天在看李鵬程翻譯的[美]Jos Dirksen的《Three.js開發指南》,看到第八章了,現在來總結一下threejs中材料的相關知識。順帶也看完了上海交大的張雯莉出的《threejs入門指南》,我所學所

webGL之three.js入門4--ThreeJS Editor入門

希望 con 設計 loader 相關 clas cal 其他 bar 因為工作需要,要看threejs editor的源碼,順便記錄過程。 github下載的源碼目錄是這樣的 但是editor和其他文件夾內的內容的關聯的,我需要將其獨立出來並且編輯editor。 進入e

three.js的wave特效ivew官網首頁波浪特效實現

alt 使用 實現 功夫 inf 有效 訪問 顏色 index 查看效果請訪問:https://521lbx.github.io/Web3D/index.html公司的好幾個vue項目都是用ivew作為UI框架,所以ivew官網時不時就得逛一圈。每一次進首頁都會被首頁的波浪

three.js入門——先跑個旋轉的正方體

WebGl中文網看了幾篇教程,又百度了幾篇文章,頓時感覺手癢,開啟編輯器,寫個demo玩玩。 demo是寫在vue專案中的,所以首先: npm install three --save; npm install tween --save; 安裝依賴包(目前階段tween用不上,但是先一起

three.js入門系列之視角和輔助線

假設你已經建立好了three.js的開發環境(我是寫在vue專案中的),那麼接下來,從頭開始演示是如何用three.js來構建3D圖形的。(筆記本寫的程式碼,螢幕小,所以為了能夠整屏看到完整程式碼,就將字型縮小了,如果覺得看不清的,可以另行放大) 一、頁面DOM結構 正如你所見,這就是一

three.js入門系列之旋轉的圓臺、球體、正方體

先來張圖: 一、調整機位和輔助線 由上述程式碼可知,現在的機位是三維座標軸上的點(2,2,2),方框的那一句很重要,有了這一句,你將獲得上帝視角!!! 接下來新增輔助線(立體空間三軸): 這樣就添加了一個軸輔助線,由於我們是站在(2,2,2),所以看到的輔助線是這樣的: 這是一個標

three.js入門系列之光和陰影

初中物理教過我們鏡面反射和漫反射,這是由於物體的材質直接導致的。 在three.js中,由於物體的材料不同,對於光源的反應也是不一樣的,下面就讓我們一探究竟。 一、材料 據Three.js中描述,有兩種材料能對光源有所反應: 就是圖中箭頭標識的兩種材料。 二、檢驗 編輯前例,設定光源位置:

three.js入門系列之光源

首先建立場景來試驗各種光源帶來的不同效果: 一、錐形光源(聚光燈) SpotLight 接下來縮小範圍(π/7): 二、基礎光源(環境光) AmbientLight 上例中沒有新增環境光,使得周圍黑漆漆的,下面就新增環境光: 效果: 三、點光源(照射所有方向) P

three.js入門系列之材質

一、基礎網孔材料 MeshBasicMaterial 圖示(光源是(0,1,0)處的點光源): 二、深度網孔材料 MeshDepthMaterial (由於只是改了材料名,程式碼將不重複貼出) 在這裡,有必要提一下遠景相機的屬性了: 大概就是這麼個意思,下面,我們把上述兩個引

three.js入門系列之粒子系統

其實程式碼很簡單,也很容易懂(我用的是r99版本的three.js,目前網上大多數demo是60或者80的版本,其中的一些api已經廢棄,如下是r99版本支援的寫法): 注:渲染器是WebGl渲染器 如上的程式碼,你將看到如下畫面: 但是這麼多“粒子”都是正方形的啊,哪來的雪花呢,不急

Three.js入門學習

Three.js是WebGL的框架之一,對於我們學習前端3D動畫是一個非常好的幫助。 三大元件 在Three.js中,要渲染物體到網頁需要三個元件,即 場景 相機 渲染器 有了這三樣基本的東西我們才能繼續 var scene = new THREE.

three.js入門系列之匯入拓展類

先來看一下three.js包的目錄結構: 我們使用的時候,可以一次性import所有的功能,也可以按需引入,全依賴three.module.js這個檔案對three.js的功能作了模組化處理; 但是,該模組化處理的功能僅僅是引入了src下面的所有功能類,實際開發中,我們還需要拓展包(examples)

Ember.js 入門指南——控制器controller

ember new chapter5_controllers cd chapter5_controllers ember server 從本篇開始進入第五章控制器,controller在Ember2.0開始越來越精簡了,職責也更加單一——處理邏輯。 下面是準備工作。

three.js入門第一個案例

準備工作 1.運用three.js進行3d開發,其實和頁面程式設計一樣,首先需要在html檔案中引入three.js。Three.js使用面向物件的方式來構建程式,它包含3個基本物件: 場景(scene), 相機(camera), 以及一個渲染器(renderer)。 第一步: 引入three.js.

three.js 自制骨骼動畫

上一篇說了一下自制骨骼動畫,這一篇郭先生使用幀動畫讓骨骼動畫動起來。幀動畫是一套比較完善的動畫剪輯方法,詳細我的api我們就不多說了,網上有很多例子,自行查詢學習。線上案例請點選部落格原文。話不多說先上圖。 1. 初始化一些四元數 首先我們需要一些四元數,因為我們的動畫裡有很多旋轉並且幀動畫的旋轉要求是四元

Python爬蟲從入門到放棄十一之 Scrapy框架整體的一個了解

object 定義 roc encoding eth obi pipe pos 等等 這裏是通過爬取伯樂在線的全部文章為例子,讓自己先對scrapy進行一個整理的理解 該例子中的詳細代碼會放到我的github地址:https://github.com/pythonsite/