three.js 多通道组合

效果:

代码:

<template>
  <div>
    <el-container>
      <el-main>
        <div class="box-card-left">
          <div id="threejs" style="border: 1px solid red"></div>
          <div style="border: 1px solid skyblue; padding: 10px; margin: 10px">
            <el-form label-width="0px">
              <el-form-item>
                <el-switch
                  v-model="wireframe"
                  active-text="线模型"
                  inactive-text="面模型"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="outlinePassFlag"
                  active-text="有发光描边"
                  inactive-text="无发光描边"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="glitchPassFlag"
                  active-text="有闪屏效果"
                  inactive-text="无闪屏效果"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="filmPassFlag"
                  active-text="有模拟电视屏幕效果"
                  inactive-text="无模拟电视屏幕效果"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="afterimagePassFlag"
                  active-text="有重影效果"
                  inactive-text="无重影效果"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="dotScreenPassFlag"
                  active-text="有点网效果"
                  inactive-text="无点网效果"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="HalftonePassFlag"
                  active-text="有半色调效果"
                  inactive-text="无半色调效果"
                >
                </el-switch>
              </el-form-item>
              <el-form-item>
                <el-switch
                  v-model="shaderPassFlag"
                  active-text="有半色调效果"
                  inactive-text="无半色调效果"
                >
                </el-switch>
              </el-form-item>
            </el-form>

            <br />
            <!-- <div class="box-right">  <el-button type="primary" >面与线框切换</el-button></div> -->
            <div style="text-align:left;">
            相关文章:
            <div style="color:blue;margin-top:5px;">
            http://www.taodudu.cc/news/show-4413505.html?action=onClick
            </div>
            <div style="color:blue;margin-top:5px;">
            https://blog.csdn.net/webMinStudent/article/details/130786714
            </div>
            </div>
          </div>
        </div>
      </el-main>
    </el-container>
  </div>
</template>
<script>
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
// 效果制作器
import { EffectComposer } from "three/examples/jsm/postprocessing/EffectComposer.js";
// 渲染通道
import { RenderPass } from "three/examples/jsm/postprocessing/RenderPass.js";
// 发光描边OutlinePass
import { OutlinePass } from "three/examples/jsm/postprocessing/OutlinePass.js";
// 闪屏效果
import { GlitchPass } from "three/examples/jsm/postprocessing/GlitchPass.js";
// 电视效果
import { FilmPass } from "three/examples/jsm/postprocessing/FilmPass.js";
// AfterimagePass  重影效果
import { AfterimagePass } from "three/examples/jsm/postprocessing/AfterimagePass.js";
// ClearPass  清除背景通道
import { ClearPass } from "three/examples/jsm/postprocessing/ClearPass.js";
// DotScreenPass  点网效果
import { DotScreenPass } from "three/examples/jsm/postprocessing/DotScreenPass.js";
// 半色调效果
import { HalftonePass } from "three/examples/jsm/postprocessing/HalftonePass.js";
// 着色器通道
import { ShaderPass } from "three/examples/jsm/postprocessing/ShaderPass.js";

