阅读 838

three.js删除已经添加到场景上的模型、贴图等遇到的坑、 scene.remove()没有把模型给删除,页面还存在这个元素,还可以看到

标签:item   删除   判断   分析   remove   foreach   释放   遇到   多个   

1.正常情况下,代码这样子写就行了

// 调用添加模型代码
myObjects.push(mesh)
// 调用删除模型代码
clearScene(myObjects)
/**
 * 清除模型,模型中有 group 和 scene,需要进行判断
 * @param scene
 * @returns
 */
function clearScene(myObjects) {
  // 从scene中删除模型并释放内存
  if (myObjects.length > 0) {
    for (var i = 0; i < myObjects.length; i++) {
      var currObj = myObjects[i]

      // 判断类型
      if (currObj instanceof THREE.Scene) {
        var children = currObj.children
        for (var i = 0; i < children.length; i++) {
          deleteGroup(children[i])
        }
      } else {
        deleteGroup(currObj)
      }
      scene.remove(currObj)
    }
  }

  console.log(‘myObjects解决后‘)
  console.log(myObjects)
}

// 删除group,释放内存
function deleteGroup(group) {
  //console.log(group);
  if (!group) return
  // 删除掉所有的模型组内的mesh
  group.traverse(function (item) {
    if (item instanceof THREE.Mesh) {
      item.geometry.dispose() // 删除几何体
      item.material.dispose() // 删除材质
    }
  })
}

2.某些模型可以正常删除,但是某些精灵图,我发现居然删除不掉,经过分析,发现是因为模型的material是个数组,里边有多个材质需要挨个删除,经过修改,代码如下

// 删除group,释放内存
function deleteGroup(group) {
  if (!group) return
  // 删除掉所有的模型组内的mesh
  group.traverse(function (item) {
    if (item instanceof THREE.Mesh) {
    if(Array.isArray(item.material)) {
      item.material.forEach(a => {
        a.dispose()
      })
    }else{
      item.material.dispose() // 删除材质
    }
      item.geometry.dispose() // 删除几何体
    }
  })
}

完美解决问题~~~~

three.js删除已经添加到场景上的模型、贴图等遇到的坑、 scene.remove()没有把模型给删除,页面还存在这个元素,还可以看到

标签:item   删除   判断   分析   remove   foreach   释放   遇到   多个   

原文地址:https://www.cnblogs.com/sugartang/p/14538979.html


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