three.js BufferGeometry

2023-02-16 17:30 更新

是面片、線或點幾何體的有效表述。包括頂點位置,面片索引、法相量、顏色值、UV 坐標(biāo)和自定義緩存屬性值。使用 BufferGeometry 可以有效減少向 GPU 傳輸上述數(shù)據(jù)所需的開銷。

讀取或編輯 BufferGeometry 中的數(shù)據(jù),見 BufferAttribute 文檔。

代碼示例

const geometry = new THREE.BufferGeometry();
// 創(chuàng)建一個簡單的矩形. 在這里我們左上和右下頂點被復(fù)制了兩次。
// 因為在兩個三角面片里,這兩個頂點都需要被用到。
const vertices = new Float32Array( [
	-1.0, -1.0,  1.0,
	 1.0, -1.0,  1.0,
	 1.0,  1.0,  1.0,

	 1.0,  1.0,  1.0,
	-1.0,  1.0,  1.0,
	-1.0, -1.0,  1.0
] );

// itemSize = 3 因為每個頂點都是一個三元組。
geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
const mesh = new THREE.Mesh( geometry, material );

例子

Mesh with non-indexed faces

Mesh with indexed faces

Lines

Indexed Lines

Particles

Raw Shaders

構(gòu)造函數(shù)

BufferGeometry()

創(chuàng)建一個新的 BufferGeometry. 同時將預(yù)置屬性設(shè)置為默認值.

屬性

.attributes : Object

通過 hashmap 存儲該幾何體相關(guān)的屬性,hashmap 的 id 是當(dāng)前 attribute 的名稱,值是相應(yīng)的 buffer。 你可以通過 .setAttribute 和 .getAttribute 添加和訪問與當(dāng)前幾何體有關(guān)的 attribute。

.boundingBox : Box3

當(dāng)前 bufferGeometry 的外邊界矩形??梢酝ㄟ^ .computeBoundingBox() 計算。默認值是 null。

.boundingSphere : Sphere

當(dāng)前 bufferGeometry 的外邊界球形??梢酝ㄟ^ .computeBoundingSphere() 計算。默認值是 null。

.drawRange : Object

用于判斷幾何體的哪個部分需要被渲染。該值不應(yīng)該直接被設(shè)置,而需要通過 .setDrawRange 進行設(shè)置。默認值為

{ start: 0, count: Infinity }

.groups : Array

將當(dāng)前幾何體分割成組進行渲染,每個部分都會在單獨的 WebGL 的 draw call 中進行繪制。該方法可以讓當(dāng)前的 bufferGeometry 可以使用一個材質(zhì)隊列進行描述。分割后的每個部分都是一個如下的表單:

{ start: Integer, count: Integer, materialIndex: Integer }

start 表明當(dāng)前 draw call 中的沒有索引的幾何體的幾何體的第一個頂點;或者第一個三角面片的索引。 count 指明當(dāng)前分割包含多少頂點(或 indices)。 materialIndex 指出當(dāng)前用到的材質(zhì)隊列的索引。通過 .addGroup 來增加組,而不是直接更改當(dāng)前隊列。

.id : Integer

當(dāng)前 bufferGeometry 的唯一編號。

.index : BufferAttribute

允許頂點在多個三角面片間可以重用。這樣的頂點被稱為"已索引的三角面片(indexed triangles)。 每個三角面片都和三個頂點的索引相關(guān)。該 attribute 因此所存儲的是每個三角面片的三個頂點的索引。 如果該 attribute 沒有設(shè)置過,則 renderer 假設(shè)每三個連續(xù)的位置代表一個三角面片。 默認值是 null。

.isBufferGeometry : Boolean

只讀標(biāo)志,用于檢查給定對象是否屬于 BufferGeometry 類型。

.morphAttributes : Object

存儲 BufferAttribute 的 Hashmap,存儲了幾何體 morph targets 的細節(jié)信息。注意:渲染幾何體后,變形屬性數(shù)據(jù)無法更改。您將必須調(diào)用 .dispose(),并創(chuàng)建 BufferGeometry 的新實例。

.morphTargetsRelative : Boolean

用于控制變形目標(biāo)行為;當(dāng)設(shè)置為 true 時,變形目標(biāo)數(shù)據(jù)被視為相對偏移,而不是絕對位置/法線。默認為假。

.name : String

當(dāng)前 bufferGeometry 實例的可選別名。默認值是空字符串。

.userData : Object

存儲 BufferGeometry 的自定義數(shù)據(jù)的對象。為保持對象在克隆時完整,該對象不應(yīng)該包括任何函數(shù)的引用。

.uuid : String

當(dāng)前對象實例的 UUID,該值會自動被分配,且不應(yīng)被修改。

方法

EventDispatcher 在該類上可用的所有方法。

.setAttribute ( name : String, attribute : BufferAttribute ) : this

