WEBGL學習筆記(一):創建場景


游戲已經做好,但是博客園不能支持哈,我在我的獨立博客里面加入了這個游戲。

 

加載時候會黑屏,等待數秒即可,點擊這里體驗試玩:FlappyBird3d游戲試玩

 

 

初衷:最近在學習webgl,翻譯一下用戶幫助文檔,希望對大家有所幫助!
(進了一個什么webgl中文網的qq群,問了一個問題,一句話能解決的就是拖着你,最后說沒時間為你解答,真是醉了,罵了兩句人就走人了,老子自己來!為什么罵人?因為不爽)
好了,不開心的事情不說了,開始翻譯:-D。

 

制造一個場景(scene)

這節的目標就是大致介紹一下Three.js,我們從建立場景scene開始,場景中由一個旋轉的立方體cube,最下面是一個例子,可以給你研究研究,萬一你卡住了或者需要幫助就看看吧!
 

我們開始之前(還有前戲...)

 

 

 

我們開始使用Three.js之前, 你需要顯示它。 保存下面的html到你的電腦上, 同時復制一份 three.js 在 js/ 目錄中,打開我們的瀏覽器(其實就是打開html唄!)
<!DOCTYPE html> 

<html>

<head>

<meta charset=utf-8>

<title>My first Three.js app</title>

<style> body { margin: 0; } canvas { width: 100%; height: 100% } </style>

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

<script> // Our Javascript will go here. </script> </body> </html>

 


就這樣!,下面所與的code都放進空的 <script> 標簽里就行了!(下面就都是js了)
 

創建場景(Creating the scene)

 

 

 

為了實際上能夠顯示所有的東西,我們需要3個東西:場景scene, 相機camera, 渲染器renderer;
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 );

我們來花些時間解釋一下這里在做什么。我們現在新建(new)了一個場景scene,一個 相機camera,一個 渲染器renderer。在three.js中有好幾種不同的相機,現在我們使用透視相機PerspectiveCamera

 

PerspectiveCamera( 視角(0~180),  寬高比, 近平面, 遠平面);

視角就像人眼睛睜開的大小。

寬高比就是4:3,16:9是什么的,你買顯示器應該懂,寬高比不合適可能會導致圖像變形。就好像你用寬屏顯示器播放老電影那種感覺!(一般就是寬除以高就行了!,除非你想搞big news!→_→)

近平面,遠平面,就是你設置的,超過遠平面的物體就不渲染了!近平面也是。(就是說只能看見中間的啦,人的眼睛太遠了不也看不清嗎:-D),現在不用管這些!看看原文怎么說的!

 

You don't have to worry about this now, but you may want to use other values in your apps to get better performance.(好吧我只是不知道怎么翻譯了/(ㄒoㄒ)/~~)

 

接下來就是渲染器了renderer,這里就是魔法發生的地方(好能吹),和我們使用的WebGLRenderer一起,還有別的,用來舊的瀏覽器或者其他因為某些原因不具備webgl的瀏覽器准備的。(都是廢話)

我們在創建渲染器renderer對象的同時,我們需要決定設定我們呈現app的尺寸(嗯,尺寸~)。我們就用寬和高定義了呈現(或者叫渲染,都一樣嘛~)的尺寸,這非常好(自賣自誇,不過好像還不錯?)。

這個示例里,我們就用瀏覽器的寬度和高度。對於弱雞配置的電腦,你也可以考慮使用小尺寸,比如( window.innerWidth/2window.innerHeight/2) 這樣就是屏幕的一半了(廢話!)
 
如果你希望保持你的app的尺寸, 但是還想要流場什么的(想多了吧~), 你可以調用 setSizeupdateStyle設為false. 例如 setSize(window.innerWidth/2, window.innerHeight/2, false)
那么這樣你的app就用一半的分辨率,還可以全屏顯示!(這什么鬼( ⊙ o ⊙ )啊!)
最后呢,我們把渲染器render添加到html文檔中,在<canvas>中顯示渲染的場景。
 
所有的一切都很好啊!但是你說的立方體在哪呢?我們現在加上它(這自問自答也沒說了啊) "That's all good, but where's that cube you promised?" Let's add it now.
 
var geometry = new THREE.BoxGeometry( 1, 1, 1 ); 

var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );

var cube = new THREE.Mesh( geometry, material );

scene.add( cube );

camera.position.z = 5;

 

為了建立一個立方體,我們需要使用BoxGeometry. 這是一個包含立方體的點(vertices) 和面(faces)的對象。我們將來再好好展開說它。(哎呦喂)

除了幾何,還有材質,Three.js有好幾種不同的材質,但是我們現在還是用 MeshBasicMaterial吧,所有材質都用對象的屬性的形式應用到幾何上,為了簡單(原文是非常簡單~),我們這里就用顏色材質, 0x00ff00,沒錯就是綠色。這和css或者ps中使用的是一樣的顏色格式。
(普及一下16進制顏色和rgb的區別,256=FF;16進制的FF就是256(算錯了么?!), 0x00ff00=rgb(0,256,0),前面那個0x是透明度吧,反正我不改就是了)
 
還有就是網格mesh了,網格就是我提的幾何結構,我們需要把材質應用到網格上面(就是貼圖唄),然后把網格放到場景中,在附近自由的移動(現在並不能移動啊,扯什么蛋呢)。
 
默認的, 當我們調用 scene.add()方法,幾何結構就放在 (0,0,0),這可能到之擋住攝像機了,我們就把攝像機往外挪一點。(薛之謙:別當我鏡頭啊喂!)

 

渲染場景

 

 

 

如果你把之前的html副本放到文件里打開,你就會發現什么都沒有!(哦,好神奇!)這是因為我們還沒有渲染呢(忽略廢話保智商→。→),要渲染我們需要調用一個渲染循環 render loop.
function render() { 
requestAnimationFrame( render );
renderer.render( scene, camera );
}

render();

 

(不就是寫了一個所謂的渲染循環,然后調用了一下嗎)

這會產生一個循環,讓渲染器1秒渲染60次(渲染器辛苦了!)
如果你是做瀏覽器游戲的新手, 你可能會問 " 為什么不用setInterval? 事實上- 我們可以,但是 requestAnimationFrame 有許多優點. 也許最重要的一個就是當用戶去別的頁面之后他會自己暫停,這樣就不會浪費性能和電池拉!(就是說你還是太嫩了!too young!)
 
 

讓立方體動起來(Animating the cube)

 

 

 

着這之前,你把之前所有的代碼都插入了文件中,你應該能看見一個綠色的箱子(box). 讓我們來轉動它!
在調用的 renderer.render 下面你添加下面的功能:
 
cube.rotation.x += 0.1; 
cube.rotation.y += 0.1;

 

 

這將會在60秒一次的框架內運行, 給立方體cube一個漂亮的旋轉動畫. 基本上,你現在app上想做的任何移動或者改變都要在render loop中來寫(好吧,還是挺有用的),當然你也可以在這里呼叫其他的函數,這樣你就不用在render函數里面寫的太多了。
 

結果

 

 

 

祝賀! 你已經完成了你的第一個Three.js應用(第一次沒了)。它很簡單, 你要帶別處去試試。
下面是全部的代碼.看看吧,好好理解一下!
<html> 

<head>

<title>My first Three.js app</title>

<style> body { margin: 0; } canvas { width: 100%; height: 100% } </style>

</head>

<body>

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

<script> 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 ); var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material ); scene.add( cube );
camera.position.z = 5; var render = function () { requestAnimationFrame( render );
cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); };
render();
</script>

</body>
</html>

 

by 早一步是財富 2016年7月7日12:16:56


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM