在创建并渲染至少一次 BufferGeometry 之后,我需要增加几何图形的大小。由于不可能增加属性数组的大小,我可以用新的更大的数组替换这些数组吗?
就像是
myGeometry.attributes.position.array = newPositionArray;
我已经尝试过了,并在几何图形上设置了所有 .*NeedsUpdate 字段,但我得到了一长串 WebGL 错误。THREE.js 内部有什么事情会阻止我以这种方式操作吗?
从文档。
“您可以通过预先分配更大的缓冲区然后保持不需要的顶点折叠/隐藏来模拟调整大小。”
不,但你可以伪造它(在一定程度上)。
从文档(强调我的):
关于更新 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 );