在创建BufferGeometry并至少渲染一次之后,我需要增加几何体的大小。由于无法增加属性数组的大小,我可以用新的更大的数组替换数组吗?
类似
myGeometry.attributes.position.array = newPositionArray;
我已经尝试过了,并在几何体上设置了所有。* NeedsUpdate字段,但是我得到一长串WebGL错误。在THREE.js里面有什么东西会阻止我以这种方式运作吗?
答案 0 :(得分:2)
来自文档。
“你可以通过预先分配更大的缓冲区然后保持不需要的顶点折叠/隐藏来模拟调整大小。”
答案 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 );