webGL-three.js入門筆記

webGL-demo.gif

webGL的3D世界主要由三大要素構(gòu)成:場景(scene)、相機(camera)和渲染器(renderer)咬腕,三者缺一不可欢峰。渲染的原理是:我們將創(chuàng)建的物體,添加到場景中涨共,再通過相機(可以理解為人的視角)渲染到渲染器纽帖,從而呈現(xiàn)在網(wǎng)頁中。three.js是webGL一款比較熱門的類庫举反,本文以"three.js": "^0.77.1"為例懊直,通過網(wǎng)上教程和自身實踐整理成這篇筆記。

1.場景(scene)
場景就是所有物體的容器火鼻,只需創(chuàng)建一個室囊。假設(shè)我們要顯示一個蘋果,那么就將蘋果加入到場景中即可魁索,多個物體可加入到一個場景融撞。
構(gòu)造函數(shù):

var scene = new THREE.Scene();

2.相機(camera)
相機決定了場景中哪個角度的景色會顯示出來,就像人的視角粗蔚,分為正投影相機(THREE.OrthographicCamera)和透視投影相機(THREE.PerspectiveCamera)尝偎,正投影和透視投影的區(qū)別是:透視投影有一個基本點,就是遠處的物體比近處的物體小,一般我們采用透視投影相機的情況比較多致扯。
構(gòu)造函數(shù):

//正投影相機
var camera = new THREE.OrthographicCamera(left, right, top, bottom, near, far);
//參數(shù)詳解:
//left:左平面距離相機中心點的垂直距離
//right:右平面距離相機中心點的垂直距離
//top:頂平面距離相機中心點的垂直距離
//bottom:底平面距離相機中心點的垂直距離
//near:近平面距離相機中心點的垂直距離
//far:遠平面距離相機中心點的垂直距離
//透視投影相機
var camera = new THREE.PerspectiveCamera(fov, aspect, near, far)
//參數(shù)詳解:
//視角fov:可以理解為視角的大小肤寝,如果設(shè)置為0,相當(dāng)于沒有了視角抖僵,什么也看不到鲤看;如果為180,那么可以認為你的視界很廣闊裆针,但在180度的時候刨摩,往往物體很小,因為物體在你整個可視區(qū)域中的比例變小了
//近平面near:表示近處的裁面的距離世吨,也可以認為是眼睛到近處的距離澡刹,不能為負數(shù)
//遠平面far:表示遠處的裁面的距離
//縱橫比aspect:實際窗口的縱橫比,即寬度除以高度耘婚,這個值越大罢浇,說明寬度越大

3.渲染器(renderer)
渲染器決定了渲染結(jié)果應(yīng)掛接在頁面的什么元素上,并以怎樣的方式繪制沐祷。
構(gòu)造函數(shù):

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);//設(shè)置渲染區(qū)域大小
document.body.appendChild(renderer, domElement);//渲染在domElement并掛接到body下
renderer.render(scene, camera); //將場景通過相機視角渲染出來

如果要讓物體動起來嚷闭,那么我們可以利用循環(huán)渲染:requestAnimationFrame

4.光源
光是我們看見物體的關(guān)鍵,用Light表示赖临,是所有光源的基類胞锰,底下還有很多分類,我舉幾個最常用的:

環(huán)境光:環(huán)境光是經(jīng)過多次反射惹來的光兢榨,無法確定其最初的方向嗅榕,是一種無處不在的光。環(huán)境光源放出的光線被認為來自任何方向吵聪。因此凌那,當(dāng)你僅為場景設(shè)定環(huán)境光時,所有的物體無論法向量如何吟逝,都將表現(xiàn)為同樣的明暗程度帽蝶。
構(gòu)造函數(shù):

THREE.AmbientLight(hex); //hex為一個16進制的顏色值

平行光:是一組沒有衰減的平行的光線,類似太陽光的效果

THREE.DirectionalLight(hex, intensity)

點光源:由這種光源放出的光線來自同一點块攒,且方向輻射自四面八方

THREE.PointLight(color, intensity, distance)励稳;
//color代表光的顏色
//intensity:代表光的強度,默認1.0囱井,表示100%強度的燈光
//distance:代表光的距離麦锯,從光源所在的位置,經(jīng)過distance這段距離之后琅绅,光的強度將從Intensity衰減為0,默認0.0鹅巍,表示光源強度不衰減

聚光燈:這種光源的光線從一個椎體中射出千扶,在被照射的物體上產(chǎn)生聚光的效果

THREE.SpotLight(hex, intensity, distance, angle, exponent)
//angle:聚光燈著色的角度料祠,用弧度作為單位,這個角度是和光源的方向形成的角度
//exponent:光源模型中澎羞,衰減的一個參數(shù)髓绽,越大衰減越快

