threeJs基礎(chǔ)文檔

three.js基礎(chǔ)結(jié)構(gòu)

目錄

一個three.js項目至少需要的東西有——

  • [ ] scene:場景

  • [ ] camera:攝像機

  • [ ] render:渲染器

  • [ ] light:燈光

可能需要的有——

  • [ ] controls:攝像機控制器

  • [ ] raycaster:點擊射線,用于點擊事件

  • [ ] loader:加載器组去,特殊的物體例如模型需要使用加載器账胧,而且不同格式的模型需要不同的加載器

  • [ ] object:場景內(nèi)的物體對象

場景

在three.js中较鼓,場景是作為最外層容器存在的歼跟,它相當于html中的window對象鹊漠,所有three.js中的對象愧驱,都可以在scene中找到派桩。

它作為three.js的載體泼差,是一個可自定義的三維模擬空間,定義方式如下(改代碼使用MVC結(jié)構(gòu))——

initScene: function() {

        // 聲明場景

appModel.threeSceneObject.scene = new THREE.Scene();

// 可選擇呵俏,是否啟動霧化效果堆缘,參數(shù)1是霧的顏色,參數(shù)2普碎,3是霧化起始距離和最遠距離吼肥,是以場景的坐標點(0,0,0)為起始點。

appModel.threeSceneObject.scene.fog = new THREE.Fog(0xffffff, 200, 1300);

}

攝像機

    攝像機随常,或者說它是視角潜沦,同一個場景上,不同的視角看到的內(nèi)容自然會不一樣绪氛。視角和場景不一樣唆鸡,不僅僅是需要定義,還需要在渲染器`render`中枣察,進行進一步的設(shè)定争占,這里先不講,只要知道這個攝像機的“攝像功能”需要被不停的執(zhí)行序目,才能讓三維的場景看起來動作流暢臂痕。

    這個很好理解——攝像機照出來的是照片,是靜止的猿涨。但是我們看到的是場景握童,里面的內(nèi)容是可以動的,那么這要如何實現(xiàn)叛赚?自然是參考動畫的制作——連續(xù)切換的靜止圖片組成一個動圖澡绩。

    攝像機的初始化方式如下:

    // 初始化攝像機

camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);

// 設(shè)置攝像機位置

camera.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);

攝像機的伙伴,control控制器

    攝像機也是一個物體俺附,一個對象肥卡,但是一般的攝像機只能設(shè)置一些靜態(tài)屬性,如位置事镣,朝向等等參數(shù)步鉴。但是,使用control插件璃哟,我們就可以動態(tài)的操控攝像機氛琢,如:

    OrbitControls:軌道控制器,以中心點(可自定義其他的點)為圓心随闪,左右拉動場景可以使攝像機圍繞著這個中心點旋轉(zhuǎn)阳似,旋轉(zhuǎn)半徑在初始化的時候設(shè)定。

    FlyControls:飛行控制器蕴掏,第一人稱視角控制器障般,一版的PFS射擊游戲視角,可以使用asdw進行前后左右操控移動盛杰。

燈光

    場景中燈光也是必要的挽荡,沒有光,場景中的任何東西就處于“看不見”狀態(tài)即供,就像站在在一片大地上定拟,卻沒有太陽,理所當然看到的是一片漆黑逗嫡。

    燈光有三種光源青自,平行光,點光源驱证,聚光燈光源延窜。

    平行光類似于太陽光,點光源類似于燈泡抹锄,聚光燈如其名是個聚光燈逆瑞。三種光源的效果差距在于渲染物體時物體表面上的光的范圍。如果物體正對于太陽光伙单,那么它對著平行光的面上每一個部分接收到的“陽光”都是一樣的获高。而點光源在同樣情況下,光在投射到物體表面的中心點處最強吻育,然后逐漸衰弱念秧。聚光燈則處于兩者之間,在某一個照射范圍內(nèi)布疼,內(nèi)部的光可以看成是平行光摊趾,而超過這個范圍,則完全看不到缎除。         



    大部分情況下严就,點光源和平行光并沒有明顯的區(qū)別,不過在使用另一個系統(tǒng)——影子之后器罐,差距就會出來了梢为。太陽光下的影子和點光源下的影子差距還是挺大的。



    燈光的初始化如下:

    // 點光源

    var light2 = new THREE.PointLight(0xFFFFFF);

light2.position.set(6, 6, 24);

scene.add(light2);



    // 平行光

var sun1 = new THREE.DirectionalLight(0xffffff);

