1.three.js世界中的四大要素

一专挪、三大組件

在Three.js中,要渲染物體到網(wǎng)頁(yè)中,我們需要3個(gè)組建:場(chǎng)景(scene)寨腔、相機(jī)(camera)和渲染器(renderer)困肩。有了這三樣?xùn)|西,才能將物體渲染到網(wǎng)頁(yè)中去脆侮。

記住關(guān)建語(yǔ)句:有了這三樣?xùn)|西锌畸,我們才能夠使用相機(jī)將場(chǎng)景渲染到網(wǎng)頁(yè)上去。

創(chuàng)建這三要素的代碼如下:

var scene = new THREE.Scene();  // 場(chǎng)景
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);// 透視相機(jī)
var renderer = new THREE.WebGLRenderer();   // 渲染器
renderer.setSize(window.innerWidth, window.innerHeight);    // 設(shè)置渲染器的大小為窗口的內(nèi)寬度靖避,也就是內(nèi)容區(qū)的寬度
document.body.appendChild(renderer.domElement);

1潭枣、場(chǎng)景

在Threejs中場(chǎng)景就只有一種,用THREE.Scene來(lái)表示幻捏,要構(gòu)件一個(gè)場(chǎng)景也很簡(jiǎn)單盆犁,只要new一個(gè)對(duì)象就可以了,代碼如下:

var scene = new THREE.Scene();
var scene = new THREE.Scene();

場(chǎng)景是所有物體的容器篡九,如果要顯示一個(gè)蘋(píng)果谐岁,就需要將蘋(píng)果對(duì)象加入場(chǎng)景中。

2榛臼、相機(jī)

另一個(gè)組建是相機(jī)伊佃,相機(jī)決定了場(chǎng)景中那個(gè)角度的景色會(huì)顯示出來(lái)。相機(jī)就像人的眼睛一樣沛善,人站在不同位置航揉,抬頭或者低頭都能夠看到不同的景色。

場(chǎng)景只有一種金刁,但是相機(jī)卻又很多種帅涂。和現(xiàn)實(shí)中一樣,不同的相機(jī)確定了呈相的各個(gè)方面尤蛮。比如有的相機(jī)適合人像媳友,有的相機(jī)適合風(fēng)景,專(zhuān)業(yè)的攝影師根據(jù)實(shí)際用途不一樣产捞,選擇不同的相機(jī)醇锚。對(duì)程序員來(lái)說(shuō),只要設(shè)置不同的相機(jī)參數(shù)轧葛,就能夠讓相機(jī)產(chǎn)生不一樣的效果搂抒。

在Threejs中有多種相機(jī),這里介紹兩種尿扯,它們是:

透視相機(jī)(THREE.PerspectiveCamera)求晶、這里我們使用一個(gè)透視相機(jī),透視相機(jī)的參數(shù)很多衷笋,這里先不詳細(xì)講解芳杏。后面關(guān)于相機(jī)的那一章矩屁,我們會(huì)花大力氣來(lái)講。定義一個(gè)相機(jī)的代碼如下所示:(已經(jīng)迫不及待想看看相機(jī)的參數(shù)了爵赵,點(diǎn)這里)

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

3吝秕、渲染器

最后一步就是設(shè)置渲染器,渲染器決定了渲染的結(jié)果應(yīng)該畫(huà)在頁(yè)面的什么元素上面空幻,并且以怎樣的方式來(lái)繪制烁峭。這里我們定義了一個(gè)WebRenderer渲染器,代碼如下所示:

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

注意秕铛,渲染器renderer的domElement元素约郁,表示渲染器中的畫(huà)布,所有的渲染都是畫(huà)在domElement上的但两,所以這里的appendChild表示將這個(gè)domElement掛接在body下面鬓梅,這樣渲染的結(jié)果就能夠在頁(yè)面中顯示了。

4谨湘、添加物體到場(chǎng)景中

那現(xiàn)在绽快,我們將一個(gè)物體添加到場(chǎng)景中:

var geometry = new THREE.CubeGeometry(1,1,1); 
var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
var cube = new THREE.Mesh(geometry, material); 
scene.add(cube);

代碼中出現(xiàn)了THREE.CubeGeometry,THREE.CubeGeometry是什么東東紧阔,他是一個(gè)幾何體坊罢,幾何體由什么組成,已經(jīng)不是本課的主要內(nèi)容了寓辱,后面的課程我們會(huì)詳細(xì)的學(xué)到艘绍。不過(guò)這里你只需要知道CubeGeometry是一個(gè)正方體或者長(zhǎng)方體,究竟是什么秫筏,由它的3個(gè)參數(shù)所決定,cubeGeometry的原型如下代碼所示:

CubeGeometry(width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides)
width:立方體x軸的長(zhǎng)度

height:立方體y軸的長(zhǎng)度

depth:立方體z軸的深度挎挖,也就是長(zhǎng)度

想一想大家就明白这敬,以上3個(gè)參數(shù)就能夠確定一個(gè)立方體。

