Three.js快速入門

簡介

Three.js是基于原生WebGL封裝運行的三維引擎±龋可與各種前端技術(shù)結(jié)合使用茴她。

github鏈接:GitHub - mrdoob/three.js: JavaScript 3D library.

Three.js官網(wǎng):three.js – JavaScript 3D library

由于Three.js的官方資源部署在境外服務(wù)器所以打開會非常慢存皂,這里推薦一個博客包含了Three.js的各種資源鏡像和教程文檔:http://www.yanhuangxueyuan.com/

建議一定要下載three.js的源代碼,在了解了一些基本的概念后,可以嘗試修改examples里的源代碼運行看效果旦袋,這是一種很好的學習方式骤菠。

three.js目錄結(jié)構(gòu)

three.js目錄結(jié)構(gòu)

引用方式

使用模塊引入、使用npm安裝 參考文檔

如何在本地運行Three.js(倘若你需要從外部文件里載入幾何體或是紋理貼圖疤孕,由于瀏覽器same origin policy(同源策略)的安全限制商乎,從本地文件系統(tǒng)載入外部文件將會失敗,同時拋出安全性異常祭阀。)參考文檔

核心概念

場景鹉戚,相機,渲染器专控,幾何體抹凳,材質(zhì),光源等伦腐,理解以下結(jié)構(gòu)

Three.js程序結(jié)構(gòu)

可參考文檔:Three.js快速入門—新手上路

Examples

Three.js的官方示例是非常重要的學習資源赢底,示例的命名也較規(guī)范根據(jù)名稱大概可以知道某個示例使用的技術(shù)以及實現(xiàn)的功能。

示例頁面

可基于關(guān)鍵詞搜索如

動畫類:animation柏蘑、相機類:camera幸冻、幾何體類:geometry、控制類:controls咳焚、交互點選:interactive等

圖撲代碼介紹

圖撲代碼結(jié)構(gòu)
 ├── longhui-digital-twin
       ├── js    單個js文件包含了這個模型場景用到的方法
       ├── lib    ht的源代碼類庫
       ├── storage
             ├── assets    包含模型的各個局部的.obj和.mtl文件
             ├── components    圖表洽损、ui的組件
             ├── displays    生成各個模型場景不同狀態(tài)的面板的.json文件
             ├── models    引用模型對應(yīng).obj和.mtl文件的.json文件
             ├── scenes    用于生成場景模型的.json文件
             └── symbols     各個面板圖表,以及標簽背景和數(shù)據(jù)的.json文件
       ├── index.html    仿真模型的入口文件
       └──  weldingJoint.html    3D焊口的入口文件

功能點

(以下提到的鏈接請先運行three.js項目革半,然后根據(jù)自己的端口號自行匹配碑定,最好使用8080)
以下功能點為在圖撲已有項目中拆分出來的,在實現(xiàn)時會先參考圖撲的實現(xiàn)方式督惰,利用Three.js相對應(yīng)的技術(shù)來實現(xiàn)不傅。

  1. 地圖控制(鼠標控制)
  2. 天空盒
  3. 模型點選
  4. 模型漸進顯示
  5. 模型透明效果
  6. 說明類標簽,實時數(shù)據(jù)標簽
  7. 不同格式模型文件的差異
  8. 模型拆解赏胚,安裝

1.地圖控制(MAPCONTROLS)

使用技術(shù):examples里的軌道控制(OrbitControls)
參考文檔:http://localhost:8080/docs/index.html#examples/en/controls/OrbitControls
參考示例:
http://localhost:8080/examples/?q=control#misc_controls_map
http://localhost:8080/examples/?q=control#misc_controls_orbit
關(guān)鍵點:理解OrbitControls的屬性访娶,學會自定義鼠標按鈕的相關(guān)事件

2.天空盒(SKYBOX)

1.通過場景(scene)實現(xiàn)

參考文檔:http://localhost:8080/docs/index.html#api/zh/scenes/Scene
參考示例:
http://localhost:8080/examples/#webgl_animation_cloth
http://localhost:8080/examples/#webgl_postprocessing_backgrounds
總結(jié):

  • 利用scene的 .background屬性的Color, Texture觉阅, CubeTexture可分別實現(xiàn)純色崖疤,圖像背景,立方體背景典勇,
  • CubeTexture的6張圖像需專業(yè)化處理
  • 實現(xiàn)效果與需求不一致
2.使用球形幾何體實現(xiàn)

