Javascript 更改three.js对象';s几何
我正在尝试更改three.js场景中某些对象的几何体。我有一段几乎可以工作的代码,其中鼠标单击会触发更改,但遇到以下问题:仅在第一次鼠标单击时更改(渲染)形状,即使每次单击都会成功修改几何体。如果相关,请使用three.js库的v66或v68 我读了一遍又一遍,但到目前为止我的代码还不能正常工作 我的代码的相关部分: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
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,此操作的成本非常高。这就是为什么必须更新几何体。