Javascript 更改three.js对象';s几何

Javascript 更改three.js对象';s几何,javascript,three.js,Javascript,Three.js,我正在尝试更改three.js场景中某些对象的几何体。我有一段几乎可以工作的代码,其中鼠标单击会触发更改,但遇到以下问题:仅在第一次鼠标单击时更改(渲染)形状,即使每次单击都会成功修改几何体。如果相关,请使用three.js库的v66或v68 我读了一遍又一遍,但到目前为止我的代码还不能正常工作 我的代码的相关部分: var count = 0, item, geometry; var geoms = [new THREE.SphereGeometry(2), new THREE.BoxGeom

我正在尝试更改three.js场景中某些对象的几何体。我有一段几乎可以工作的代码,其中鼠标单击会触发更改,但遇到以下问题:仅在第一次鼠标单击时更改(渲染)形状,即使每次单击都会成功修改几何体。如果相关,请使用three.js库的v66或v68

我读了一遍又一遍,但到目前为止我的代码还不能正常工作

我的代码的相关部分:

var count = 0, item, geometry;
var geoms = [new THREE.SphereGeometry(2), new THREE.BoxGeometry(3, 3, 3)];


function init() {

    geometry = geoms[count];
    item = new THREE.Mesh(geometry, material);
    scene.add(item);

}

// Mouse click listener.
function handleClick(event) {
    count = 1 - count;
    geometry = geoms[count];
    item.geometry = geometry;

    /* With that next line, on the first click, the sphere
     * becomes a cube (as intended), but further clicks don't
     * change the view anymore, even though item.geometry is
     * modified.
     */
    item.geometry.buffersNeedUpdate = true;

    /* If I try next line instead, I got the following error:
     * "TypeError: l.geometryGroupsList is undefined"
     * from three.js.
     */
    // item.geometry.verticesNeedUpdate = true;
}

是一个(非)工作示例的一部分。屏幕上有一个球体,点击一下就会变成一个立方体。进一步的点击应该在球体和立方体之间切换,但屏幕上没有任何变化。

我不知道为什么会发生这种情况。一旦使用几何体对象,它将无法更新网格的几何体

.clone()
在这种情况下有效

item.geometry.dispose();
item.geometry = geometry.clone();
dispose()
上一个几何体对象以防止内存泄漏


有更好的解决方案。

我发现这段代码运行得最快:

  item.geometry.computeFaceNormals();
  item.geometry.computeVertexNormals();
  item.geometry.normalsNeedUpdate = true;
  item.geometry.verticesNeedUpdate = true;
  item.geometry.dynamic = true;

谢谢你的回答。那么它是库中的一个bug吗(如果是的话,是否值得报告)?这应该不是bug。在开始渲染之前,必须将几何体转换为ArrayBuffers,此操作的成本非常高。这就是为什么必须更新几何体。