1.粒子(也叫精靈)
我們可以使用THREE.Sprite來手工創(chuàng)建粒子,它需要傳入唯一的參數(shù)材質(zhì)(THREE.SpriteMaterial或THREE.SpriteCanvasMaterial)
THREE.Sprite于THREE.Mesh一樣,都是THREE.Oject3D的子類,所以THREE.Sprite可以使用THREE.Mesh的大部分屬性

使用THREE.Sprite可以很容易創(chuàng)造粒子,但是創(chuàng)造大量的THREE.Sprite時,就會有嚴重的性能問題,因為每個THREE.Sprite對象都需要去管理,所以這時候就需要使用THREE.Points了,我們只需要使用THREE.points對象,就能夠?qū)崿F(xiàn)統(tǒng)一管理大量粒子
HTREE.PointsMaterial對象的所有可設(shè)置的屬性如下:
- color 粒子系統(tǒng)所有粒子的顏色
- map 可以在粒子中應(yīng)用某種材質(zhì)
- size 指定粒子大小,默認1
- sizeAnnutation 如果該屬性為false,那么所有粒子都將擁有相同尺寸,無論距離多遠,如果為true,粒子大小將取決于攝像機的遠近
- vertexColors 一般來說,THREE.Points中的粒子顏色都是相同的,如果該屬性設(shè)置為THREE.VertexColors,并且?guī)缀误w數(shù)組中的顏色也有值,那么會使用數(shù)組中定義的顏色值,默認THREE.NoColors
- opacity 定義粒子不透明底,默認1完全不透明,與transparent,配合使用
- transparent 如果設(shè)置為true,那么opacity生效
- blending 指定粒子渲染的融合程度
- fog 是否受場景中的霧化效果影響,默認true
在webGLRenderer中使用html5畫布
如果我們想要在WebGLRenderer中使用·canvas畫布,可以采用兩種方式,可以使用THREE.PointsMaterial創(chuàng)建THREE.Points對象,或者使用THREE.Sprite和THREE.SpriteMaterial的map屬性