參考圖撲代碼:longhui-digital-twin\storage\scenes\htproject_2020_q2\中油龍慧_黑河站\黑河站外景.json

天空背景代碼

參考文檔:
http://localhost:8080/docs/index.html#api/en/geometries/SphereBufferGeometry
http://localhost:8080/docs/index.html#api/en/materials/Material
關(guān)鍵點:理解材質(zhì)(material)的.side屬性

3. 模型點選

1.對象選擇

使用技術(shù):光線投射Raycaster
參考文檔:http://localhost:8080/docs/index.html#api/zh/core/Raycaster
參考示例:
http://localhost:8080/examples/#webgl_interactive_cubes
http://localhost:8080/examples/?q=interactive#webgl_interactive_cubes_ortho

2.選中效果

4. 模型漸進顯示

參考圖撲代碼:longhui-digital-twin\js\index.js

截面漸進

透明漸進

參考文檔:
材質(zhì)Material
setinterval實現(xiàn)動畫
參考示例:
http://localhost:8080/examples/?q=clip#webgl_clipping
http://localhost:8080/examples/?q=clip#webgl_clipping_advanced
總結(jié):

  1. 理解材質(zhì)對象的clippingPlanes,transparent割笙,opacity屬性
  2. 產(chǎn)生截面效果需要設(shè)置WebGLRenderer.localClippingEnabled為 true
  3. 關(guān)于setInterval實現(xiàn)動畫
    特點: 執(zhí)行速度不能保證权烧,與電腦當前狀態(tài)有關(guān)眯亦;不能在限定的時間內(nèi)達到確定的狀態(tài),或者說達到確定狀態(tài)需要的時間是不確定的般码;需要手動清除妻率。
    適用場景: 如一直閃爍的點,周期性執(zhí)行需手動關(guān)閉的動畫

5. 模型透明效果

參考文檔:http://localhost:8080/docs/index.html#api/zh/materials/Material
總結(jié):

  1. 保存所有對象材質(zhì)的 transparent板祝,opacity屬性(通過uuid做主鍵)
  2. 改變所有對象材質(zhì)的 transparent宫静,opacity屬性,提高透明度
  3. Clone需要強調(diào)對象的材質(zhì) 券时,修改transparent孤里,opacity屬性
  4. 回到初始狀態(tài)時,恢復(fù)所有對象的材質(zhì)的transparent橘洞,opacity屬性

6. 說明類標簽捌袜,實時數(shù)據(jù)標簽

圖撲實現(xiàn)效果:標簽始終面向相機,與3d模型對象具有相同的坐標體系和相機渲染效果震檩,支持動態(tài)改變數(shù)值
參考文檔:
http://localhost:8080/docs/index.html#manual/zh/introduction/Creating-text
http://www.yanhuangxueyuan.com/Three.js_course/advanced/modelTag.html

1.使用CSS 2D渲染器(CSS2DRenderer)

參考文檔:http://localhost:8080/docs/index.html#examples/zh/renderers/CSS2DRenderer
參考示例:
http://localhost:8080/examples/?q=pdb#webgl_loader_pdb
http://localhost:8080/examples/?q=css#css2d_label
http://www.yanhuangxueyuan.com/3D/liangcang/index.html
實現(xiàn)效果:與3d模型對象具有相同的坐標體系琢蛤,相機渲染效果與3d模型不同,始終面向相機抛虏,支持動態(tài)改變數(shù)值
適用場景:只顯示簡單文字的2d效果標簽

2.使用CSS 3D渲染器(CSS3DRenderer)

參考文檔:http://localhost:8080/docs/index.html#examples/zh/renderers/CSS3DRenderer
參考示例:
http://localhost:8080/examples/?q=css#css3d_periodictable
http://localhost:8080/examples/?q=css#css3d_sandbox
實現(xiàn)效果:與3d模型對象具有相同的坐標體系博其,相機渲染效果與3d模型不同,不會始終面向相機迂猴,支持動態(tài)改變數(shù)值
適用場景:直接使用css的3d屬性實現(xiàn)3d效果

3.使用精靈(Sprite)+ Canvas紋理(CanvasTexture)

參考文檔:
http://localhost:8080/docs/index.html#api/zh/objects/Sprite
http://localhost:8080/docs/index.html#api/zh/textures/CanvasTexture
https://www.w3school.com.cn/html5/html_5_canvas.asp
參考示例:
http://localhost:8080/examples/?q=sprite#webgl_points_sprites
http://localhost:8080/examples/?q=sprite#webgl_raycast_sprite
http://localhost:8080/examples/?q=canvas#webgl_materials_texture_canvas
關(guān)鍵點:每次改變canvas對象需要手動將材質(zhì)的needsUpdate屬性賦值為true慕淡,canvas的drawImage()是異步的,需要在圖片的onload回調(diào)函數(shù)中重新添加文字

