three.js入門基本知識,教你十分鐘做出一個旋轉的圖形

three.js入門基本知識,教你十分鐘做出一個旋轉的圖形。

three.js是一款webGL框架,由於其易用性被廣泛應用。如果你要學習webGL,拋棄那些複雜的原生接口從這款框架入手是一個不錯的選擇。
Three.js的六個基本步驟
1.設置three.js渲染器 (定義全局變量 var renderer)
2.設置攝像機camera
3.設置場景scene
4.設置光源light
5.設置物體object
6.書寫主函數執行以上五步
接下來針對每個步驟進行解釋:
1.設置three.js渲染器
三維空間裏的物體映射到二維平面的過程被稱爲三維渲染。 一般來說我們都把進行渲染操作的軟件叫做渲染器。
以下是主體html代碼:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>webglchina.cn</title>
<style>
 .webgl{width: 800px;height: 600px;background: #ccf;}
</style>
<script src="Three.js" type="text/javascript"></script>
</head>
<body>
 <div id="webgl" class='webgl'></div>
</body>
</html>

接下來針對每個步驟進行解釋:
1.設置three.js渲染器
三維空間裏的物體映射到二維平面的過程被稱爲三維渲染。 一般來說我們都把進行渲染操作的軟件叫做渲染器。
先來看以下代碼

`var webgl = document.getElementById('webgl');
var renderer;//定義一個全局變量renderer(含義:渲染)
function initThree(){
 //獲取畫布的寬高
 width = webgl.clientWidth;
 height = webgl.clientHeight;
 //生成渲染器對象(屬性:抗鋸齒效果爲設置有效)
 renderer = new THREE.WebGLRenderer({antialias:true});
 //指定渲染器的高寬(和畫布框大小一致)
 renderer.setSize(width, height );
 //將創建的canvas元素(此處的canvas元素爲three.js創建)添加到html文檔當中
 webgl.appendChild(renderer.domElement);
 //設置渲染器的清除色
 renderer.setClearColorHex(0xFFFFFF,1.0);
}`

代碼中書寫的幾個步驟就是我們要注意的幾個步驟
(1) 聲明全局變量(對象);
(2) 獲取畫布高寬;
(3) 生成渲染器對象(屬性:抗鋸齒效果爲設置有效);
(4) 指定渲染器的高寬(和畫布框大小一致);
(5) 追加【canvas】元素到id名爲webgl的這個元素中;
(6) 設置渲染器的清除色(clearColor)。

在此對渲染器進行一下介紹:
three.js文檔中渲染器的分支如下:
Renderers
CanvasRenderer
DOMRenderer
SVGRenderer
WebGLRenderer
WebGLRenderTarget
WebGLRenderTargetCube
WebGLShaders
可以看到three.js提供了很多的渲染方式,我們選擇的當然是WebGLRenderer,但我們這裏要將CanvasRenderer與WebGLRenderer兩種渲染方式做一個比較。
把WebGL渲染器:
renderer=new THREE.WebGLRenderer();
替換爲Canvas渲染器:
renderer=new THREE.CanvasRenderer();
這樣canvas就會以2d的方式渲染,以下是效果對比(前者用WebGLRenderer渲染):
這裏寫圖片描述
很明顯,WebGL在渲染效果上更勝一籌,WebGL的渲染能夠最大程度表現你製作精美的場景,如果你的設備支持它,這個渲染器具有比CanvasRenderer更好的性能,相反地,CanvasRenderer則具有更好的兼容性。
在此針對渲染器的參數進行詳細介紹:

renderer=new THREE.WebGLRenderer({
      antialias:true,//antialias:true/false是否開啓反鋸齒
      precision:"highp",//precision:highp/mediump/lowp着色精度選擇
      alpha:true,//alpha:true/false是否可以設置背景色透明
      premultipliedAlpha:false,//?
      stencil:false,//?
      preserveDrawingBuffer:true,//preserveDrawingBuffer:true/false是否保存繪圖緩衝
      maxLights:1//maxLights:最大燈光數
});

WebGLRenderer()中有一些參數我們可以設置,以下這些參數來自於官方文檔:
antialias:
  值:true/false
  含義:是否開啓反鋸齒,設置爲true開啓反鋸齒。
precision:
  值:highp/mediump/lowp
  含義:着色精度選擇。
alpha:
  值:true/false
  含義:是否可以設置背景色透明。
premultipliedAlpha:
  值:true/false
  含義:?
stencil:
  值:true/false
  含義:?
preserveDrawingBuffer:
  值:true/false
  含義:是否保存繪圖緩衝,若設爲true,則可以提取canvas繪圖的緩衝。
maxLights:
  值:數值int
  含義:最大燈光數,我們的場景中最多能夠添加多少個燈光。

接下來,繼續講解第二步:設置相機
OpenGL(WebGL)中、三維空間中的物體投影到二維空間的方式中,存在透視投影和正投影兩種相機。 透視投影就是、從視點開始越近的物體越大、遠處的物體繪製的較小的一種方式、和日常生活中我們看物體的方式是一致的。 正投影就是不管物體和視點距離,都按照統一的大小進行繪製、在建築和設計等領域需要從各個角度來繪製物體,因此這種投影被廣泛應用。在 Three.js 也能夠指定透視投影和正投影兩種方式的相機。 在此設置透視投影方式。

/*
*設置相機
*/
var camera;
function initCamera() {
 camera = new THREE.PerspectiveCamera(45,width/height,1,10000);
 //此處爲設置透視投影的相機,默認情況下,相機的上方向爲Y軸,右方向爲X軸,沿着Z軸垂直朝裏(視野角:fov; 縱橫比:aspect; 相機離視最近的距離:near; 相機離視體積最遠距離:far)
 camera.position.x = 400;//設置相機的位置座標
 camera.position.y = 0;
 camera.position.z = 0;
 //設置相機的上爲z軸方向
 camera.up.x = 0;
 camera.up.y = 0;
 camera.up.z = 1;
 //設置視野的中心座標
 camera.lookAt({x:0, y:0, z:0});
} 

基本步驟爲:
(1) 聲明全局的變量(對象);
(2) 設置透視投影的相機;
(3) 設置相機的位置座標;
(4) 設置相機的上爲「z」軸方向;
(5) 設置視野的中心座標。

3.設置場景scene
場景就是一個三維空間。 用 [Scene] 類聲明一個叫 [scene] 的對象。
/*
*設置場景,所有的元素只有在添加到場景當中之後才能夠生效
*/
var scene;
function initScene() {
scene = new THREE.Scene();
}
4.設置光源
OpenGL(WebGL)的三維空間中,存在點光源和聚光燈兩種類型。 而且,作爲點光源的一種特例還存在平行光源(無線遠光源)。另外,作爲光源的參數還可以進行 [環境光] 等設置。 作爲對應, Three.js中可以設置 [點光源(Point Light)] [聚光燈(Spot Light)] [平行光源(Direction Light)],和 [環境光(Ambient Light)]。 和OpenGL一樣、在一個場景中可以設置多個光源。 基本上,都是環境光和其他幾種光源進行組合。 如果不設置環境光,那麼光線照射不到的面會變得過於黑暗。 首先按照下面的步驟設置平行光源,在這之後還會追加環境光。
(1) 聲明全局變量(對象)
(2) 設置平行光源
(3) 設置光源向量
(4) 追加光源到場景

/*
*設置光源
*/
var light;
function initLight() {
 light = new THREE.DirectionalLight(0x0000FF,1.0,0);//設置平行光DirectionalLight
 light.position.set(50,50,50);//光源向量,即光源的位置
 //還可以添加多個光源,多行註釋中即爲添加2、3號光源
 /*light2 = new THREE.DirectionalLight(0xFF00CC,1.0,0);
 light2.position.set(0,50,0);
 light3 = new THREE.DirectionalLight(0x0000CC,1.0,0);
 light3.position.set(50,0,0);*/
 scene.add(light);//追加光源到場景
 /*scene.add(light2);
 scene.add(light3);*/
}

5.設置物體object

/*
*設置物體
*/
var cube=Array();
function initObject() {
 for(var i=0;i<4;i++){
  cube[i]=new THREE.Mesh(//mesh是three.js的一個類
   new THREE.CubeGeometry(50,50,50),//形狀 (寬 高 深度)
   new THREE.MeshLambertMaterial({color:0x0000FF})//材質
  );
  scene.add(cube[i]);
  cube[i].position.set(0,-120+80*i,0);
 }
}

在此繪製了4個立方體
7、如何讓物體旋轉起來(調用函數來了)

/*
*旋轉
*/
var t=0;
function loop(){
 t++;
 renderer.clear();
 cube[0].rotation.set(t/100,0,0);
 cube[1].rotation.set(0,t/100,0); 
 cube[2].rotation.set(0,0,t/100);
 /*camera.position.x = 400*Math.cos(t/100);
 camera.position.y = 400*Math.sin(t/200);
 camera.position.z = 50*Math.cos(t/100);*/
 camera.lookAt( {x:0, y:0, z:0 } );
 renderer.render(scene,camera);
 window.requestAnimationFrame(loop);
}

註釋當中表示的是相機的旋轉,可以去掉看看效果
將所有上面設置好的函數進行執行

/*
*執行
*/
function threeStart() {
 initThree();
 initCamera();
 initScene();
 initLight();
 initObject();
 loop();
 renderer.clear();
 renderer.render(scene,camera);
}

所有代碼總結

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>webglchina.cn</title>
<style>
#webgl{
 background: #ccc;
 width: 800px;
 height: 600px;
}
</style>
<script src="Three.js" type="text/javascript"></script>
<script type="text/javascript">
 var renderer;//聲明一個全局變量
 /*
 *構建基本畫布 渲染器
 */
 function initThree() {
  width = document.getElementById('webgl').clientWidth;
  height = document.getElementById('webgl').clientHeight;
  renderer = new THREE.WebGLRenderer({antialias:true});//生成渲染器對象,屬性:鋸齒效果設爲true
  renderer.setSize(width,height);//設置渲染器的寬和高,和畫布大小一致
  document.getElementById('webgl').appendChild(renderer.domElement);//追加canvas元素到webgl元素當中
  renderer.setClearColorHex(0xFFFFFF,1.0);//設置渲染器的清除色
 }
 /*
 *設置相機
 */
 var camera;
 function initCamera() {
  camera = new THREE.PerspectiveCamera(45,width/height,1,10000);
  //此處爲設置透視投影的相機,默認情況下,相機的上方向爲Y軸,右方向爲X軸,沿着Z軸垂直朝裏(視野角:fov; 縱橫比:aspect; 相機離視最近的距離:near; 相機離視體積最遠距離:far)
  camera.position.x = 400;//設置相機的位置座標
  camera.position.y = 0;
  camera.position.z = 0;  
  //設置相機的上爲y軸方向
  camera.up.x = 0;
  camera.up.y = 1;
  camera.up.z = 0;
 } 
 /*
 *設置場景,所有的元素只有在添加到場景當中之後才能夠生效
 */
 var scene;
 function initScene() {
  scene = new THREE.Scene();
 }
 /*
 *設置光源
 */
 var light;
 function initLight() {
  light = new THREE.DirectionalLight(0x0000FF,1.0,0);//設置平行光DirectionalLight
  light.position.set(50,50,50);//光源向量,即光源的位置
  scene.add(light);//追加光源到場景
 }

 /*
 *設置物體
 */
 var cube=Array();
 function initObject() {
  for(var i=0;i<4;i++){
   cube[i]=new THREE.Mesh(//mesh是three.js的一個類
    new THREE.CubeGeometry(50,50,50),//形狀 (寬 高 深度)
    new THREE.MeshLambertMaterial({color:0x0000FF})//材質
   );
   scene.add(cube[i]);
   cube[i].position.set(0,-120+80*i,0);
  }
 }
 /*
 *旋轉
 */
 var t=0;
 function loop(){
  t++;
  renderer.clear();
  cube[0].rotation.set(t/100,0,0);
  cube[1].rotation.set(0,t/100,0); 
  cube[2].rotation.set(0,0,t/100);
  camera.lookAt( {x:0, y:0, z:0 } );
  renderer.render(scene,camera);
  window.requestAnimationFrame(loop);
 }
 /*
 *執行
 */
 function threeStart() {
  initThree();
  initCamera();
  initScene();
  initLight();
  initObject();
  loop();
  renderer.clear();
  renderer.render(scene,camera);
 }
 /*
 *如果想讓立體圖形進行循環運動,需要使用到loop
 *首先創建渲染器、相機、場景、光源、物體以及最後的執行
 *只需要添加loop函數
 var t=0;
 function loop(){
  t++;
  cube.rotation.set(t/100,0,0);
  renderer.clear();
  renderer.render(scene,camera);
  window.requestAnimationFrame(loop);
 }
 */
</script>
</head>
<body onload="threeStart();">
 <div id="webgl"></div>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章