1

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

就像是

myGeometry.attributes.position.array = newPositionArray;

我已经尝试过了,并在几何图形上设置了所有 .*NeedsUpdate 字段,但我得到了一长串 WebGL 错误。THREE.js 内部有什么事情会阻止我以这种方式操作吗?

4

2 回答 2

1

从文档。

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

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

于 2013-06-17T06:23:50.440 回答
1

不,但你可以伪造它(在一定程度上)。

文档(强调我的):

关于更新 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 );
于 2018-07-16T18:59:45.937 回答