BufferGeometry を使用して地形を構成する何千もの立方体を描画していますが、立方体の 1 つの位置を変更する必要がある場合にジオメトリを更新する方法を見つけるのに苦労しています。たとえば、ジオメトリを初期化するためのこのコードがあります: (この例の更新バージョンでテストを行っています)
// 12 triangles per cube (6 quads)
var triangles = 12 * 150000;
var geometry = new THREE.BufferGeometry();
geometry.attributes = {
position: {
itemSize: 3,
array: new Float32Array( triangles * 3 * 3 ),
numItems: triangles * 3 * 3
},
normal: {
itemSize: 3,
array: new Float32Array( triangles * 3 * 3 ),
numItems: triangles * 3 * 3
},
color: {
itemSize: 3,
array: new Float32Array( triangles * 3 * 3 ),
numItems: triangles * 3 * 3
}
}
positions = geometry.attributes.position.array;
normals = geometry.attributes.normal.array;
colors = geometry.attributes.color.array;
立方体を移動しても、移動するまで移動しているようには見えません。
geometry.attributes.position.needsUpdate = true;
これにより、更新中に FPS が低下します。これを行う別の方法はありますか?1 つの立方体 (12 の三角形/36 の頂点) のみを変更する場合は、少し不必要に思えます。そうかもしれませんが、needsUpdate
実際に何ができるかは確認していません。推測すると、配列が再びシェーダーに送信されます。
ジオメトリを個別の小さな BufferGeometries に分割できると考えていましたが、それが全体的なパフォーマンスに役立つかどうかはわかりません。私が理解していることから、より多くのジオメトリ = 少ない FPS です。
誰かが私がこれを行う方法を知っているなら、それは大歓迎です! :)更新の問題に加えて、BufferGeometryはまさに私が必要としているもののようです。ありがとう!