尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Three.js 点星感谢教程
点星感谢 ·Text Star· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么ShaderMaterial 自定义着色器实现核心视觉效果监听窗口resize同步更新 camera 与 renderer效果说明本案例演示点星感谢效果基于 WebGL 实现「点星感谢」可视化效果附完整可运行源码核心用到 ShaderMaterial。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Scene / Camera / WebGLRenderer构成最小渲染闭环大场景可开logarithmicDepthBuffer缓解 Z-fighting。ShaderMaterial通过uniforms 自定义 GLSL 控制逐像素/逐点效果透明粒子常配合depthTest: false。阅读下方完整源码时建议从init/load/animate三条主线入手再深入 shader 与工具函数。实现步骤搭建 Scene、PerspectiveCamera、WebGLRenderer挂载 canvas 并处理resize定义 uniforms / onBeforeCompile 或 ShaderMaterial编写 GLSL 与材质参数在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as THREE from three;import { TrackballControls } from three/addons/controls/TrackballControls.js; import { TessellateModifier } from three/addons/modifiers/TessellateModifier.js; import { FontLoader } from three/addons/loaders/FontLoader.js; import { TextGeometry } from three/addons/geometries/TextGeometry.js;const data await new Promise((r) { fetch(https://api.github.com/repos/z2586300277/three-cesium-examples).then(res res.json()).then(d r(d)) setTimeout(() r({ stargazers_count: 230, forks_count: 40 }), 1000) })let mesh, uniforms, renderer, scene, camera, controls;const loader new FontLoader() loader.load(FILE_HOST files/json/font.json, font init(font))const text three-cesium-examplesStars ${data.stargazers_count} Fork ${data.forks_count}Thanks for your starfunction init(font) {camera new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 1, 10000); camera.position.set(100, 400, 600);scene new THREE.Scene(); scene.background new THREE.Color(0x050505);let geometry new TextGeometry(text, { font: font, size: 30, depth: 5, curveSegments: 3, bevelThickness: 2, bevelSize: 1, bevelEnabled: true })geometry.center(); const tessellateModifier new TessellateModifier(4, 3); geometry tessellateModifier.modify(geometry); const numFaces geometry.attributes.position.count / 3; const colors new Float32Array(numFaces33); const displacement new Float32Array(numFaces33); const color new THREE.Color();for (let f 0; f numFaces; f) { const index 9 * f; if (Math.random() 0.5) {const h 0.2 * Math.random(); const s 0.5 0.5 * Math.random(); const l 0.5 0.5 * Math.random();color.setHSL(h, s, l); } else color.set(0xa58fb5); const d 60 * (0.5 - Math.random()); for (let i 0; i 3; i) { colors[index (3 * i)] color.r; colors[index (3 * i) 1] color.g; colors[index (3 * i) 2] color.b; displacement[index (3 * i)] d; displacement[index (3 * i) 1] d; displacement[index (3 * i) 2] d; } }geometry.setAttribute(customColor, new THREE.BufferAttribute(colors, 3)); geometry.setAttribute(displacement, new THREE.BufferAttribute(displacement, 3));uniforms { amplitude: { value: 0.0 }, opacityf: { value: 0.8 } }const shaderMaterial new THREE.ShaderMaterial({ uniforms: uniforms, vertexShader:uniform float amplitude; attribute vec3 customColor; attribute vec3 displacement; varying vec3 vNormal; varying vec3 vColor; varying vec2 vUv; void main() { vUv uv; vNormal normal; vColor customColor; vec3 newPosition position normalamplitudedisplacement; gl_Position projectionMatrixmodelViewMatrixvec4( newPosition, 1.0 ); }, fragmentShader:varying vec3 vNormal; varying vec3 vColor; varying vec2 vUv; uniform float opacityf; uniform float amplitude; void main() {vec2 uv vUv; float iTime amplitude; vec3 wave_color vec3(0.0); float wave_width 0.0; for(float i 0.0; i 28.0; i) { uv.y (0.2(0.9sin(iTime0.4)sin(uv.x i/3.0 3.0iTime ))); uv.x 1.7sin(iTime0.4); wave_width abs(1.0 / (200.0abs(cos(iTime))uv.y)); wave_color vec3(wave_width( 0.4((i1.0)/18.0)), wave_width(i / 9.0), wave_width((i1.0)/ 8.0)1.9); } const float ambient 0.4; vec3 light vec3( 1.0 ); light normalize( light ); float directional max( dot( vNormal, light ), 0.0 ); gl_FragColor vec4( mix(( directional ambient ) * vColor, wave_color, 0.6), opacityf ); }, transparent: true, wireframe: true, wireframeLinewidth: 4 }) mesh new THREE.Mesh(geometry, shaderMaterial); scene.add(mesh);renderer new THREE.WebGLRenderer({ antialias: true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setAnimationLoop(render); document.body.appendChild(renderer.domElement); controls new TrackballControls(camera, renderer.domElement) window.addEventListener(resize, onWindowResize);}function onWindowResize() { camera.aspect window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); }function render() { uniforms.amplitude.value Math.sin(Date.now() * 0.001); controls.update(); renderer.render(scene, camera); }完整源码GitHub小结本文提供点星感谢完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
RELATED

相关推荐

GEO服务商评估标准详解:技术体系、SOP流程与多平台覆盖能力横评

GEO服务商评估标准详解:技术体系、SOP流程与多平台覆盖能力横评

企业在选择GEO(Generative Engine Optimization)服务商时,核心判断标准不是“能否写AI提示词”,而是是否具备针对主流大模型的结构化内容优化能力、可验证的交付SOP以及跨平台监测体系。当前企业AI推广已从早期的概念测试进入实效…

📅 2026/11/9 2:36:43
三相逆变器零序电压注入 PWM 调制:从 SVPWM 到 5 段发波的 3 种实现方案对比

三相逆变器零序电压注入 PWM 调制:从 SVPWM 到 5 段发波的 3 种实现方案对比

三相逆变器零序电压注入PWM调制:三种实现方案的工程实践对比在电机驱动和电力电子领域,PWM调制技术一直是研究的核心。传统的SVPWM虽然性能稳定,但在某些应用场景下,其开关损耗和噪声表现仍有优化空间。零序电压注入技术作为一种高…

📅 2026/9/11 16:21:58
健身行业同城引流,低投入高回报方案

健身行业同城引流,低投入高回报方案

健身房的流量,别再花在“烧钱刷曝光”上了 做健身的老板,你算过一笔账没?投了五万买同城流量,真正到店办卡的,也许就五个人。这不叫引流,这叫“用真金白银换了个寂寞”。 亲身踩过的坑。我自己的店&#…

📅 2026/9/11 16:24:51
MORE NEWS

更多资讯

📰

电工作业的防火要求全流程办理指南,电子证书怎么拿更靠谱?

电工作业的防火要求全流程办理指南,电子证书怎么拿更靠谱? 怕考不过白交培训费?别急,先搞清楚电工作业的防火要求,别让证书和培训费打了水漂。现在市面上的培训机构鱼龙混杂,很多人辛辛苦苦交了钱,结果培训没学明白,考试也考不过,电子证书更是拿不到…

📰

报考高级高压电工证多久拿证?别被中介坑了,这几点必须知道

报考高级高压电工证多久拿证?别被中介坑了,这几点必须知道 你是不是正准备报考高级高压电工证,但不知道从哪报名?怕被中介坑?别急,这篇文章帮你把关,从报名流程、证书有效期、拿证时间、考试要求,到河南本地的政策和实际案例,一网打尽,带你少走弯路…

📰

广西报考电工证在哪里?官方报名入口怎么找?

广西报考电工证在哪里?官方报名入口怎么找? 你是不是也正为“急需特种作业证才能上岗找工作”而发愁?电工证作为特种作业操作证的一种,是很多工程类岗位的“入场券”。在广西,想考电工证,第一步就是找到官方报名入口。但很多人对流程不熟悉,容易走弯路…

📰

考个电工证有难在哪考才能顺利上岗

考个电工证有难在哪考才能顺利上岗 你现在要找电工相关的工作,但手里没证,连面试机会都没有。 考个电工证有难在哪考 ,这个问题是很多求职者最关心的。别急,这篇文章就帮你把流程讲清楚,让你知道怎么操作、在哪里考,以及为什么这个证这么关键。…

📰

电工证在哪个网查真伪郑州报考避坑指南

电工证在哪个网查真伪郑州报考避坑指南 证书过期了不知道怎么复审延期,这事儿我见过太多人犯,尤其是像你这样刚入行的电工师傅,手里的证要是过期了,不光是干不了活,连找活都困难。今天就从一个真实案例说起,讲讲 电工证在哪个网查真伪 ,顺便把…

📰

山东高压电工证怎么审值不值得考

山东高压电工证怎么审值不值得考 之前考的证在外省能不能转过来?这个问题我听得太多了,尤其是从河南信阳过来的学员,不少人都在问,自己在外地考的电工证能不能在山东用,还能不能在山东复审。其实很多人压根不清楚,高压电工证的复审流程、转证条件,甚至…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