在Three.js中,是否可以在不创建新几何的情况下替换BufferGeometry的属性数组?

时间:2013-05-02 13:53:23

标签: three.js webgl

在创建BufferGeometry并至少渲染一次之后,我需要增加几何体的大小。由于无法增加属性数组的大小,我可以用新的更大的数组替换数组吗?

类似

myGeometry.attributes.position.array = newPositionArray;

我已经尝试过了,并在几何体上设置了所有。* NeedsUpdate字段,但是我得到一长串WebGL错误。在THREE.js里面有什么东西会阻止我以这种方式运作吗?

2 个答案:

答案 0 :(得分:2)

来自文档。

“你可以通过预先分配更大的缓冲区然后保持不需要的顶点折叠/隐藏来模拟调整大小。”

https://github.com/mrdoob/three.js/wiki/Updates#geometries

答案 1 :(得分:0)

不。但您可以伪造它(一定程度上)。

来自the documentation(重点是我):

  

关于更新BufferGeometries,最重要的要了解的是您不能调整缓冲区的大小(这非常昂贵,基本上等同于创建新的几何体)。 但是,您可以更新缓冲区的内容。这意味着,如果您知道BufferGeometry的属性将增长,则...您必须预先分配足够大的缓冲区以容纳可能包含以下内容的新顶点:创建。当然,这也意味着您的BufferGeometry将有一个最大的大小-无法创建可以无限期有效扩展的BufferGeometry。

因此,通过预先分配超出您需要的数量,然后仅绘制当前填充的零件(以保持性能),就可以实现所需的结果。

代码示例(来自同一文档)

var MAX_POINTS = 500;

// geometry
var geometry = new THREE.BufferGeometry();

// attributes
var positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );

// draw range
var drawCount = 2; // draw the first 2 points, only
geometry.setDrawRange( 0, drawCount );

// material
var material = new THREE.LineBasicMaterial( { color: 0xff0000, linewidth: 2 } );

// line
var line = new THREE.Line( geometry,  material );
scene.add( line );

然后在添加新的点信息之后进行更新:

line.geometry.setDrawRange( 0, newValue );