给“拉票”加点WebGL:我做了个能拖拽旋转的3D星图,每一面墙都是我的代码故事(附完整源码) | 博客之星求投票

文章目录

  • 前言
  • 一、网页效果预览
  • 二、功能和交互式体验
  • 三、 技术实现详解
    • 1. 技术栈
    • 2. 分级渲染策略
    • 3. Three.js 3D场景搭建
      • 3.1 粒子系统(星空背景)
      • 3.2信息墙面(数据展示)
      • 3.3 光线效果
    • 4. 数据管理与模态窗口
  • 四、完整代码
  • 五、我的拉票心声
  • 六、投票方式:
  • 七、 最后想说

前言

CSDN博客之星年度评选投票再度开启,紧张刺激的时刻如期而至。今年我荣幸入选TOP 300,首次以候选人身份参与这场技术人的年度盛会。

观察过往的拉票方式,无论是转发链接、群发文字,还是发红包、送礼物,似乎都已显得常规。作为一名开发者,我不禁思考:为什么不将技术创作本身,变成拉票的媒介呢?

于是这一次,我决定不仅用文字,更想用代码来表达——我花了一些时间,基于 Three.js 制作了一个互动式 3D 星图拉票页面。它不只是拉票工具,更是我在CSDN创作历程的可视化呈现。希望它能为你带来不一样的投票体验,也让你看见:技术,可以让表达更有趣。

如果你也喜欢这种“用代码说话”的方式,欢迎体验这个小小作品,并为我投上一票。


一、网页效果预览

如果技术人有浪漫,那大概就是把抽象的付出,变成一片可触碰的星空。


点击这里在线体验

二、功能和交互式体验


这不是一张静态图片。它是一个活着的、呼吸的微型宇宙。

  • 星空粒子背景:由5000颗(低性能设备自适应为1500颗)粒子组成的星云,持续缓缓脉动。

  • 悬浮数据墙面:8面可交互的3D墙面,清晰展示着我的关键博客数据。

  • 实时交互:鼠标拖拽旋转视角,滚轮缩放探索细节,触摸设备亦可流畅操作。

  • 响应式设计:适配PC和移动端,在华丽与流畅间取得平衡。

三、 技术实现详解

1. 技术栈

整个项目采用原生HTML+CSS+JavaScript实现,核心3D渲染使用Three.js。

2. 分级渲染策略

针对移动端和pc端做了不同渲染策略,保证移动端运行流畅。

// 设备性能检测detectLowEndDevice(){constcanvas=document.createElement('canvas');constgl=canvas.getContext('webgl2')||canvas.getContext('webgl');if(!gl)returntrue;constdebugInfo=gl.getExtension('WEBGL_debug_renderer_info');constrenderer=debugInfo?gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL):'';constisMobile=/iPhone|iPad|iPod|Android/i.test(navigator.userAgent);constisLowEndGPU=/Mali|Adreno|Mesa/i.test(renderer);constisLowMemory=navigator.deviceMemory&&navigator.deviceMemory<4;returnisMobile||isLowEndGPU||isLowMemory;}
// 根据设备性能调整渲染质量init(){constisLowEnd=this.detectLowEndDevice();this.renderer.setPixelRatio(Math.min(window.devicePixelRatio,1.2));this.createOptimizedParticles(isLowEnd);this.createLightBeams(isLowEnd);this.setupLighting(isLowEnd);}

3. Three.js 3D场景搭建

3.1 粒子系统(星空背景)

动态设置粒子数:
低端设备(检测为低性能时):1500个粒子
高端设备:5000个粒子

