首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ThreeJS中有效地更新几何拓扑?

如何在ThreeJS中有效地更新几何拓扑?
EN

Stack Overflow用户
提问于 2016-06-20 16:03:40
回答 2查看 1.2K关注 0票数 1

我希望避免创建新的类型化数组和相应的gc()。我用BufferedGeometry做了我的几何。接收到事件后,更新我的顶点和faces索引。我可以通过设置verticesNeedUpdate来更新坐标,但它不更新faces。更新被称为~20-50次每秒,这可能是沉重的浏览器。如何通过避免为JavaScript垃圾收集器创建大量垃圾来做到这一点?(请参阅下面的方法update() )。

代码语言:javascript
运行
复制
function WGeometry77(verts, faces) {
    THREE.Geometry.call( this );
    this.type = 'WGeometry77';
    this.parameters = {};
    // Initially create the mesh the easy way, by copying from a BufferGeometry
    this.fromBufferGeometry( new MyBufferGeometry77( verts, faces ) ); 
};

WGeometry77.prototype = Object.create( THREE.Geometry.prototype );
WGeometry77.prototype.constructor = WGeometry77;

WGeometry77.prototype.update = function(verts, faces) {
    var geom = this;
    var nl = Math.min(geom.vertices.length, verts.length/3);
    for ( var vi = 0; vi < nl; vi ++ ) {
        geom.vertices[ vi ].x = verts[vi*3+0];
        geom.vertices[ vi ].y = verts[vi*3+1];
        geom.vertices[ vi ].z = verts[vi*3+2];
    }
    var nf = Math.min(geom.faces.length, faces.length/3);
    for ( var fi = 0; fi < nf; fi ++ ) {
        geom.faces[ fi ].a = faces[fi*3+0];
        geom.faces[ fi ].b = faces[fi*3+1];
        geom.faces[ fi ].c = faces[fi*3+2];
    }
    geom.verticesNeedUpdate = true;  // Does not update the geom.faces
}

PS。我的代码是用Emscripten编写的,它可以这样做:

代码语言:javascript
运行
复制
var verts = Module.HEAPF32.subarray(verts_address/_FLOAT_SIZE, verts_address/_FLOAT_SIZE + 3*nverts);

我想做的几乎是动画,或者一个动态几何(使用Marching多维数据集计算)。但是我的拓扑图(网格图)也被更新了。我应该使用哪个ThreeJS类?如果没有这样的类,我应该创建一个像UpdatableBufferedGeometry这样的新类吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-21 14:28:53

若要在呈现后更新THREE.BufferGeometry,可以使用以下模式:

代码语言:javascript
运行
复制
geometry.attributes.position.setXYZ( index, x, y, z );

geometry.attributes.position.needsUpdate = true;

对于索引的BufferGeometry,您可以更改index数组如下:

代码语言:javascript
运行
复制
geometry.index.array[ index ] = value;

geometry.index.needsUpdate = true;

您不能调整缓冲区的大小-只更改它们的内容。您可以预先分配较大的数组并使用

代码语言:javascript
运行
复制
geometry.setDrawRange( 0, numVertices );

three.js r.78号

票数 1
EN

Stack Overflow用户

发布于 2016-06-20 19:31:06

如果您想提高效率,您应该创建一个BufferGeometry而不是Geometry

您可以使用此示例的源代码作为参考:uint

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37927031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档