sun1.position.set(-1000, 500, -1000);

//sun1.castShadow = true;

appModel.threeSceneObject.scene.add(sun1);

可以看到轰坊,兩者的初始化的方式幾乎一摸一樣铸董。陽光的渲染原理其實很簡單:將陽光的顏色和物體的顏色進行融合,同時顯示面對陽光的對象的部分內(nèi)容肴沫。所以將上述代碼的光色改成紅色粟害,就會發(fā)現(xiàn)物體也會被染色。

陽光照射不到的部分會顯示黑色颤芬。

渲染器

    渲染器的核心方法只有一句:

render.render(scene, camera);

    這句話會使得整個場景的內(nèi)容刷新一次悲幅,所以這個方法需要放在requestAnimationFrame中不停地執(zhí)行套鹅。

    條用渲染器的render方法會刷新內(nèi)容,這個內(nèi)容可以是某個物體的位置移動汰具,翻轉(zhuǎn)卓鹿,變形,例如攝像機留荔,單純的物體吟孙,也可以是隨著時間而執(zhí)行的某種代碼,如添加倒計時聚蝶,時間一到便刪除某個物體杰妓。

<strong>可以說,three中所有動態(tài)活動碘勉,不管是場景視角的移動巷挥,還是物體的屬性變動,其代碼都會在這里執(zhí)行验靡。</strong>

    最基礎(chǔ)的render方法如下:

render: function() {

    render.render(scene, camera);

requestAnimationFrame(appController.render);

},

<strong> 第一行是一個render方法句各,所有的動態(tài)代碼將寫在這個方法中</strong>

<strong>第二行有兩個render,第一個render是render渲染器晴叨,第二個是渲染器內(nèi)部的方法凿宾,所以這三行的render的意義其實都不一樣。這個render傳入的是當前的場景對象和攝像機對象兼蕊,通過他們three會計算出當前場景的"截圖"</strong>

<strong>第三行使用requestAnimationFrame方法初厚,瘋狂調(diào)用render方法自身,即第一行的render孙技,達到不停的截圖产禾,串成一個動畫的效果</strong>

而render自身的初始化方法是:


// new 一個render對象

render = new THREE.WebGLRenderer({

antialias: true

});

// 設(shè)置render分辨率

render.setPixelRatio(window.devicePixelRatio);

// 設(shè)置render渲染范圍大小

render.setSize(window.innerWidth, window.innerHeight);

// 將整個three場景轉(zhuǎn)成canvas,放到id為container的div中牵啦。

document.getElementById('container').appendChild(render.domElement);

// 設(shè)置場景的渲染顏色和透明度

render.setClearColor(0xFFFFFF, 1.0);

<strong>這一段代碼優(yōu)先級非常高亚情,使用three的時候,請將其第一個初始化哈雏。</strong>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楞件,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裳瘪,更是在濱河造成了極大的恐慌土浸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彭羹,死亡現(xiàn)場離奇詭異黄伊,居然都是意外死亡,警方通過查閱死者的電腦和手機派殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門还最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓阀,“玉大人,你說我怎么就攤上這事拓轻∑窠颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵悦即,是天一觀的道長。 經(jīng)常有香客問我橱乱,道長辜梳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任泳叠,我火速辦了婚禮作瞄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘危纫。我一直安慰自己宗挥,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布种蝶。 她就那樣靜靜地躺著契耿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪螃征。 梳的紋絲不亂的頭發(fā)上搪桂,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音盯滚,去河邊找鬼踢械。 笑死,一個胖子當著我的面吹牛魄藕,可吹牛的內(nèi)容都是我干的内列。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼背率,長吁一口氣:“原來是場噩夢啊……” “哼话瞧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寝姿,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤移稳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后会油,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體个粱,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年翻翩,在試婚紗的時候發(fā)現(xiàn)自己被綠了都许。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稻薇。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胶征,靈堂內(nèi)的尸體忽然破棺而出塞椎,到底是詐尸還是另有隱情,我是刑警寧澤睛低,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布案狠,位于F島的核電站,受9級特大地震影響钱雷,放射性物質(zhì)發(fā)生泄漏骂铁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一罩抗、第九天 我趴在偏房一處隱蔽的房頂上張望拉庵。 院中可真熱鬧,春花似錦套蒂、人聲如沸钞支。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烁挟。三九已至,卻和暖如春骨坑,著一層夾襖步出監(jiān)牢的瞬間信夫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工卡啰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留静稻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓匈辱,卻偏偏與公主長得像振湾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亡脸,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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