使用紋理化粒子
圖像樣式化粒子還可以使用THREE.TextureLoader().load()函數(shù)將圖像加載為THREE.Texture對象,然后將THREE.Texture分配給材質(zhì)的map屬性
2.幾何體的組合、合并和外部模型的加載
2-1.幾何體對象的組合
當你創(chuàng)建多個網(wǎng)格對象時,你可以用THREE.Group將它們放到一個組中進行管理
當幾何體被放置在組中的時候,你可以對組進行旋轉(zhuǎn)、平移??s放操作,這樣組里的所有對象都會發(fā)生變化
旋轉(zhuǎn)的中心是組的中心點,也可以對組內(nèi)的某個對象單獨進行操作,但是需要注意的是。所有定位、旋轉(zhuǎn)、變形都是相對于父對象的
2-2.多個網(wǎng)格合并成一個網(wǎng)格
組可以管理大量網(wǎng)格,但對象·特別多的時候,性能就會到達瓶頸
因此我們可采用網(wǎng)格合并的方式,來提高的性能,但合并后的網(wǎng)格就沒法操作單個網(wǎng)格進行旋轉(zhuǎn)、移動操作
我們可以使用mergeBufferGeometries來實現(xiàn)多個mesh合并為一個mesh且可以使用多個Material
2-3.編碼時改變幾何體的位置進行合并網(wǎng)格
使用applyMatrix4()進行向量矩陣變換,applyMatrix4()是三維向量Vector的方法
2-4.從外部資源加載幾何體
three.js可以讀取幾種三維文本文件格式,并從中導(dǎo)出幾何體網(wǎng)絡(luò),支持的文件格式如下
| 格式 | 描述 |
|---|---|
| json | three.js自己的json文件格式,你可以用它來聲明你的幾何體和場景,盡管它不正式,但是非常方便你去復(fù)用復(fù)雜的場景和幾何體 |
| OBJ或MTL | obj是一種簡單的三維文件格式,由WavefrontTechnologies創(chuàng)建,它是使用最廣泛的三維文件格式,用來定義對象的幾何體。MTL文件常同obj文件一起使用,在一個mtl文件中,obj文件用來定義對象的材質(zhì),thre.js還有一個可定制的obj導(dǎo)出器,叫做OBJExporter.js,可以將three.js中的模型導(dǎo)出一個obj文件中 |
| Collada | Collada是一種用基于xml的格式定義的數(shù)字的內(nèi)容的格式,也是一種被廣泛使用的格式,三維軟件和渲染引擎都支持這種格式 |
| STL | STL是STereoLithphy(立體成型術(shù))的縮寫,廣泛用于快速成型。如三維打印機的模型文件通常是STL文件。thress.js還有一個可定制的STL導(dǎo)出器,叫做STLExporter.js,可以用來將three.js中的模型導(dǎo)出 |
| CTM | ctm是openCTM的一種文件格式,可以用來壓縮格式存儲三維網(wǎng)格的三角形面 |
| VTK | vtk是由Visualization Toolkit創(chuàng)建一種文件格式,用來指定頂點和面,vyk有兩種格式:二進制 |
| AWD | 一種用于三維場景的二進制格式,通常與away3d(away3d是falsh或flex上一個功能強大且實時的3D引擎,具有快速、高效、api清楚等優(yōu)點,但是會有三角型消失的問題)引擎一起使用,這個加載程序不支持壓縮的AWD文件 |
| Assimp | Open asset import library(也稱為Assimp)是一種導(dǎo)入各種三維模型格式的標準方法 |
| VRML | VRML(Virtual Reality Modeling Language)是一種基于文本的格式,允許定義三維對象和世界 |
| Babylon | 一個三維javascript游戲庫,它以自己內(nèi)部格式存儲模型 |
| PDB | 由Protein Data bank(蛋白質(zhì)數(shù)據(jù)銀行)創(chuàng)建,用于定義蛋白質(zhì)的形狀 |
| PLY | 這種格式的全稱是(Polygon)文件格式,通常用來保存三維掃描儀的信息 |
| TDS | Autodesk 3DS格式 |
| 3MF | 3MF是3d打印的標準格式 |
| AMF | AMF是另一種3D打印的標準格式 |
| PlayCanvas | PlayCanvas是一款基于WebGL的開源游戲引擎,three.js可以加載基于該引擎的模型并在場景中使用 |
| Draco | Draco格式可以高效的保存幾何體和點云 |
| PEWM | PRWM(Packed Raw WenGL Model)WebGL模型原始數(shù)據(jù)包,這是一種專注于高效存儲和解析3D幾何體的模式 |
| GCODE | GCODE是計算機程序與3D打印機和CNC機器通信的標準模式之一,打印模型時,計算機可以向3D打印機發(fā)送GCODE命令來控制打印機 |
| NRRD | NRRD是一種存儲體素數(shù)據(jù)的文件格式,它可以用于保存CT掃描數(shù)據(jù) |
| SVG | SVG是一種矢量圖形的標準格式,它可以被three.js加載器加載成Path對象,該對象可以被拉伸成3D幾何體,也可以被當做2D幾何體來渲染 |
2-4-1.使用JSON保存和加載模型
//保存模型,將場景中的對象轉(zhuǎn)換成json
scene.toJSON()
//將內(nèi)容轉(zhuǎn)換成JSON對象,然后使用ObjectLoader對象例的方法,將對象轉(zhuǎn)換成three.js可以識別的模型對象
let loader = new ObjectLoader()
let obj = loader.parse(json數(shù)據(jù))
2-4-2.引用obj
使用OBJLoader加載OBJ模型
注:three.js模型導(dǎo)入obj404報錯,因為iis缺少MIMI的文件映射
打開IIS,點擊MIME類型,把obj添加進去類型直接設(shè)置成text/html就可以了
3.three.js動畫
3-1.簡單動畫
通過使用requestAnimationFrame修改物體的屬性來實現(xiàn)動畫