繁体   English   中英

更改Three.js对象的几何

[英]Changing a three.js object's geometry

我正在尝试更改Three.js场景中某些对象的几何形状。 mouse click, even though the geometry is also successfully modified by each following clicks. 我有一段几乎可以正常工作的代码,其中单击鼠标会触发更改,但是出现了以下问题:(渲染的)形状仅在第单击鼠标时更改,即使随后的每次单击也成功修改了几何形状。 如果相关,请使用three.js库的v66或v68。

我读了Three.js:完全更改对象的Geometry更新网格中的几何没有任何作用,但是到目前为止无法使我的代码正常工作。

我的代码的相关部分:

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;
}

是一个(非工作示例)的jsfiddle。 屏幕上有一个球体,单击将使其变成立方体。 应该进一步单击以在球体和立方体之间切换,但屏幕上没有任何变化。

我不知道为什么会这样。 一旦使用几何对象,就无法更新网格的几何。

.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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM