• three.js中的3D模型分层显示(分类型显示);使用dat.gui控制three.js中的3D模型分层显示;dat.gui调用一次但是渲染了多个


     

    效果如上,就是可以通过dat.gui控制3D模型中仅仅显示管线或者是仅仅显示除了管线之外的模型。

    1.在模型导入的时候就按照类型(分层的类别标识) 区别开(我这里是按照是否是管线)

    这里是new THREE.Object3D();必须的否则会报错,以及后面再控制显隐的时候需要这个对象中的visible去控制哦

    1. // 加载3D模型
    2. const loader = new GLTFLoader();
    3. loader.load('/models/donghua.glb', (gltf) => {
    4. this.model = gltf.scene;
    5. this.model.children.forEach(element => {
    6. if (element.name.includes('Line')) {
    7. //将是管线的网格对象放在一起
    8. this.lineListModel.push(element)
    9. } else {
    10. //将不是管线的网格对象放在一起
    11. this.otherListModel.push(element)
    12. }
    13. });
    14. // 分层显示 这里是创建一个3d对象
    15. this.lineModel = new THREE.Object3D();
    16. this.otherModel = new THREE.Object3D();
    17. // 将类型为管网的网格对象添加到object3D对象中
    18. for (var i = 0; i < this.lineListModel.length; i++) {
    19. this.lineModel.add(this.lineListModel[i]);
    20. }
    21. // 将类型是其他的网格对象添加到object3D对象中
    22. for (var j = 0; j < this.otherListModel.length; j++) {
    23. this.otherModel.add(this.otherListModel[j]);
    24. }
    25. // 将层级添加到场景中
    26. this.scene.add(this.lineModel);
    27. this.scene.add(this.otherModel);

    2.在mounted当中去初始化gui控件, 在beforeDestroy中去销毁,否则的话会出现多个gui控件

    document.querySelector('.dg')是默认的类名可以直接去修改gui控件的样式

    在修改显隐的时候let that = this很重要,之前一直修改不了 打印3D对象一直都是undefined,原来是this的原因

    1. mounted() {
    2. // 应用图形界面更改变量
    3. this.gui = new dat.GUI();
    4. const controls = {
    5. "仅显示管线": true,
    6. "仅显示除管线之外的其他": true,
    7. "全部显示": true,
    8. };
    9. let that = this
    10. this.gui.add(controls, '仅显示管线').onChange(function (value) {
    11. that.lineModel.visible=value
    12. });
    13. this.gui.add(controls, '仅显示除管线之外的其他').onChange(function (value) {
    14. that.otherModel.visible=value
    15. });
    16. this.gui.add(controls, '全部显示').onChange(function (value) {
    17. that.lineModel.visible=value
    18. that.otherModel.visible=value
    19. });
    20. const guiDOM = document.querySelector('.dg');
    21. guiDOM.style.position = 'absolute';
    22. guiDOM.style.top = '80px';
    23. guiDOM.style.left = '50px';
    24. guiDOM.style.zIndex = 9999;
    25. },
    26. beforeDestroy() {
    27. // 销毁GUI实例
    28. this.gui.destroy();
    29. }

    然后就收工啦~

  • 相关阅读:
    Unity实现设计模式——策略模式
    浅谈 python在密码学的应用
    深度学习(九)——神经网络:最大池化的作用
    ky10 server aarch64 离线安装openssl3.1.4
    图像分割算法
    CAN 通信-底层
    C语言解题——指针解析(牛客网题目)
    浏览器上写代码,4核8G微软服务器免费用,Codespaces真香
    mysql添加时间戳列与触发器
    工信部电子五所张志强:中国数据库行业发展趋势分析
  • 原文地址:https://blog.csdn.net/killerdoubie/article/details/133076598