javascript - 如何从场景中删除网格的子集?
问题描述
当我创建多个具有相同名称的网格时,当我想将它们从场景中移除时,我无法将它们全部选中。
我试过遍历函数无济于事。
event.preventDefault();
scene.traverse(function(child) {
if (child.name === "blueTiles") {
var remove_object = scene.getObjectByName( "blueTiles", true );
scene.remove(remove_object);
}
});
var surroundMaterial = new THREE.MeshBasicMaterial({ color: 0x154995, side: THREE.DoubleSide, transparent: true, opacity: 0.8 });
surroundingCubes = new THREE.Mesh( geometry, surroundMaterial );
scene.add( surroundingCubes );
surroundingCubes.name = "blueTiles";
surroundingCubes.position.set(selectedObject.position.x - 1, 0.11, selectedObject.position.z);
var surroundMaterial = new THREE.MeshBasicMaterial({ color: 0x154995, side: THREE.DoubleSide, transparent: true, opacity: 0.8 });
surroundingCubes = new THREE.Mesh( geometry, surroundMaterial );
scene.add( surroundingCubes );
surroundingCubes.name = "blueTiles";
surroundingCubes.position.set(selectedObject.position.x + 1, 0.11, selectedObject.position.z);
surroundingCubes.rotation.x = Math.PI / 2;
我应该只能删除所有名为 blueTiles 的对象
编辑我从名称切换到组,这创造了奇迹下面的解决方案
function onDocumentMouseDown(event) {
for (var i = group.children.length - 1; i >= 0; i--) {
group.remove(group.children[i]);
}
var surroundingMaterial = new THREE.MeshBasicMaterial({ color: 0x154995, side: THREE.DoubleSide, transparent: true, opacity: 0.8 });
var geometry = new THREE.PlaneGeometry(1, 1, 1, 1);
if ( selectedObject.position.x - 1 >= 0) {
surroundingCube = new THREE.Mesh( geometry, surroundingMaterial );
surroundingCube.position.set(selectedObject.position.x - 1, 0.11, selectedObject.position.z);
surroundingCube.rotation.x = Math.PI / 2;
group.add(surroundingCube);
}
if ( selectedObject.position.x + 1 <= 9) {
surroundingCube = new THREE.Mesh( geometry, surroundingMaterial );
surroundingCube.position.set(selectedObject.position.x + 1, 0.11, selectedObject.position.z);
surroundingCube.rotation.x = Math.PI / 2;
group.add(surroundingCube);
}
scene.add( group );
}
解决方案
getObjectByName只是调用getObjectByProperty(使用 name 属性),它只返回它找到的第一个对象。
你真的只需要遍历children
场景/object3d,检查他们的名字,然后删除。
如果您知道要删除的所有内容都将位于顶层,那很简单。
像......(未经测试)
for ( var i = 0, l = scene.children.length; i < l; i ++ ) {
if (scene.children[i].name === 'blueTiles') {
scene.remove(scene.children[i]);
}
}
如果您还想在较低级别进行检查,则可能需要某种递归。
编辑...
在再次查看您的问题之后..并记住有一个遍历功能
您似乎已经在遍历场景并可以访问孩子。
我认为你只需要改变你的功能(而不是调用 getObjectByName )。
scene.traverse(function(child) {
if (child.name === "blueTiles") {
scene.remove(child);
}
});
推荐阅读
- android - Room SQLite 文件 - 确保所有更改都已刷新,并且在文件上传过程中没有 I/O
- sql - SSRS 参数删除其他过滤器
- logstash - 解析 nginx 错误日志的 grok 模式的问题
- php - 如何使用 PHP 将月份添加到特定日期?
- intel - 错误:无法安全地从此类存储库进行更新,因此默认禁用
- javascript - 未捕获的 URIError:尝试解码 var 时 URI 格式错误(javascript)
- c# - 当 RowState = Modified 时 SQLDataAdapter.Update() 不更新
- python - 命名两个或多个相关 Python 变量的首选方法是什么?
- python - 使用 os.walk 将多个文本文件转换为 csv
- xquery - 如何将纬度和经度值替换为一个元素值?