5.物體
創(chuàng)建一個物體可以包含多種元素,幾何體妆绞,材質(zhì)顺呕,紋理等,創(chuàng)建一個小球的簡單示例:

let geometry =new THREE.SphereGeometry(3, 16, 16);   //球體
let material = new THREE.MeshPhongMaterial({color:0x48D1CC,specular:0xffffff,shininess:100});     //材質(zhì)
var ball = new THREE.Mesh(geometry, material); //兩者共同組成一個球體
scene.add(ball); //將球體添加至場景中

關(guān)于幾何體括饶,材質(zhì)等種類非常多株茶,具體可以參考[three.js源碼]:https://github.com/mrdoob/three.js/

6.動畫
總結(jié)上述步驟:

創(chuàng)建場景、相機图焰、渲染器
創(chuàng)建光源
創(chuàng)建物體并添加至場景中
渲染出場景

這樣就構(gòu)成了一個完整的但也是最基礎(chǔ)的流程启盛,網(wǎng)頁中能看到我們創(chuàng)造的物體,接下來說到動畫技羔,3D世界中的運動方式總結(jié)為三種:移動僵闯,旋轉(zhuǎn)和縮放。
運動是相對的藤滥,場景動起來有兩種方式:
1). 物體在坐標系中移動鳖粟,相機不動

function animate(){
  ball.position.x += 1;
  renderer.render(scene, camera);
  requestAnimationFrame(animation);
}

2). 相機在坐標系中移動,物體不動

function animate(){
  camera.position.x += 1;
  renderer.render(scene, camera);
  requestAnimationFrame(animation);
}

[demo展示中心]:https://yomonah.github.io/project/app.html#/webGL-icosahedron
[源碼]:https://github.com/yomonah/react-demo/tree/master/src/components/webGL_ball

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拙绊,一起剝皮案震驚了整個濱河市向图,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌时呀,老刑警劉巖张漂,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谨娜,居然都是意外死亡航攒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門趴梢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漠畜,“玉大人,你說我怎么就攤上這事坞靶°灸” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵彰阴,是天一觀的道長瘾敢。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么簇抵? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任庆杜,我火速辦了婚禮,結(jié)果婚禮上碟摆,老公的妹妹穿的比我還像新娘晃财。我一直安慰自己凹髓,他們只是感情好臊恋,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布个束。 她就那樣靜靜地躺著趴泌,像睡著了一般是钥。 火紅的嫁衣襯著肌膚如雪杀狡。 梳的紋絲不亂的頭發(fā)上锈嫩,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天衍慎,我揣著相機與錄音屑宠,去河邊找鬼厢洞。 笑死,一個胖子當(dāng)著我的面吹牛典奉,可吹牛的內(nèi)容都是我干的躺翻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卫玖,長吁一口氣:“原來是場噩夢啊……” “哼公你!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起假瞬,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陕靠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脱茉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剪芥,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年琴许,在試婚紗的時候發(fā)現(xiàn)自己被綠了税肪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡榜田,死狀恐怖益兄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箭券,我是刑警寧澤净捅,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站辩块,受9級特大地震影響蛔六,放射性物質(zhì)發(fā)生泄漏荆永。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一国章、第九天 我趴在偏房一處隱蔽的房頂上張望屁魏。 院中可真熱鬧,春花似錦捉腥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坏匪,卻和暖如春拟逮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背适滓。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工敦迄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凭迹。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓罚屋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗅绸。 傳聞我的和親對象是個殘疾皇子脾猛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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

  • 本文主要是講解 Three.js 的相關(guān)概念,幫助大家對 Three.js 以及相關(guān)知識形成比較完整的理解鱼鸠。今年來...
    Simon王小白閱讀 8,454評論 2 9
  • 之前用qunee做了一個2.5d的機房監(jiān)控猛拴,丑的閃瞎我的卡姿蘭大眼,后來含淚用three.js做個3d的換...
    我得有妖氣閱讀 1,593評論 1 2
  • 385張定金單蚀狰,離目標差一點點愉昆,不過已經(jīng)很完美,睡覺了麻蹋。明天有活了跛溉。
    羅召偉閱讀 195評論 1 5
  • 看到這個題目,大家可能都知道哥蔚,這一期的寫作群又要接近尾聲了倒谷。 今天想說的是,如果沒有人喝彩糙箍,你還會堅持寫下去么渤愁? ...
    文曉玲閱讀 353評論 14 14
  • 蒼翠的野地上一座石橋。 一個孩子站著深夯。他望著流水抖格。 遠處:一匹馬诺苹,背拖善一抹夕陽。 它靜靜地飲水雹拄, 鬃毛散落在河中...
    東豐林波閱讀 146評論 0 1