實現(xiàn)效果:與3d模型對象具有相同的坐標體系沸毁,相機渲染效果與3d模型相同峰髓,始終面向相機,支持動態(tài)改變數(shù)值
適用場景:給3d模型對象添加標簽

7. 不同格式模型文件的差異

關(guān)于如何加載3d模型:參考示例里有關(guān)于loader的實現(xiàn)代碼



關(guān)于不同格式模型文件的差異參考:

8. 模型拆解息尺,安裝

場景分析:天空球 + 平面地板
管道延長線:clone對象及材質(zhì)携兵,利用對象的.scale屬性,將管道沿著x軸方向擴大20倍搂誉,并修改其材質(zhì)的transparent和opacity屬性徐紧,調(diào)整相對位置
參考文檔:
http://localhost:8080/docs/index.html#api/zh/core/Object3D
http://localhost:8080/docs/index.html#api/zh/materials/Material
動畫實現(xiàn):使用tween.js
參考文檔:
https://www.cnblogs.com/qianduanjingying/p/6155744.html
http://www.createjs.cc/tweenjs/

1.確認,把所有任務(wù)按序維護到禪道炭懊,如果有缺的自己補一下
2.每個功能點的結(jié)論并级,文字描述的,
實現(xiàn)方式侮腹,幾種嘲碧,優(yōu)缺點、適應(yīng)場景父阻,技術(shù)平臺里有對應(yīng)實現(xiàn)愈涩、demo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末望抽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子履婉,更是在濱河造成了極大的恐慌糠聪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谐鼎,死亡現(xiàn)場離奇詭異,居然都是意外死亡趣惠,警方通過查閱死者的電腦和手機狸棍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來味悄,“玉大人草戈,你說我怎么就攤上這事∈躺” “怎么了唐片?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涨颜。 經(jīng)常有香客問我费韭,道長,這世上最難降的妖魔是什么庭瑰? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任星持,我火速辦了婚禮,結(jié)果婚禮上弹灭,老公的妹妹穿的比我還像新娘督暂。我一直安慰自己,他們只是感情好穷吮,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布逻翁。 她就那樣靜靜地躺著,像睡著了一般捡鱼。 火紅的嫁衣襯著肌膚如雪八回。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天堰汉,我揣著相機與錄音辽社,去河邊找鬼。 笑死翘鸭,一個胖子當著我的面吹牛滴铅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播就乓,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼汉匙,長吁一口氣:“原來是場噩夢啊……” “哼拱烁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起噩翠,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤戏自,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伤锚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擅笔,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年屯援,在試婚紗的時候發(fā)現(xiàn)自己被綠了猛们。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狞洋,死狀恐怖弯淘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吉懊,我是刑警寧澤庐橙,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站借嗽,受9級特大地震影響态鳖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恶导,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一郁惜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甲锡,春花似錦兆蕉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缸废,卻和暖如春包蓝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背企量。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工测萎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人届巩。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓硅瞧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恕汇。 傳聞我的和親對象是個殘疾皇子腕唧,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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

  • Threejs 為什么或辖? webGL太難用,太復(fù)雜枣接! 但是現(xiàn)代瀏覽器都支持 WebGL 這樣我們就不必使用 Fla...
    強某某閱讀 6,012評論 1 21
  • 1颂暇、簡介 WebGL 是在瀏覽器中實現(xiàn)三維效果的一套規(guī)范,而 Three.js 可以看成是瀏覽器對 WebGL 規(guī)...
    風之化身呀閱讀 3,490評論 0 4
  • What is Three.js 什么是threejs但惶,很簡單耳鸯,你將它理解成three + js就可以了。thre...
    依依玖玥閱讀 1,511評論 0 2
  • three.js是JavaScript編寫的WebGL第三方庫膀曾。提供了非常多的3D顯示功能片拍。Three.js 是一...
    簡聆壹閱讀 4,977評論 1 13
  • 本文主要是講解 Three.js 的相關(guān)概念,幫助大家對 Three.js 以及相關(guān)知識形成比較完整的理解妓肢。今年來...
    Simon王小白閱讀 8,440評論 2 9