//创建粒子系统createOptimizedParticles(isLowEnd){constparticleCount=isLowEnd?1500:5000;constpositions=newFloat32Array(particleCount*3);constcolors=newFloat32Array(particleCount*3);constsizes=newFloat32Array(particleCount);for(leti=0;i<particleCount;i++){consti3=i*3;constradius=Math.pow(Math.random(),0.7)*80+20;constangle=Math.random()*Math.PI*2;constheight=(Math.random()-0.5)*40;positions[i3]=radius*Math.cos(angle);positions[i3+1]=height;positions[i3+2]=radius*Math.sin(angle);colors[i3]=0.2+Math.random()*0.3;colors[i3+1]=0.4+Math.random()*0.4;colors[i3+2]=0.8+Math.random()*0.2;sizes[i]=Math.random()*4+1;}constgeometry=newTHREE.BufferGeometry();geometry.setAttribute('position',newTHREE.BufferAttribute(positions,3));geometry.setAttribute('color',newTHREE.BufferAttribute(colors,3));geometry.setAttribute('size',newTHREE.BufferAttribute(sizes,1));constmaterial=newTHREE.ShaderMaterial({uniforms:{uTime:{value:0},uPixelRatio:{value:Math.min(window.devicePixelRatio,1.2)}},vertexShader:`attribute float size; attribute vec3 color; varying vec3 vColor; uniform float uTime; uniform float uPixelRatio; void main() { vColor = color; vec3 pos = position; pos.y += sin(uTime + position.x * 0.01) * 0.3; vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0); gl_PointSize = size * uPixelRatio * (400.0 / -mvPosition.z); gl_Position = projectionMatrix * mvPosition; }`,fragmentShader:`varying vec3 vColor; void main() { float dist = distance(gl_PointCoord, vec2(0.5)); if (dist > 0.5) discard; float alpha = 1.0 - smoothstep(0.0, 0.5, dist); alpha *= 0.7; gl_FragColor = vec4(vColor, alpha); }`,transparent:true,blending:THREE.AdditiveBlending,depthWrite:false});constparticles=newTHREE.Points(geometry,material);this.particles.push(particles);this.scene.add(particles);}

3.2信息墙面(数据展示)

每个墙面都是一个独立的3D平面,采用Canvas动态生成纹理:

//创建墙面createEnhancedTexture(){constcanvas=document.createElement('canvas');canvas.width=512;canvas.height=384;constctx=canvas.getContext('2d');constgradient=ctx.createLinearGradient(0,0,512,384);gradient.addColorStop(0,'rgba(0, 0, 0, 0.95)');gradient.addColorStop(0.5,'rgba(10, 5, 20, 0.85)');gradient.addColorStop(1,'rgba(0, 15, 20, 0.9)');ctx.fillStyle=gradient;ctx.fillRect(0,0,512,384);// 半透明边框ctx.strokeStyle=this.data.color+'60';ctx.lineWidth=3;ctx.shadowColor=this.data.color;ctx.shadowBlur=15;ctx.strokeRect(6,6,500,372);ctx.shadowBlur=0;ctx.font='bold 70px Arial';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillStyle=this.data.color;ctx.shadowColor=this.data.color;ctx.shadowBlur=20;ctx.fillText(this.data.icon,256,90);ctx.shadowBlur=0;ctx.font='bold 52px -apple-system, BlinkMacSystemFont, sans-serif';ctx.fillStyle='#00ffff';ctx.shadowColor='#00ffff';ctx.shadowBlur=15;ctx.fillText(this.data.value,256,200);ctx.shadowBlur=0;ctx.font='26px -apple-system, BlinkMacSystemFont, sans-serif';ctx.fillStyle='#ffffff';ctx.fillText(this.data.title,256,290);returncanvas;}

3.3 光线效果

为重要数据(如阅读量、粉丝数)添加了动态光束:

//创建光束createLightBeams(isLowEnd){if(isLowEnd){this.lightBeams=[];return;}constbeamIds=['read','fans'];this.walls.forEach((wall,index)=>{if(beamIds.includes(wall.data.id)){constgeometry=newTHREE.CylinderGeometry(0.3,3,35,8,1,true);constmaterial=newTHREE.MeshBasicMaterial({color:wall.data.color,transparent:true,opacity:0.06,side:THREE.DoubleSide,blending:THREE.AdditiveBlending});constbeam=newTHREE.Mesh(geometry,material);beam.position.copy(wall.mesh.position);beam.position.y+=18;beam.rotation.z=Math.PI;beam.userData={originalOpacity:0.06};this.lightBeams.push(beam);this.scene.add(beam);}});}

4. 数据管理与模态窗口

所有博客数据都存储在BLOG_STAR_DATA对象中,点击墙面时会显示详细信息的模态窗口:

showDetailModal(data){// 动态填充数据document.getElementById('detailIcon').textContent=data.icon;document.getElementById('detailTitle').textContent=data.title;document.getElementById('detailValue').textContent=data.value;document.getElementById('detailDescription').innerHTML=data.detail;document.getElementById('detailThanks').textContent=data.thanks;// 显示模态窗口modal.style.display='block';}


四、完整代码

git clone https://gitcode.com/sd1sd2/3d_Vote.git

五、我的拉票心声


做这个页面不仅仅是为了拉票,更是想展示技术人的浪漫——我们用代码构建世界,用算法描绘星空。

在CSDN的5年多创作历程中,我写了130+篇原创文章,收获了2.2万+粉丝的支持,总阅读量超过39万次。每篇文章都凝聚着我的心血,都源于实战的打磨、经验总结、反复的调试与无私的分享。您的一票,便是对我这些年坚持创作最好的认可。这次评选,对我来说不只是荣誉。我想证明一件事:坚持技术分享是有价值的,用心写的内容会被看见。

六、投票方式:

  • 点击这个按钮前往投票
  • 每天都可以投票(根据你的码龄、博客等级决定投票数,可以把所有票投给同一个用户)
  • 2025年12月21日之后注册用户、未发布过原创文章,无权投票。
  • 投票截止:2026年1月23日 23:59:59

如果你愿意多帮一点

  • 把星空页面分享给你的技术群

  • 把文章分享给你觉得可能感兴趣的朋友

  • 如果你也是入围的博主,我们也可以互投


七、 最后想说

感谢你花费时间,阅读至此,甚至体验了那个小小的星空。技术之路,犹如星空探索,浩瀚无垠又充满惊喜。感谢每一位在技术路上同行的伙伴,感谢CSDN这个让我们相遇的平台。

技术人的浪漫,就是把抽象的逻辑变成可视的美感。 我把我的技术足迹变成了星空,现在,我想邀请你成为这片星空里的一颗光点。

你的每一票,都会让这个星空更亮一点。

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

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

相关文章

AI | AI4UI(2025.12)| 论文:Beyond Prototyping: Autonomous, Enterprise-Grade Frontend Development

Beyond Prototyping: Autonomous, Enterprise-Grade Frontend Development from Pixel to Production via a Specialized Multi-Agent Framework 超越原型设计&#xff1a;通过专用多智能体框架&#xff0c;实现从像素到生产环境的自主企业级前端开发 论文链接 主要贡献: 结…

金仓数据库KingbaseES IO性能优化指南

在数据库运维的日常工作中,IO性能绝对是影响系统“跑得快不快、稳不稳”的关键因素。按木桶原理来说,IO子系统要是拖后腿,哪怕CPU、内存再强悍也没用。尤其是金仓数据库KingbaseES扛着高并发事务、海量数据查询这类…

ssm695新型药物临床药品治疗方案信息管理系系统vue

目录项目背景技术架构核心功能模块创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目背景 SSM695新型药物临床药品治疗方案信息管理系统基于Vue.js前端框架与SpringSpringMVCMyBatis&#xff08;SSM&#xff0…

VMware vSphere 网络+存储

vSphere 网络整体架构: 物理交换机 │vmnic(ESXi 主机物理网卡) │vSwitch / DVS │Port Group │虚拟机 / VMkernel对象 本质vmnic 物理网卡vSwitch 软件交换机DVS(Distributed Virt…

基于SpringBoot+Vue.is的社区服务平台管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计并实现一套基于SpringBootVue.js的社区服务平台管理系统&#xff0c;以解决传统社区管理中服务流程繁琐、居民诉求响应滞后、信息传递不畅、资源调度低效等痛点&#xff0c;助力社区服务数字化、管理精细化、互动便捷化升级。系统采用前后端分离架构&…

交通仿真软件:VISSIM_(14).事故与异常情况模拟

事故与异常情况模拟 在交通仿真软件中&#xff0c;事故与异常情况的模拟是评估交通系统在极端条件下的性能和安全性的关键部分。通过模拟事故和异常情况&#xff0c;可以研究交通流的动态变化、驾驶员的行为反应以及交通管理措施的有效性。本节将详细介绍如何在VISSIM中模拟事故…

ssm687网上购物超市系统vue

目录网上购物超市系统&#xff08;Vue版&#xff09;摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;网上购物超市系统&#xff08;Vue版&#xff09;摘要 该系统基于Vue.js前端框架与SSM&#xff08;SpringSpringMVCMyBat…

ssm688校园安全管理系统

目录SSM688校园安全管理系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM688校园安全管理系统摘要 校园安全管理系统基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发&#xff0c;旨在通过信息化手段…

基于Springboot+Vue的爱琴海购物公园网上商城系统(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计并实现一套基于SpringBootVue的爱琴海购物公园网上商城系统&#xff0c;以解决传统商场线上线下割裂、品牌商户营销渠道单一、用户购物体验不连贯、运营数据碎片化等痛点&#xff0c;搭建集商品销售、品牌运营、O2O服务、数据管控于一体的新零售服务平台…

全球股市估值与人口结构变化的关系

全球股市估值与人口结构变化的关系 关键词:全球股市估值、人口结构变化、经济增长、消费需求、投资偏好 摘要:本文旨在深入探讨全球股市估值与人口结构变化之间的关系。通过对相关核心概念的阐述、算法原理的分析、数学模型的构建以及实际案例的研究,揭示人口结构变化如何从…

救命神器2026!9大AI论文平台测评:本科生毕业论文救星

救命神器2026&#xff01;9大AI论文平台测评&#xff1a;本科生毕业论文救星 2026年AI论文平台测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI在学术写作领域的应用越来越广泛。然而&#xff0c;面对市场上琳琅满目的AI论文平台&…

ssm689医药网上药品商城销售管理系统vue

目录SSM689医药网上药品商城销售管理系统Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM689医药网上药品商城销售管理系统Vue摘要 该系统基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架与Vue.js前端技…

交通仿真软件:VISSIM_(17).智能交通系统(ITS)建模

智能交通系统(ITS)建模 智能交通系统&#xff08;ITS&#xff09;是现代交通管理的重要组成部分&#xff0c;利用先进的信息技术、数据通信传输技术、电子传感技术、控制技术和计算机技术等&#xff0c;对交通系统进行全方位的管理和控制。在交通仿真软件中&#xff0c;ITS建模…

提示工程架构师揭秘:Agent交互提示链设计的内幕

提示工程架构师揭秘&#xff1a;Agent交互提示链设计的内幕 1. 引入与连接&#xff1a;为什么有些Agent像“没听懂话”&#xff1f; 一个让用户崩溃的对话场景 某天&#xff0c;你想订一家海边酒店&#xff0c;打开旅游APP的智能助手Agent&#xff0c;对话如下&#xff1a; 你&…

ssm692手机销售库存管理系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 SSM692手机销售库存管理系统基于Vue.js前端框架与Spring、Spring MVC、MyBatis&#xff08;SSM&#xff09;后端架构开发&…

搞定模型版本管理提速

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 智能缓存与增量更新&#xff1a;模型版本管理的提速革命目录智能缓存与增量更新&#xff1a;模型版本管理的提速革命 引言 现有挑战&#xff1a;版本管理的系统性瓶颈 智能缓存机制&…

ssm694网上家教管理系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 SSM694网上家教管理系统是基于Vue.js前端框架与SSM&#xff08;SpringSpringMVCMyBatis&#xff09;后端架构开发的在线教…

交通仿真软件:VISSIM_(13).交通仿真数据处理与分析

交通仿真数据处理与分析 在交通仿真软件VISSIM中&#xff0c;数据处理与分析是确保仿真结果准确性和有效性的关键步骤。本节将详细探讨如何在VISSIM中进行数据处理与分析&#xff0c;包括数据的导入、预处理、仿真结果的导出以及如何使用外部工具进行进一步分析。 数据导入 1. …

ssm681网络教学系统vue

目录SSM681网络教学系统Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM681网络教学系统Vue摘要 SSM681网络教学系统是基于Spring、SpringMVC、MyBatis&#xff08;SSM&#xff09;框架与Vue.js前端技术构建的现代化…

大数据领域的Flink技术应用

大数据领域的Flink技术应用:从流水线到实时决策的魔法工厂 关键词:Flink、流处理、实时计算、事件时间、窗口计算、状态管理、大数据 摘要:在这个“数据爆炸”的时代,企业需要像“读秒”一样快速从数据中挖掘价值。Apache Flink作为大数据领域的“实时计算王者”,凭借其低…