export default {
  data() {
    return {
      name: "",
      scene: null, // 场景对象
      camera: null, // 相机对象
      renderer: null,
      effectComposer: null,
      mesh: null,
      mesh1: null,
      geometry: null,
      group: null,
      material: null,
      texture: null,
      effectComposer: null,
      wireframe: false,
      outlinePass: null, // 发光描边
      outlinePassFlag: false, //  发光描边开关标志
      glitchPass: null, //  闪屏
      glitchPassFlag: false, //  闪屏开关标志
      filmPass: null, //  模拟电视
      filmPassFlag: false, //  模拟电视开关标志
      afterimagePass: null, //  重影效果
      afterimagePassFlag: false, //  重影效果关标志
      dotScreenPass: null, //  点网效果
      dotScreenPassFlag: false, //  点网效果关标志
      halftonePass: null, //  半色调效果
      HalftonePassFlag: false, //  半色调效果关标志
      shaderPass: null, //  着色器效果
      shaderPassFlag: false, //  着色器效果关标志
    };
  },
  watch: {
    wireframe: {
      handler(v) {
        this.changeLine();
      },
      deep: true,
      immediate: true,
    },
    shaderPassFlag: {
      handler(v) {
        if (this.effectComposer && this.shaderPass) {
          if (v) {
            // 效果制作器添加 着色器效果
            this.effectComposer.addPass(this.shaderPass);
          } else {
            // 效果制作器删除 着色器效果
            this.effectComposer.removePass(this.shaderPass);
          }
        }
      },
    },
    HalftonePassFlag: {
      handler(v) {
        if (this.effectComposer && this.halftonePass) {
          if (v) {
            // 效果制作器添加 半色调效果通道
            this.effectComposer.addPass(this.halftonePass);
          } else {
            // 效果制作器删除 半色调效果通道
            this.effectComposer.removePass(this.halftonePass);
          }
        }
      },
    },
    dotScreenPassFlag: {
      handler(v) {
        if (this.effectComposer && this.dotScreenPass) {
          if (v) {
            // 效果制作器添加 点网效果通道
            this.effectComposer.addPass(this.dotScreenPass);
          } else {
            // 效果制作器删除 点网效果通道
            this.effectComposer.removePass(this.dotScreenPass);
          }
        }
      },
    },
    afterimagePassFlag: {
      handler(v) {
        if (this.effectComposer && this.afterimagePass) {
          if (v) {
            // 效果制作器添加 发光描边通道
            this.effectComposer.addPass(this.afterimagePass);
          } else {
            // 效果制作器删除 发光描边通道
            this.effectComposer.removePass(this.afterimagePass);
          }
        }
      },
    },
    outlinePassFlag: {
      handler(v) {
        if (this.effectComposer && this.outlinePass) {
          if (v) {
            // 效果制作器添加 发光描边通道
            this.effectComposer.addPass(this.outlinePass);
          } else {
            // 效果制作器删除 发光描边通道
            this.effectComposer.removePass(this.outlinePass);
          }
        }
      },
    },
    glitchPassFlag: {
      handler(v) {
        if (this.effectComposer && this.glitchPass) {
          if (v) {
            // 效果制作器添加 闪屏效果通道
            this.effectComposer.addPass(this.glitchPass);
          } else {
            // 效果制作器删除 闪屏效果通道
            this.effectComposer.removePass(this.glitchPass);
          }
        }
      },
    },
    filmPassFlag: {
      handler(v) {
        if (this.effectComposer && this.filmPass) {
          if (v) {
            // 效果制作器添加 电视屏幕效果通道
            this.effectComposer.addPass(this.filmPass);
          } else {
            // 效果制作器删除 电视屏幕效果通道
            this.effectComposer.removePass(this.filmPass);
          }
        }
      },
    },
  },
  created() {},
  mounted() {
    this.name = this.$route.query.name;
    this.init();
  },
  methods: {
    goBack() {
      this.$router.go(-1);
    },
    outlinePassFn() {
      // 创建发光描边通道对象
      this.outlinePass = new OutlinePass(
        new this.$three.Vector2(1000, 800),
        this.scene,
        this.camera
      );
      // 设置描边颜色
      this.outlinePass.visibleEdgeColor.set(0xf01414);
      // 设置描边厚度
      this.outlinePass.edgeThickness = 5;
      // 设置描边发光强度
      this.outlinePass.edgeStrength = 6;
      // 设置模型闪烁频率
      this.outlinePass.pulsePeriod = 2;
      // 发光描边对象添加网格模型对象
      this.outlinePass.selectedObjects = [this.mesh];
    },
    glitchPassFn() {
      // 创建闪屏对象
      this.glitchPass = new GlitchPass();
    },
    // 点网效果
    dotScreenPassFn() {
      // 创建闪屏对象
      this.dotScreenPass = new DotScreenPass();
    },
    // 半色调效果
    HalftonePassFn() {
      // 创建闪屏对象
      this.halftonePass = new HalftonePass();
    },
    filmPassFn() {
      /**
       *  FilmPass通道可以通过扫描线和失真模拟电视屏幕
       *  new FilePass(nlntensity, slntensity, sCount, grayscale)
       *  nlntensity 控制屏幕的颗粒程度
       *  slntensity 控制屏幕上扫描线的显著程度
       *  sCount 控制扫描线的数量
       *  grayscale 接收一个布尔值,指定是否将图像转为灰度图
       *  */
      this.filmPass = new FilmPass(20, 10, 1000, false);
    },
    // 重影效果
    afterimagePassFn() {
      this.afterimagePass = new AfterimagePass();
    },
    // 着色器效果
    shaderPassFn() {
      const pixelationShader = {
        uniforms: {
          tDiffuse: { value: null },
          resolution: { value: new this.$three.Vector2(window.innerWidth, window.innerHeight) },
          pixelSize: { value: 5.0 }, // Adjust this value to control pixelation size
        },
        vertexShader: `
          varying vec2 vUv;
          void main() {
            vUv = uv;
            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
          }
        `,
        fragmentShader: `
          uniform sampler2D tDiffuse;
          uniform vec2 resolution;
          uniform float pixelSize;

          varying vec2 vUv;

          void main() {
            vec2 dxy = pixelSize / resolution;
            vec2 coord = dxy * floor(vUv / dxy);
            gl_FragColor = texture2D(tDiffuse, coord);
          }
        `,
      };
      this.shaderPass = new ShaderPass(pixelationShader);
    },
    // 后处理操作
    afterCure() {
      // 创建效果制作器对象
      this.effectComposer = new EffectComposer(this.renderer);
      // 创建渲染器通道对象
      const renderPass = new RenderPass(this.scene, this.camera);
      // 效果制作器添加 渲染器通道
      this.effectComposer.addPass(renderPass);
      // 发光描边
      this.outlinePassFn();
      // // 闪屏
      this.glitchPassFn();
      // // 模拟电视屏幕
      this.filmPassFn();
      // 重影效果
      this.afterimagePassFn();
      // 点网效果
      this.dotScreenPassFn();
      // 半色调效果
      this.HalftonePassFn();
      // 着色器效果
      this.shaderPassFn();
      // this.effectComposer.addPass(pixelationPass);
      // const clearPass = new ClearPass('white', 1);
      // this.effectComposer.addPass(clearPass);
    },
    init() {
      // 1,创建场景对象
      this.scene = new this.$three.Scene();
      /**
       * 创建四面缓冲几何体 TetrahedronGeometry(radius, detail)
       * radius: 四面体的半径;
       * detail: 默认值是0,将这个值设为一个大于0的数,将会为它添加一些顶点,使其不再是一个四面体
       *  */
      this.geometry = new this.$three.TetrahedronGeometry(50, 0);
      // 创建材质对象
      this.material = new this.$three.MeshBasicMaterial({
        color: 0xffffaa,
        wireframe: this.wireframe, // 将几何体渲染位线框,默认是false
      });
      // 创建网格对象
      this.mesh = new this.$three.Mesh(this.geometry, this.material);
      this.scene.add(this.mesh); // 将网格对象添加到场景中
      // 包围盒的辅助对象
      const box = new this.$three.BoxHelper(this.mesh, 0xffffff);
      this.scene.add(box);
      // 创建辅助坐标轴对象; 150 坐标轴长度
      const axesHelper = new this.$three.AxesHelper(150);
      this.scene.add(axesHelper);
      // 创建相机对象
      this.camera = new this.$three.PerspectiveCamera(60, 1, 0.01, 1000);
      // 设置相机对象的位置
      this.camera.position.set(200, 200, 100);
      this.camera.lookAt(0, 0, 0);
      // 创建渲染器对象
      this.renderer = new this.$three.WebGLRenderer();
      this.renderer.setSize(1000, 800); // 设置渲染尺寸
      // this.renderer.render(this.scene, this.camera); // 开始渲染
      window.document
        .getElementById("threejs")
        .appendChild(this.renderer.domElement);

      // 创建相机空间轨道控制器
      const controls = new OrbitControls(this.camera, this.renderer.domElement);
      controls.addEventListener("change", () => {
        this.renderer.render(this.scene, this.camera);
      });
      this.afterCure();
      this.renderFun();
    },
    // 点击切换按钮时触发
    changeLine() {
      let wf = JSON.parse(JSON.stringify(this.wireframe));
      if (this.mesh) {
        this.mesh.material.wireframe = wf;
        this.renderer.render(this.scene, this.camera); // 开始渲染
      }
    },
    renderFun() {
      this.effectComposer.render();
      window.requestAnimationFrame(this.renderFun);
    },
  },
};
</script>
//
<style lang="less" scoped>
.msg {
  padding: 20px;
  text-align: left;
  display: flex;
  justify-content: flex-start;
  flex-wrap: wrap;
  .span {
    margin: 0 30px 30px 0;
    // white-space: nowrap;
  }
  .p {
    text-align: left;
  }
}
.box-card-left {
  display: flex;
  align-items: flex-start;
  flex-direction: row;

  width: 100%;
  .box-right {
    text-align: left;
    padding: 10px;
    .xyz {
      width: 100px;
      margin-left: 20px;
    }
    .box-btn {
      margin-left: 20px;
    }
  }
}
.el-form-item {
  margin: 0;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/286087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PASCAL VOC数据集

官方页面&#xff1a; 官方网址&#xff1a; The PASCAL Visual Object Classes Challenge 2012 (VOC2012) (ox.ac.uk) 数据集下载&#xff1a; 类别&#xff1a; 数据集结构&#xff1a;voc2012 test数据集不公开 标注自己的目标检测数据集&#xff1a; Make Sensehttps:…

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面&#xff08;GUI&#xff09;框架。它是Java平台的一部分&#xff0c;从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能&#xff0c;使开发人员能够创建具有吸引力和交互性的应用程…

【数据结构】堆的实现及TOP-K问题

文章目录 前言1. 堆的概念及结构2. 堆的实现2.1 堆向上调整算法2.2 堆向下调整算法2.3 堆的创建2.4 堆的删除2.5 堆的常用接口代码实现 3. 堆的应用TOP-K问题 前言 在正式讲堆之前&#xff0c;我们要先来讲一下二叉树的顺序结构&#xff1a; 普通的二叉树是不适合用数组来存储…

认识机器学习【woodwhales.cn】

为了更好的阅读体验&#xff0c;建议移步至笔者的博客阅读&#xff1a;认识机器学习 生活中的问题1&#xff1a;居民家庭生活用气价格 北京燃气小程序在线咨询&#xff0c;查询北京居民家庭生活用气价格 上图价格梯度&#xff0c;可以由文字转换成表格&#xff1a; 第一档用气…

【Matlab】LSTM长短期记忆神经网络时序预测算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88688439 一&#xff0c;概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;结构&#xff0c;由于其对于…

UI自动化Selenium 显式和隐式等待Wait

一、问题现象 大家是否自动化执行过程中&#xff0c;出现脚本时而成功时而失败的情况&#xff1b;发现常见情况如下&#xff1a; 1、元素时而出现时而提示不存在&#xff0c;timeout 2、元素时而可以操作时而不能操作&#xff1b;提示&#xff1a;元素不可点击或不可操作 3…

Qdrant向量数据库

Qdrant 是专为扩展过滤支持而设计的向量相似度搜索引擎和向量数据库&#xff0c;这使得它适用于各种基于神经网络的语义匹配、图像搜索等应用。 Qdrant 使用 Rust &#x1f980; 编写&#xff0c;即使在高负载下也能快速、可靠地工作。 Qdrant架构 上图展示了 Qdrant 一些主要…

【排序】堆排序(C语言实现)

文章目录 前言1. 堆排序1.1 堆排序的思想1.2 堆排序的实现 2. 为什么向下调整而不是向上调整 前言 本章主要会讲堆排序的实现过程以及向上调整和向下调整的时间复杂度&#xff0c;在学习本章前&#xff0c;需要对堆、以及向上调整和向下调整有一个了解&#xff0c;如果不了解的…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

Nginx多ip部署多站点

目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置&#xff0c;使用 d…

QT音频编程实战项目(二)

接上一篇 我们在实现完槽函数的定义后&#xff0c;我们应该将这些槽函数和对应的信号连接起来 接着将每个控件都对应转到槽进行实现&#xff1a; 这个是对打开文件呢个控件转到槽的具体操作&#xff1a; 首先通过QDir::homePath()获得用户的主目…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴 基础配置实现IGP需求&#xff1a;1. 根据拓扑所示&#xff0c;配置OSPF和EIGRP2. 在R3上增加一个网段&#xff1a;33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP&#xff0c;并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为666&…

java工作流详解

什么是工作流&#xff1f; 工作流&#xff1a;两个或两个以上的人&#xff0c;为了共同的目标&#xff0c;连续的以串行或并行的方式去完成某一业务。 业务&#xff1a;工作流所指业务涵盖了与经营相关的活动。 串行或并行&#xff1a;业务中的步骤也许以一步接着一步的方式…

YOLOv8改进:IoU系列篇 | Shape-IoU关注边界框本身的形状和尺度来计算损失 | 2023年12月最新IoU改进

🚀🚀🚀本文改进: 提出了一种新颖的Shape-IoU,小目标检测实现涨点,更加关注边界框本身的形状和尺度来计算损失 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Shape-IoU原理介绍 论文:https://ar…

【ps】如何给人偶添加衣服

使用PS工具扣出人物 使用编辑-变形-操控变型 、

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中&#xff0c;可以将【参数】放在【路由路径】中&#xff0c; 从而实现&#xff0c;同一个 路由&#xff0c;同一个组件&#xff0c;因路径参数不同&#xff0c;可以渲染出不同的内容。特点 &#xff1a; 1、当携带不同路径参数的路由相互跳转时&am…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

二叉搜索树介绍以及实现

二叉树无论是在实际运用还是面试题中&#xff0c;都是一种十分热门的数据结构&#xff0c;而二叉搜索树则是进阶版的二叉树&#xff0c;在map和set中也有应用。 什么是二叉搜索树 二叉搜索树又叫二叉排序树&#xff0c;它可以是一颗空树&#xff0c;又或者是有以下三个特点的…

用简单的方式理解串行主从通信方式(适用于LEU与TCC等外部设备之间的通信)

串行通信方式 数据按位序传送&#xff0c;最少需要两根通道&#xff08;如RS485、CAN总线、以太网&#xff09;。 优点&#xff1a;成本低&#xff0c;适合远距离通信。 缺点&#xff1a;速度慢、效率低。 注&#xff1a;以上特征为相较于并行通信方式。 主从通信方式 以RS4…

skimage图像处理(全)

文章目录 一、简介二、安装三、模块简介&#xff1a;API reference四、项目实战4.1、2D图像处理4.1.1、打印图像属性4.1.2、读取 / 显示 / 保存图像&#xff1a;skimage.io.imread() skimage.io.imshow() skimage.io.imsave()4.1.3、颜色空间转换&#xff1a;skimage.color.r…