為當(dāng)前幾何體設(shè)置一個 attribute 屬性。在類的內(nèi)部,有一個存儲 .attributes 的 hashmap, 通過該 hashmap,遍歷 attributes 的速度會更快。而使用該方法,可以向 hashmap 內(nèi)部增加 attribute。 所以,你需要使用該方法來添加 attributes。

.addGroup ( start : Integer, count : Integer, materialIndex : Integer ) : undefined

為當(dāng)前幾何體增加一個 group,詳見 groups 屬性。

.applyMatrix4 ( matrix : Matrix4 ) : this

用給定矩陣轉(zhuǎn)換幾何體的頂點坐標(biāo)。

.center () : this

根據(jù)邊界矩形將幾何體居中。

.clone () : BufferGeometry

克隆當(dāng)前的 BufferGeometry。

.copy ( bufferGeometry : BufferGeometry ) : this

將參數(shù)指定的 BufferGeometry 的值拷貝到當(dāng)前 BufferGeometry 中。

.clearGroups ( ) : undefined

清空所有的 groups。

.computeBoundingBox () : undefined

計算當(dāng)前幾何體的的邊界矩形,該操作會更新已有 [param:.boundingBox]。邊界矩形不會默認計算,需要調(diào)用該接口指定計算邊界矩形,否則保持默認值 null。

.computeBoundingSphere () : undefined

計算當(dāng)前幾何體的的邊界球形,該操作會更新已有 [param:.boundingSphere]。邊界球形不會默認計算,需要調(diào)用該接口指定計算邊界球形,否則保持默認值 null。

.computeTangents () : undefined

計算切線屬性并將其添加到此幾何體。僅索引幾何體支持計算,并且定義了位置、法線和 uv 屬性。使用切線空間法線貼圖時,請改用 BufferGeometryUtils.computeMikkTSpaceTangents 提供的 MikkTSpace 算法。

.computeVertexNormals () : undefined

通過面片法向量的平均值計算每個頂點的法向量。

.dispose () : undefined

從內(nèi)存中銷毀對象。如果在運行是需要從內(nèi)存中刪除 BufferGeometry,則需要調(diào)用該函數(shù)。

.getAttribute ( name : String ) : BufferAttribute

返回指定名稱的 attribute。

.getIndex () : BufferAttribute

返回緩存相關(guān)的 .index。

.hasAttribute ( name : String ) : Boolean

如果具有指定名稱的屬性存在,則返回 true。

.lookAt ( vector : Vector3 ) : this

vector - 幾何體所朝向的世界坐標(biāo)。旋轉(zhuǎn)幾何體朝向控件中的一點。該過程通常在一次處理中完成,不會循環(huán)處理。典型的用法是過通過調(diào)用 Object3D.lookAt 實時改變 mesh 朝向。

.normalizeNormals () : undefined

幾何體中的每個法向量長度將會為 1。這樣操作會更正光線在表面的效果。

.deleteAttribute ( name : String ) : BufferAttribute

刪除具有指定名稱的 attribute。

.rotateX ( radians : Float ) : this

在 X 軸上旋轉(zhuǎn)幾何體。該操作一般在一次處理中完成,不會循環(huán)處理。典型的用法是通過調(diào)用 Object3D.rotation 實時旋轉(zhuǎn)幾何體。

.rotateY ( radians : Float ) : this

在 Y 軸上旋轉(zhuǎn)幾何體。該操作一般在一次處理中完成,不會循環(huán)處理。典型的用法是通過調(diào)用 Object3D.rotation 實時旋轉(zhuǎn)幾何體。

.rotateZ ( radians : Float ) : this

在 Z 軸上旋轉(zhuǎn)幾何體。該操作一般在一次處理中完成,不會循環(huán)處理。典型的用法是通過調(diào)用 Object3D.rotation 實時旋轉(zhuǎn)幾何體。

.scale ( x : Float, y : Float, z : Float ) : this

縮放幾何體。該操作一般在一次處理中完成,不會循環(huán)處理。典型的用法是通過調(diào)用 Object3D.scale 實時旋轉(zhuǎn)幾何體。

.setIndex ( index : BufferAttribute ) : this

設(shè)置緩存的 .index。

.setDrawRange ( start : Integer, count : Integer ) : undefined

設(shè)置緩存的 .drawRange。詳見相關(guān)屬性說明。

.setFromPoints ( points : Array ) : this

通過點隊列設(shè)置該 BufferGeometry 的 attribute。

.toJSON () : Object

返回代表該 BufferGeometry 的 JSON 對象。

.toNonIndexed () : BufferGeometry

返回已索引的 BufferGeometry 的非索引版本。

.translate ( x : Float, y : Float, z : Float ) : this

移動幾何體。該操作一般在一次處理中完成,不會循環(huán)處理。典型的用法是通過調(diào)用 Object3D.rotation 實時旋轉(zhuǎn)幾何體。

Source

src/core/BufferGeometry.js


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號