当前位置: 首页 > ops >正文

vue3 threejs 物体发光描边

threejs官网案例: three.js examples

我的代码(标注了重点代码,加上即可)

<template><div class="greenhouse" ref="canvasContainerRef"></div></template><script setup>
import * as THREE from "three";
import anime from "animejs"import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'; //重点import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';//重点import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js';//重点
import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';//重点import { ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const renderer = ref(); //渲染器let scene = new THREE.Scene(); //场景--scene是只读属性
const camera = ref(null); //相机
let orbitControls = null
let composer = null//重点
let effectFXAA = null//重点
const initThree = () => {// width和height用来设置Three.js输出Canvas画布尺寸,同时用来辅助设置相机渲染范围camera.value = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);camera.value.position.set(200, 200, 200);// scene.background = new THREE.Color(0xffffff);// 创建渲染器renderer.value = new THREE.WebGLRenderer({antialias: true, //开启抗锯齿(否则加载的模型有锯齿--)});renderer.value.setSize(window.innerWidth, window.innerHeight);renderer.value.setPixelRatio(window.devicePixelRatio); //设置设备像素比率,防止Canvas画布输出模糊。const canvasContainerRef = proxy.$refs["canvasContainerRef"];//环境光var ambient = new THREE.AmbientLight(0xffffff, 1);scene.add(ambient);canvasContainerRef.appendChild(renderer.value.domElement);const axesHelper = new THREE.AxesHelper(150);scene.add(axesHelper);orbitControls = new OrbitControls(camera.value, renderer.value.domElement); //旋转、放大缩小// 初始化加载器const loader = new GLTFLoader();renderer.value.outputEncoding = THREE.sRGBEncoding; //解决加载gltf格式模型纹理贴图和原图不一样问题// 创建后处理对象EffectComposer,WebGL渲染器作为参数composer = new EffectComposer(renderer.value);//重点// 创建一个渲染器通道,场景和相机作为参数const renderPass = new RenderPass(scene, camera.value);//重点composer.addPass(renderPass);//重点const v2 = new THREE.Vector2(window.innerWidth, window.innerHeight);//重点const outlinePass = new OutlinePass(v2, scene, camera.value);//重点// 设置描边参数  //重点outlinePass.visibleEdgeColor.set(0xaeb63e); // 可见边颜色(绿色)outlinePass.hiddenEdgeColor.set(0x0000ff);  // 隐藏边颜色(蓝色)outlinePass.edgeStrength = 8.0;            // 边缘强度outlinePass.edgeThickness = 3.0;           // 边缘厚度outlinePass.pulsePeriod = 4;outlinePass.edgeGlow = 0.7;//MeshLambertMaterial受光照影响const material = new THREE.MeshLambertMaterial({color: 0xa1a314});const geometry = new THREE.BoxGeometry(100, 100, 100);const mesh = new THREE.Mesh(geometry, material);scene.add(mesh)composer.addPass(outlinePass);//重点effectFXAA = new ShaderPass(FXAAShader);//重点effectFXAA.uniforms['resolution'].value.set(1 / window.innerWidth, 1 / window.innerHeight);//重点composer.addPass(effectFXAA);//重点// 一个模型对象outlinePass.selectedObjects = [mesh];//重点// loader.load("./士兵.glb", (gltf) => {//     scene.add(gltf.scene)// });scene.add(camera.value);animateRender();
};// 动画循环
const animateRender = () => {requestAnimationFrame(animateRender);//  renderer.value.render(scene, camera.value)composer.render(); // 只需要调用composer.render()//重点};onMounted(() => {initThree()
});
</script><style scoped lang="scss"></style>

有两点注意:

一、vue3里面申明的scene composer effectFXAA 不能定义为响应式否则会报错。

二、由于使用了composer.render(),所以抗锯齿会失效,模型会有锯齿。

http://www.xdnf.cn/news/7865.html

相关文章:

  • Python人工智能算法 模拟退火算法:原理、实现与应用
  • 项目执行中缺乏问题记录和总结,如何改进?
  • [java]数组
  • 7.数据的预测分析及可视化
  • 嵌入式STM32学习——串口USART 2.0(printf重定义及串口发送)
  • Word2Vec模型学习和Word2Vec提取相似文本体验
  • 豪越智能仓储:为消防应急物资管理“上锁”
  • Nginx 强制 HTTPS:提升网站安全性的关键一步
  • Arthas:Java诊断利器实战指南
  • 游戏服务器开发:如何实现客户端与服务端通信
  • 【Unity 如何使用 Mixamo下载免费模型/动画资源】Mixamo 结合在 Unity 中的实现(Animtor动画系统,完整配置以及效果展示)
  • 如何通过小贝加速实现精准网络故障排查
  • 使用 Shadcn UI 构建 Java 桌面应用
  • 六:操作系统虚拟内存之缺页中断
  • PHP:经典编程语言在当代Web开发中的新活力
  • YOLOv4深度解析:从架构创新到工业落地的目标检测里程碑
  • git工具使用
  • 【VxWorks 实时操作系统(RTOS)】常用函数汇总
  • 期刊采编系统安装升级错误
  • 25_05_19Linux实战篇、第一章_01若依前后端部署之路(后端)
  • SpringBoot-SpringBoot源码解读
  • 自动化软件如何确保高可用性和容错性?
  • git中,给分支打标签
  • 第三章 MCU时钟树配置
  • 直线型绝对值位移传感器:精准测量的科技利刃
  • Linux查 ssh端口号和服务状态
  • 故障率预测:基于LSTM的GPU集群硬件健康监测系统(附Prometheus监控模板)
  • 基于 Redis 实现短信验证码登录功能的完整方案
  • matlab实现混沌扩频DCSK的仿真
  • 从运维告警到业务决策:可观测性正在重新定义企业数据基础设施