three.js 多通道组合

news2024/11/19 9:38:08

效果:

代码:

<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>
.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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业论文内容参考|基于区块链技术的电子健康记录系统的设计与实现

文章目录 摘要前言绪论课题背景国内外相关研究课题内容区块链技术介绍系统分析用户需求分析系统设计系统实现系统测试总结与展望摘要 本文介绍了基于区块链技术的电子健康记录系统的设计与实现。该系统旨在解决传统电子健康记录系统存在的数据安全性、数据隐私性和数据互操作性…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

新全国产迅为龙芯 3A6000 处理器板卡

11月28日&#xff0c;“2023龙芯产品发布暨用户大会”在北京举行&#xff0c;迅为作为龙芯重要合作伙伴受邀参加&#xff0c;在整机产品发布仪式上&#xff0c;展示了基于龙芯 3A6000 处理器的全国产安全型工控计算机。 龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代…

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …

Vue实现JSON字符串格式化编辑器组件

相信很多同学都用过网上的在线JSON格式化工具来将杂乱的JSON数据转换成易于我们阅读和编辑的格式。那么&#xff0c;你有没有想过自己动手实现一个这样的工具呢&#xff1f;今天&#xff0c;我将介绍如何使用Vue.js来构建一个简单的JSON格式化工具。 功能简述 支持格式化JSON字…

企业如何利用好数据,让数据真正成为数据资产?数据资产管理应该怎样建设?

数字化时代&#xff0c;数据已经成为了个人、机构、企业乃至国家的重要战略资产。 近日&#xff0c;财政部正式对外发布《企业数据资源相关会计处理暂行规定》&#xff0c;并自 2024 年 1 月 1 日开始施行。数据资产入表政策落地节奏超预期&#xff0c;标志着国家把数据作为生…

jstree高性能树型控件

一、直接上代码 这种基于服务器端生成Html结构&#xff0c;直接渲染为树&#xff0c;能很好的解决大树的问题。 {ViewData["Title"] "Home Page";Layout null; } <link href"~/jstree/themes/default/style.min.css" rel"stylesheet…

STM32CubeMX教程17 DAC - 输出三角波/噪声波

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

浪涌保护器的必要性和安装方案

浪涌保护器SPD是一种用于限制电力线路或信号线路上的瞬时过电压&#xff0c;并将其导入地线的装置&#xff0c;主要用于防止雷电或其他电源干扰对电气设备或电子设备造成损坏。浪涌保护器的类型和结构根据不同的用途和场合有所不同&#xff0c;但一般都包含一个或多个非线性电压…

后台管理系统 -- 点击导航栏菜单对应的面包屑和标签(Tag)的动态编辑功能

相信很多时候,面包屑和标签(Tag)的功能几乎是后台管理系统标配。 就是会随着路由的跳转来进行相应的动态更新。 我先展示一下效果: 1.面包屑 先说一下思路&#xff1a; 我们导航菜单点击之后,将当前显示路由对象存储到Vuex的storge里面,然后在面包屑组件里面,读取这个状态即可…

电子负载是如何实现这些功能的

电子负载模拟真实负载的电子设备&#xff0c;它可以吸收或释放电能&#xff0c;以实现对电源、电池、发电机等电源设备的测试和保护。电子负载的主要功能包括恒流、恒压、恒功率、恒电阻等模式&#xff0c;以及过压、过流、短路、过热等保护功能。那么&#xff0c;电子负载是如…

RAL论文:一种自感知扭转塔折纸软体机器人

折纸是一种以纸张折成各种不同形状的艺术活动。折纸与自然科学结合在一起&#xff0c;不仅成为建筑学院的教具&#xff0c;还发展出了折纸几何学成为现代几何学的一个分支。根据折痕的不同分布&#xff0c;可以将纸张折叠成不同的形状&#xff0c;例如有许多经典的折纸结构&…

东信免驱系列身份证阅读器串口通讯协议解析示例,适用于单片机、ARM等系统开发集成使用

完整的一次读卡流程包括&#xff1a; 身份证寻卡 > 身份证选卡 > 身份证读卡&#xff0c;三个步骤 缺一不可&#xff08;见通讯协议&#xff09;。 寻卡&#xff1a;EA EB EC ED 04 00 B0 B4 BB 返回&#xff1a;EA EB EC ED 05 00 00 B0 B5 BB 选卡&#xff1a;EA …

【EI会议征稿通知】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and Computer Communications 第四届数字信号与计算机通信国际会议(DSCC 2024)将于2024年4月12日至14日在中国-香港举行。DSCC 2024旨…

Java8新特性 Stream流详解

目录 1、介绍 2、获取Stream流的两种方式 方式一&#xff1a;根据Collection获取流 方式二&#xff1a;Stream中的静态方法of获取流 区别 3、Stream流注意事项 4、Stream流的常用方法 forEach count filter limit skip map sorted distinct match find max和…

【JAVA核心知识】分布式事务框架Seata

Seata 基本信息 GitHub&#xff1a;https://github.com/seata/seatastars: 20.6k 最新版本&#xff1a; v1.6.1 Dec 22, 2022 官方文档&#xff1a;http://seata.io/zh-cn/index.html 注意 官方仅仅支持同步调用。 官方在FAQ中表示对于异步框架需要自行支持。 具体的扩展思…

学习Go语言Web框架Gee总结--上下文Context(二)

学习Go语言Web框架Gee总结--上下文Context context/go.modcontext/main.gocontext/gee/context.gocontext/gee/router.gocontext/gee/gee.go 学习网站来源&#xff1a;Gee 项目目录结构&#xff1a; context/go.mod module examplego 1.21.5require gee v0.0.0 replace gee…

python设计模式:模板方法模式

更多Python学习内容&#xff1a;ipengtao.com 软件设计和编程中&#xff0c;设计模式是一种有助于解决常见问题的强大工具。其中之一是"模板方法模式"&#xff0c;它是一种行为型设计模式&#xff0c;允许你定义一个算法的骨架&#xff0c;但将一些步骤的具体实现延迟…

【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取

1. I2C工具查看aht20的温湿度寄存器值 1.1 原理图 传感器通过IIC方式进行通信&#xff0c;连接的为IIC1总线&#xff0c;且设备地址为0x38&#xff0c;实际上通过后续iic工具查询&#xff0c;这个设备是挂载在iic-0上 1.2 I2C工具 通过i2c工具可以实现查询i2c总线、以及上面…

第7章 参数估计(重点)

注意&#xff1a;区分正态总体还是非正态总体、总体方差已知还是未知、样本是大样本还是小样本&#xff0c;从而使用对应的Z或者t分布。