vue+ThreeJs 创建过渡圆圈效果
嗨,我是小路。今天主要和大家分享的主题是“vue+ThreeJs 创建过渡圆圈效果”。
今天在做着色器过渡效果练习,发现出现了很多新的函数,这些都超出了js之外,需要更多的掌握和学习。以下是自己的复盘和梳理。
1.获取距离
定义:distance获取两个点之间的距离
2.平滑过渡
定义:smoothstep函数是用来平滑插值的函数。在HLSL或者其他着色语言中,smoothstep可能用于生成平滑的过渡效果,比如在边缘模糊或者渐变时使用。
3.计算模型长度
定义:length
函数用于计算向量的欧几里得长度(模长)。
二、实例代码
<!--创建一个球体-->
<template><div class="pageBox"><div class="leftBox" ref="leftRef"></div></div></template>
<script setup>
import { onMounted, onUnmounted, reactive, ref } from 'vue';
import * as THREE from 'three';
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { getRandomColor, createLight } from '../utils/commonThree';
const leftRef = ref();
// 定义相机输出画布的尺寸(单位:像素px)
let width = window.innerWidth; //宽度
let height = window.innerHeight; //高度
// 创建3D场景对象Scene
const scene = new THREE.Scene();
//设置背景色
scene.background = new THREE.Color(0x646d59);const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
//三角形缩放过大时,会形成多种三角形形成的背景图
camera.position.z = 5;// 创建渲染器对象
const renderer = new THREE.WebGLRenderer();let tubes = [];
let material
const createTube = () => {const geometry = new THREE.PlaneGeometry(10,10);material = new THREE.ShaderMaterial({transparent: true,uniforms: {iResolution: { value: new THREE.Vector2() },iTime: { value: 0 },},vertexShader: `varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,fragmentShader: `uniform vec2 iResolution;uniform float iTime;varying vec2 vUv;float circle(float radius, vec2 center, vec2 uv) {float d = distance(center, uv);return 1.0 - smoothstep(radius-1./iResolution.y, radius+1./iResolution.y, d);}vec2 angleRadius(vec2 uv) {float anglePixel = atan(uv.y, uv.x);//length 计算模型长度float lengthPixel = length(uv);//画一条贝塞尔曲线return vec2(anglePixel, lengthPixel);}float filterPositive(float n) {return smoothstep(0.0, 0.005, n);}void main() {// 坐标系转换vec2 uv = (vUv - 0.5) * vec2(iResolution.x/iResolution.y, 1.0)*2.0;//生成原型的半径float radius = 0.3;//边缘的宽度float ringThick = 0.05;//画一条贝塞尔曲线vec2 stPolar = angleRadius(uv);float sPolar = stPolar.x * 3.0 + iTime * 10.0;float cosSPolarTemp = cos(sPolar);float cosSPolar = filterPositive(cosSPolarTemp);vec3 color = vec3(cosSPolar);float inCircleAA = smoothstep(radius, radius + 0.005, stPolar.y);float smallCircleAA = smoothstep(radius - ringThick, radius - ringThick + 0.005, stPolar.y);vec3 col = 1.0 - vec3(inCircleAA);vec3 col_2 = 1.0 - vec3(smallCircleAA);vec3 colorGap = col - col_2;vec3 finalColor = color * colorGap;vec3 colorMask = vec3(10.0, 1.5, 1.0);finalColor /= 10.0;finalColor *= colorMask;//实现平滑过渡效果float centerCircleAA = smoothstep(0.1, 0.1 + 0.005, stPolar.y);vec3 centerCircleColor = 1.0 - vec3(centerCircleAA);centerCircleColor /= 10.0;centerCircleColor *= colorMask;vec2 centerC = vec2(0.0);float bubbleRadius = abs(sin(iTime * 3.0)) / 3.0;float bubbleCircleColor = circle(bubbleRadius, centerC, uv);//创建一个四位结构体 x、y、z、w 或者颜色 rgbavec4 bubbleColor = vec4(vec3(bubbleCircleColor) / 10.0 * colorMask, 1.0);gl_FragColor = vec4(finalColor + centerCircleColor, 1.0);gl_FragColor += bubbleColor;}`,side: THREE.DoubleSide});const tube = new THREE.Mesh(geometry, material);//设置网格的随机位置// sphere.position.set(// (Math.random() - 0.5) * 2000,// (Math.random() - 0.5) * 1000,// (Math.random() - 0.5) * 1000// );return tube;
}onMounted(() => {initData()//添加相机空间const controls = new OrbitControls(camera, renderer.domElement);// controls.enableDamping = false;controls.enableZoom = false;// 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景controls.addEventListener('change', function () {renderer.render(scene, camera); //执行渲染操作});//监听鼠标、键盘事件renderer.setSize(width, height); //设置three.js渲染区域的尺寸(像素px)//将innerHTML置空,避免append重复添加渲染leftRef.value.innerHTML = ''leftRef.value.append(renderer.domElement);})
const initData = () => {createLight(scene);// for (let i = 1; i >= 0; i--) {const outSphere = createTube();tubes.push(outSphere);scene.add(outSphere);// }render();
}
function render() {requestAnimationFrame(render);// 旋转所有三角形// tubes.forEach(tube => {// tube.rotation.x += 0.01;// tube.rotation.y += 0.01;// tube.rotation.z += 0.01;// });console.log( 'dfffff',material.uniforms.iResolution);material.uniforms.iResolution.value.set(window.innerWidth,window.innerHeight);material.uniforms.iTime.value = performance.now() / 1000;renderer.render(scene, camera);
}
onUnmounted(() => {//释放内存renderer.dispose();
})</script>
<style scoped lang="less">
.pageBox {width: 100%;height: 100vh;padding: 0;margin: 0;display: flex;justify-content: space-between;align-items: center;.rightBox {width: 100%;height: 100%;}
}
</style>
三、总结
在学习中,重新复盘了着色器的知识点,并寻找更好掌握着色器的方法,同时了解到了glsl编程中的动态过渡、获取模型长度、计算两个元素之间距离的方法。
都看到这里了,记得【点赞】+【关注】哟。
参考文章:
Threejs实现极坐标和平滑过渡特效
相关文章:

vue+ThreeJs 创建过渡圆圈效果
嗨,我是小路。今天主要和大家分享的主题是“vueThreeJs 创建过渡圆圈效果”。 今天在做着色器过渡效果练习,发现出现了很多新的函数,这些都超出了js之外,需要更多的掌握和学习。以下是自己的复盘和梳理。 1.获取距离 定…...

MySQL:12_视图
视图 跟事务里讲的视图没有任何关系 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 一.基本使用 创建视图 create view 视图名 …...
2025 年开源 LLM 发展趋势细致解读
1. 模型性能的持续跃进与架构创新 到 2025 年,开源 LLM 在性能上不仅持续追赶,甚至在特定任务和评估基准上已经能够与顶级的闭源模型并驾齐驱或展现出独特优势。MoE (Mixture of Experts) 架构的成熟和广泛应用是这一趋势中的核心驱动力之一。 MoE (Mix…...

win11+vs2022 安装opencv 4.11.0图解教程
1. 下载opencv opencv官网下载地址:Releases - OpenCV 2. 双击运行该exe,即可进行安装,安装文件夹可自行选择 安装后目录如下: 3. 配置环境变量 使用win键搜索环境变量,选中系统变量中的Path,然后点击编辑…...

n8n 读写本地文件
1.Docker Desktop 创建容器 docker run -d --name n8n -p 5566:5678 -v D:\docker\n8n_data:/home/node/.n8n -v D:\docker\n8n_files:/home/node/Files n8nio/n8n:latest 参数说明: 1.-d :表示以 detached 模式运行容器(后台运行) 2.--name n8n :指定容器名称为n8n。 3.-p 55…...
详解3DGS
4 可微分的3D高斯 splatting 核心目标与表示选择 我们的目标是从无法线的稀疏SfM点出发,优化出一种能够实现高质量新视角合成的场景表示。为此,我们选择3D高斯作为基本图元,它兼具可微分的体表示特性和非结构化的显式表示优势,既…...
DEBUG设置为False 时,django默认的后台样式等静态文件丢失的问题
1. 处理静态文件(解决后台样式丢失) 当 DEBUG False 时,Django 不再自动处理静态文件(CSS、JS 等),需手动配置: 步骤: 配置 STATIC_ROOT 和 STATIC_URL 在 settings.py 中确保以下…...
如何提高服务器的QPS来应对618活动的并发流量
在电商行业,618大促是继双十一之后最重要的一次“流量大战”。大量用户在短时间内涌入网站下单、抢购,服务器面临前所未有的并发压力。QPS(Queries Per Second,即每秒请求数)作为衡量服务器处理能力的重要指标,直接关系到用户体验…...

LlamaFirewall:开源框架助力检测与缓解AI核心安全风险
LlamaFirewall 是一款面向大语言模型(LLM)应用的系统级安全框架,采用模块化设计支持分层自适应防御。该框架旨在缓解各类AI代理安全风险,包括越狱攻击(jailbreaking)、间接提示注入(indirect pr…...

java基础知识回顾3(可用于Java基础速通)考前,面试前均可用!
目录 一、基本算数运算符 二、自增自减运算符 三、赋值运算符 四、关系运算符 五、逻辑运算符 六、三元运算符 七、 运算符的优先级 八、小案例:在程序中接收用户通过键盘输入的数据 声明:本文章根据黑马程序员b站教学视频做的笔记,可…...
嵌入式软件架构规范之 - 分层设计
一、规范的核心思想:驱动文件的“独立性”与“复用性” 该规范的本质是通过分层隔离,实现驱动代码的高复用性、低耦合性,确保驱动模块仅关注“硬件操作逻辑”,不依赖上层业务或下层硬件接口的具体实现细节。其核心要求包括&#…...

电脑无法识别打印机usb设备怎么办 一键解决!
在当今高度数字化的工作环境中,打印机作为重要的办公设备之一,承担着文件打印、扫描等关键任务。然而,有时我们可能会遇到一个令人头疼的问题——电脑无法识别通过USB连接的打印机。这种情况不仅会影响工作效率,还可能打断正常的工…...

Elasticsearch Synthetic _source
_source 字段包含索引时传入的原始 JSON 文档体。_source 字段本身不被索引(因此不可搜索),但会被存储,以便在执行获取请求(如 get 或 search)时返回。 如果磁盘使用很重要,可以考虑以下选项&a…...

C++ -- vector
vector 1. 关于vector1.1 对比原生数组1.2 vector的核心优势 2. 扩容2.1 底层实现2.2 扩容过程 3. 构造函数4. 接口模拟实现4.1 实现迭代器4.2 扩容4.3 重载[]4.4 插入和删除4.5 构造函数和析构函数 5. 迭代器失效5.1 扩容后失效5.2 越界失效 6. 深浅拷贝 1. 关于vector 1.1 对…...
GitLab-CI简介
概述 持续集成(CI)和 持续交付(CD) 是一种流行的软件开发实践,每次提交都通过自动化的构建(测试、编译、发布)来验证,从而尽早的发现错误。 持续集成实现了DevOps, 使开发人员和运维人员从繁琐的工作中解…...

深入研究Azure 容器网络接口 (CNI) overlay
启用cni overlay 在通过portal创建aks的时候,在networking配置上,选中下面的选项即可启用。 通过CLI创建AKS 要创建具有 CNI 覆盖网络的 AKS 群集,需要在创建群集时指定 --network-plugin azure 和 --network-plugin-mode 覆盖选项。 还需要指定 --pod-cidr 选项来定义群…...

Python打卡第37天
浙大疏锦行 早停策略和模型权重的保存 作业:对信贷数据集训练后保存权重,加载权重后继续训练50轮,并采取早停策略 import torch import torch.nn as nn import pandas as pd import matplotlib.pyplot as plt import torch.optim as optim fr…...

使用 OpenCV 构建稳定的多面镜片墙效果(镜面反射 + Delaunay 分块)
✨ 效果概览 我们将实现一种视觉效果,模拟由许多小镜面拼接而成的“镜子墙”。每个镜面是一个三角形区域,其内容做镜像反射(如水平翻转),在视频中形成奇特的万花筒、哈哈镜、空间折叠感。 使用 OpenCV 实现“随机镜面…...

HTTP协议版本的发展(HTTP/0.9、1.0、1.1、2、3)
目录 HTTP协议层次图 HTTP/0.9 例子 HTTP/1.0 Content-Type 字段 Content-Encoding 字段 例子 1.0版本存在的问题:短链接、队头阻塞 HTTP/1.1 Host字段 Content-Length 字段 分块传输编码 1.1版本存在的问题 HTTP/2 HTTP/2数据传输 2版本存在的问题…...

零基础设计模式——结构型模式 - 桥接模式
第三部分:结构型模式 - 桥接模式 (Bridge Pattern) 在学习了适配器模式如何解决接口不兼容问题后,我们来看看桥接模式。桥接模式是一种更侧重于系统设计的模式,它旨在将抽象部分与其实现部分分离,使它们可以独立地变化。 核心思…...
C++对象的内存模型
C++对象的内存模型涉及对象的数据成员(包括静态成员和非静态成员)、成员函数以及虚函数表等在内存中的布局和管理方式。以下是C++对象的内存模型的主要组成部分: 1. C++对象的组成 一个C++对象通常由以下几个部分组成: 非静态数据成员 对象的核心组成部分,每个对象都有自己…...

SpringBoot3集成Oauth2.1——4集成Swagger/OpenAPI3
文章目录 访问在线文档页面配置OpenApiConfig 在我之前的文章中,写了 SpringBoot3集成OpenAPI3(解决Boot2升级Boot3) 访问在线文档页面 当我们同样在SpringBoot3使用oauth2.1也就是我之前的文章中写的。现在我们要处理下面这两个的问题了。 <!-- 使用springdoc…...

基于深度学习的情绪识别检测系统【完整版】
最近很多小伙伴都在咨询,关于基于深度学习和神经网络算法的情绪识别检测系统。回顾往期文章【点击这里】,介绍了关于人脸数据的预处理和模型训练,这里就不在赘述。今天,将详细讲解如何从零基础手写情绪检测算法和情绪检测系统。主…...
本地依赖库的版本和库依赖的版本不一致如何解决?
我用的 yarn v4 版本,所以以下教程命令都基于yarn 这里假设我报错的库名字叫 XXXXXXXX,依赖他的库叫 AAAAAAAA 排查解决思路分析: 首先查看一下 XXXXXXXX 的依赖关系,执行 yarn why XXXXXXXX 首先我们要知道 yarn 自动做了库…...

Redis学习打卡-Day7-高可用(下)
前面提到,在某些场景下,单实例存Redis缓存会存在的几个问题: 写并发:Redis单实例读写分离可以解决读操作的负载均衡,但对于写操作,仍然是全部落在了master节点上面,在海量数据高并发场景&#x…...
Spark on Yarn 高可用模式部署流程
一、引言 Spark是一个用于大规模数据分析处理的分布式计算框架,适用于快速处理大数据的场景。Yarn是一个资源调度框架,用于集群资源的调度和管理。Spark 的任务也可以提交到Yarn中运行,由Yarn进行资源调度。在生产环境中,为了避免单点故障导致整个集群不可用的情况,一个很…...
AI时代新词-大模型(Large Language Model)
一、什么是大模型? 大模型,全称为“大规模语言模型”(Large Language Model),是一种基于深度学习的人工智能技术。它通过海量的文本数据进行训练,学习语言的模式、语法和语义,从而能够生成自然…...
3d tiles高级样式设计与条件渲染
条件渲染是3D Tiles样式设置的一大亮点。我们可以通过设置不同的条件来实现复杂的视觉效果。例如,根据建筑物与某个特定点的距离来设置颜色和是否显示: tiles3d.style new Cesium.Cesium3DTileStyle({defines: {distance: "distance(vec2(${featur…...
Linux中logger命令的使用方法详解
文章目录 一、基础语法二、核心功能选项三、设施与优先级对照1. 常用设施(Facility)2. 优先级(Priority)从低到高:3. 组合示例 四、典型使用场景1. 记录简单消息2. 带标签和优先级3. 记录命令输出4. 发送到远程服…...

博奥龙Nanoantibody系列IP专用抗体
货号名称BDAA0260 HRP-Nanoantibody anti Mouse for IP BDAA0261 AbBox Fluor 680-Nanoantibody anti Mouse for IP BDAA0262 AbBox Fluor 800-Nanoantibody anti Mouse for IP ——无轻/重链干扰,更高亲和力和特异性 01Nanoantibody系列抗体 是利用噬菌体展示纳…...