剩下的幾個(gè)參數(shù)就要費(fèi)解和復(fù)雜一些了蕉朵,不過(guò)后面我們會(huì)自己來(lái)寫(xiě)一個(gè)立方體崔涂,到時(shí)候,你會(huì)更明白這些參數(shù)的意義始衅,這里你可以將這些參數(shù)省略冷蚂。

5、渲染

終于到了最后一步汛闸,這一步做完后蝙茶,就可以該干嘛干嘛去了。

渲染應(yīng)該使用渲染器诸老,結(jié)合相機(jī)和場(chǎng)景來(lái)得到結(jié)果畫(huà)面隆夯。實(shí)現(xiàn)這個(gè)功能的函數(shù)是

renderer.render(scene, camera);

渲染函數(shù)的原型如下:

render( scene, camera, renderTarget, forceClear )

各個(gè)參數(shù)的意義是:

scene:前面定義的場(chǎng)景

camera:前面定義的相機(jī)

renderTarget:渲染的目標(biāo),默認(rèn)是渲染到前面定義的render變量中

forceClear:每次繪制之前都將畫(huà)布的內(nèi)容給清除,即使自動(dòng)清除標(biāo)志autoClear為false蹄衷,也會(huì)清除忧额。

6、渲染循環(huán)

渲染有兩種方式:實(shí)時(shí)渲染和離線(xiàn)渲染 愧口。

先看看離線(xiàn)渲染睦番,想想《西游降魔篇》中最后的佛主,他肯定不是真的耍属,是電腦渲染出來(lái)的抡砂,其畫(huà)面質(zhì)量是很高的,它是事先渲染好一幀一幀的圖片恬涧,然后再把圖片拼接成電影的注益。這就是離線(xiàn)渲染。如果不事先處理好一幀一幀的圖片溯捆,那么電影播放得會(huì)很卡丑搔。CPU和GPU根本沒(méi)有能力在播放的時(shí)候渲染出這種高質(zhì)量的圖片。

實(shí)時(shí)渲染:就是需要不停的對(duì)畫(huà)面進(jìn)行渲染提揍,即使畫(huà)面中什么也沒(méi)有改變啤月,也需要重新渲染。下面就是一個(gè)渲染循環(huán):

function render() {
    cube.rotation.x += 0.1;
    cube.rotation.y += 0.1;
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

其中一個(gè)重要的函數(shù)是requestAnimationFrame劳跃,這個(gè)函數(shù)就是讓瀏覽器去執(zhí)行一次參數(shù)中的函數(shù)谎仲,這樣通過(guò)上面render中調(diào)用requestAnimationFrame()函數(shù),requestAnimationFrame()函數(shù)又讓rander()再執(zhí)行一次刨仑,就形成了我們通常所說(shuō)的游戲循環(huán)了郑诺。

如不能理解游戲循環(huán),請(qǐng)?jiān)谶@里提問(wèn)杉武。

場(chǎng)景辙诞,相機(jī),渲染器之間的關(guān)系

Three.js中的場(chǎng)景是一個(gè)物體的容器轻抱,開(kāi)發(fā)者可以將需要的角色放入場(chǎng)景中飞涂,例如蘋(píng)果,葡萄祈搜。同時(shí)较店,角色自身也管理著其在場(chǎng)景中的位置。

相機(jī)的作用就是面對(duì)場(chǎng)景容燕,在場(chǎng)景中取一個(gè)合適的景梁呈,把它拍下來(lái)。

渲染器的作用就是將相機(jī)拍攝下來(lái)的圖片缰趋,放到瀏覽器中去顯示捧杉。他們?nèi)叩年P(guān)系如下圖所示:

關(guān)系

學(xué)習(xí)的資料和源碼我都共享到我的gitHub倉(cāng)庫(kù)中去了,大家有興趣的可以去下載,歡迎foke,clone,加星星,也算是對(duì)我的一個(gè)鼓勵(lì)吧

three學(xué)習(xí)資料的github地址
或者復(fù)制鏈接地址到瀏覽器
https://github.com/kingder-c/LearnThree.js

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陕见,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子味抖,更是在濱河造成了極大的恐慌评甜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔涩,死亡現(xiàn)場(chǎng)離奇詭異忍坷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熔脂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)佩研,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人霞揉,你說(shuō)我怎么就攤上這事旬薯。” “怎么了适秩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵绊序,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我秽荞,道長(zhǎng)骤公,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任扬跋,我火速辦了婚禮阶捆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钦听。我一直安慰自己洒试,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布彪见。 她就那樣靜靜地躺著儡司,像睡著了一般。 火紅的嫁衣襯著肌膚如雪余指。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天跷坝,我揣著相機(jī)與錄音酵镜,去河邊找鬼。 笑死柴钻,一個(gè)胖子當(dāng)著我的面吹牛淮韭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贴届,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼靠粪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜡吧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起占键,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤昔善,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后畔乙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體君仆,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年牲距,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了返咱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牍鞠,死狀恐怖咖摹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情难述,我是刑警寧澤萤晴,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站龄广,受9級(jí)特大地震影響硫眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜择同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一两入、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敲才,春花似錦裹纳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阻星,卻和暖如春朋鞍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妥箕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工滥酥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畦幢。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓坎吻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宇葱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘦真,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容