Javascript 如何在ThreeJS中高效地更新几何体的拓扑?
我希望避免创建新的类型化数组和随后的gc()。 我使用BufferedGeometry制作了几何图形。收到事件后,将更新我的顶点和Javascript 如何在ThreeJS中高效地更新几何体的拓扑?,javascript,three.js,typed-arrays,Javascript,Three.js,Typed Arrays,我希望避免创建新的类型化数组和随后的gc()。 我使用BufferedGeometry制作了几何图形。收到事件后,将更新我的顶点和面索引。我可以通过设置verticesNeedUpdate来更新坐标,但它不会更新面。每秒更新约20-50次,这可能会对浏览器造成很大影响。如何避免为JavaScript垃圾收集器创建大量垃圾来实现这一点?(请参阅下面的方法update()) 我想做的几乎是动画,或者是动态几何体(使用行进立方体计算)。但是我的拓扑(网格图)也被更新了。我应该使用哪个ThreeJS类?
面
索引。我可以通过设置verticesNeedUpdate
来更新坐标,但它不会更新面。每秒更新约20-50次,这可能会对浏览器造成很大影响。如何避免为JavaScript垃圾收集器创建大量垃圾来实现这一点?(请参阅下面的方法update()
)
我想做的几乎是动画,或者是动态几何体(使用行进立方体计算)。但是我的拓扑(网格图)也被更新了。我应该使用哪个ThreeJS类?如果不存在这样的类,我是否应该创建一个新类,如
UpdateableBufferedGeometry
?如果需要效率,应该创建BufferGeometry
而不是Geometry
您可以使用此示例的源代码作为参考:
要在渲染后更新
THREE.BufferGeometry
,可以使用以下模式:
geometry.attributes.position.setXYZ( index, x, y, z );
geometry.attributes.position.needsUpdate = true;
对于索引的BufferGeometry
,可以按如下方式更改索引的数组:
geometry.index.array[ index ] = value;
geometry.index.needsUpdate = true;
不能调整缓冲区的大小,只能更改其内容。您可以预先分配较大的阵列并使用
geometry.setDrawRange( 0, numVertices );
three.js r.78直接更新缓冲几何体
。不要为此而实例化几何体
。谢谢。你能在@MrDoob的回答下面看到我的评论吗?我有一个问题。当我直接更新它时(见下文),更改不会反映在屏幕上。只有当我用它做几何体的时候。添加网格时,如果执行以下操作,则在下一个渲染器中我看不到网格中的任何视觉变化。render()。我这样做:重用了_geometry.attributes.position[4]+=20
重用的_geometry.index.array[2]=9代码>即使移除网格并从同一几何体对象实例创建另一个网格,它也不会在屏幕上更新。我的目的是避免在动画循环中实例化缓冲区几何体@WestLangleyI从BufferGeometry派生了一个名为MyBufferGeometry77的类(参见主代码)。也许我做错了,例如,我应该实现一个虚拟方法?如果我“如果使用索引缓冲区几何体,则无法更改索引数组”,那么解决方案是什么?(@mrdoob)。为此目的在ThreeJS中创建一个新类?我可以做一个拉请求。对不起。正确答案。完美!我确实需要使用setDrawRange()
,以便使用不同数量的三角形重用同一对象。在我的测试中,似乎甚至不需要设置needsUpdate
(两者)。r77I有一个问题:在部分更新之后,如您的示例所示,是将整个缓冲区上载到GPU,还是仅将更新范围上载到GPU?全部,但您可以通过设置attribute.setDynamic(true)
和设置attribute.updateRange
进行部分更新。例如,请参见。
geometry.index.array[ index ] = value;
geometry.index.needsUpdate = true;
geometry.setDrawRange( 0, numVertices );