Three.js 場景、相機、渲染(01)

前言:本篇主要是three.js的一個介紹,瞭解WebGL與three.js的關係。以及three.js的四個重要的組建。

一、什麼是WebGL?

WebGL是一項可以在瀏覽器中流暢展示3D模型和場景的一種技術。他使用JavaScript作爲編程語言,調用瀏覽器支持的3D繪製函數,來實現3D模型和場景的展現。

1.1瀏覽器爲什麼能繪製3D?

因爲瀏覽器實現了OpenGL es的規範,這套規範可以直接使用指令操作顯卡,使顯卡渲染的3D世界,直接反應到瀏覽器中。

1.2webgl能做什麼

  • 遊戲
  • 家居
  • 虛擬現實
  • 城市地圖
  • CAD製圖

1.3 WebGL與three.js的關係

three.js是一個封裝好的WebGL庫,他使WebGL的學習更爲簡單。

1.4 導入three.js

(1)直接npm

如果使用了框架,可以npm後再導入

npm install three --save

在使用的文件中引入

var THREE = require('three');
//或者
import * as THREE from 'three';

(2)單頁面中引入

首先先在官網下載好最新版本的three.js壓縮包,解壓後在build文件夾中找到three.js文件,將它複製到使用的文件夾下即可。

<script src="./js/three.js"></script>

二、四大組建

在three.js中,要渲染物體到網頁中,需要4個組建:場景、相機、渲染器、和幾何體。有了這四樣東西,才能使用相機將場景渲染到網頁上去。

2.1 場景

場景就是所有物體的容器,可以把任何想要顯示的東西,放在場景中的任何位置。

  • 在three.js中場景就只有一種
  • 用THREE.Scene來表示。

構建一個場景:

var scene = new THREE.Scene();

2.2 相機

相機決定了場景中哪個角度的景色會顯示出來。我們最終能夠在瀏覽器中看到的景象,就是相機拍攝出來的。

相機分爲兩大類

  • 透視相機
  • 正投影相機

定義相機:只要設置不同的相機參數,就能讓相機產生不一樣的效果。

var camera = new THREE.PerspectiveCamera(80,window.innerWidth/window.innerHeight,0.1,1000);

2.2.1 透視相機

透視相機:透視投影符合人們的心理習慣,即離視點近的物體大,離視點遠的物體小,遠到極點即爲消失,成爲滅點

2.2.2 正投影相機

就是遠處和近處的是一樣大。

2.3 渲染器

渲染器,決定了畫家怎麼把眼前的場景畫到屏幕上,即渲染器決定了渲染的結果應該畫在頁面的什麼元素上,並且以怎樣的方式來繪製。

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(renderer.domElement);

注意:渲染器render的DOMElement元素,表示渲染器中的畫布,所有的渲染都是畫在DOMElement上的,所以這裏的appendChild表示將這個domElement掛接在body下面,這樣渲染的結果就能夠在頁面中顯示了。

2.3.1 渲染

渲染應該使用渲染器,結合相機和場景來得到結果畫面。

renderer.render(scene,camera);
//渲染函數的原型
render(scene,camera,renderTarget,forceClear);
  • scene:前面定義的場景
  • camera:前面定義的相機
  • renderTarget:渲染的目標,默認是渲染到前面定義的render變量中
  • forceClear:每次繪製之前都將畫布的內容清除,即使自動清楚標誌autoClear爲false,也會清除。

2.3.2 實時渲染和離線渲染

實時渲染:需要不停的對畫面進行渲染,即使畫面中什麼也沒有改變,也需要重新渲染。

其中一個重要的函數就是 requestAnimationFrame(),這個函數就是然後瀏覽器去執行一次參數中的函數,再通過參數的函數去調用,就可以成爲無限循環了。

離線渲染:事先渲染好一幀一幀的圖片,然後再把圖片拼接成電影。

2.4 幾何體

幾何體,就是要顯示在場景中的對象。

三、一個栗子

一個旋轉的正方體

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>01</title>
    <script src="three.js"></script>
</head>
<body>
    <script>
        //1.創建場景
        var scene = new THREE.Scene();
        //2.創建相機
        var camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);
        //3.創建渲染器
        var renderer = new THREE.WebGLRenderer();
        //渲染器的尺寸大小
        renderer.setSize(window.innerWidth,window.innerHeight);
        //將渲染器結果掛載到body中
        document.body.appendChild(renderer.domElement);
        //4.定義一個幾何體
        //var geometry = new THREE.CubeGeometry(1,1,1);  這樣子定義正方體報錯了??
        var geometry = new THREE.BoxGeometry(1,1,1); //定義一個正方體
        var material = new THREE.MeshBasicMaterial({
    
    color:0xff0000}); //定義材質
        //定義實體,即這是最終展現出來的實體
        var cube = new THREE.Mesh(geometry,material); 
        scene.add(cube);    //將實體加到場景裏

        //將物體移動到可視位置
        camera.position.z = 5;
        function render(){
    
       //render函數執行一次就會重新繪製一次
            requestAnimationFrame(render);  //不斷去調用render這個函數
            cube.rotation.x+=0.01;  //繞x的旋轉+0.01
            cube.rotation.y+=0.01;
            renderer.render(scene,camera);  
        }
        render();
    </script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章