news 2026/6/10 14:27:28

Three.js 3D 炫酷特效:教你用 100 行代码写一个“流浪地球”风格的 3D 地球仪

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Three.js 3D 炫酷特效:教你用 100 行代码写一个“流浪地球”风格的 3D 地球仪

🌍 前言:前端的尽头是图形学?

你是否厌倦了每天写<div><span>和 CRUD?
在 2025 年,普通的 React/Vue 开发者已成红海,但掌握 3D 可视化的前端工程师依然稀缺,薪资通常高出 30%~50%。

今天,我们不讲复杂的数学公式,直接动手。用Three.js配合几张贴图,在浏览器里复刻一个**“流浪地球”风格的科幻地球仪**。
它包含:真实地形凹凸、海洋高光、大气层光晕、以及星空背景。

先看原理,再撸代码。


🧠 核心原理:地球不是一个“球”

在 3D 渲染中,想要逼真,不能只放一张照片。我们需要把地球拆解成**“图层”**。

这就像 PS 的图层叠加,我们需要由内而外构建 4 层结构:

graph TD Core[核心:球体 Geometry] --> Material[材质 Material] subgraph 纹理贴图层 Material -- 1. 基础颜色 --> Map[Diffuse Map: 决定陆地海洋颜色] Material -- 2. 地形凹凸 --> BumpMap[Bump Map: 决定山脉高度] Material -- 3. 海洋反光 --> SpecularMap[Specular Map: 让海洋反光 陆地不反光] end subgraph 大气层特效 Core -- 叠加 --> Cloud[云层: 独立的透明球体] Cloud -- 叠加 --> Glow[光晕: Shader 或 精灵图] end style Map fill:#e1f5fe,stroke:#01579b style Glow fill:#fff9c4,stroke:#fbc02d

🛠️ 实战代码:100 行的奇迹

为了方便大家直接运行,我使用了 CDN 引入 Three.js,你可以直接创建一个index.html并在浏览器打开。

准备工作:
我们需要 3 张核心贴图(文末有获取方式):

  1. earth.jpg(地球卫星图)
  2. bump.jpg(灰度图,越白的地方越高)
  3. specular.jpg(黑白图,海洋是白色的,陆地是黑色的)

完整源码:

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Three.js Wandering Earth</title><style>body{margin:0;overflow:hidden;background-color:#000;}</style><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script></head><body><divid="canvas-container"></div><script>// 1. 初始化场景、相机、渲染器constscene=newTHREE.Scene();// 雾化效果,模拟宇宙深处的幽暗scene.fog=newTHREE.FogExp2(0x000000,0.0008);constcamera=newTHREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);camera.position.z=15;// 相机距离constrenderer=newTHREE.WebGLRenderer({antialias:true});// 抗锯齿renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);// 2. 创建地球材质 (核心!)consttextureLoader=newTHREE.TextureLoader();constearthGeometry=newTHREE.SphereGeometry(5,64,64);// 半径5,高精度网格constearthMaterial=newTHREE.MeshPhongMaterial({map:textureLoader.load('https://raw.githubusercontent.com/mrdoob/three.js/master/examples/textures/planets/earth_atmos_2048.jpg'),// 基础图bumpMap:textureLoader.load('https://raw.githubusercontent.com/mrdoob/three.js/master/examples/textures/planets/earth_normal_2048.jpg'),// 凹凸图bumpScale:0.15,// 凹凸程度specularMap:textureLoader.load('https://raw.githubusercontent.com/mrdoob/three.js/master/examples/textures/planets/earth_specular_2048.jpg'),// 高光图specular:newTHREE.Color('grey'),// 高光颜色shininess:10// 光泽度});constearth=newTHREE.Mesh(earthGeometry,earthMaterial);scene.add(earth);// 3. 创建大气层光晕 (简单的 Shader 模拟)constatmosphereGeo=newTHREE.SphereGeometry(5.3,64,64);constatmosphereMat=newTHREE.MeshPhongMaterial({color:0x00aaff,// 科幻蓝transparent:true,opacity:0.2,side:THREE.BackSide,// 渲染背面,制造边缘发光感blending:THREE.AdditiveBlending// 叠加混合模式});constatmosphere=newTHREE.Mesh(atmosphereGeo,atmosphereMat);scene.add(atmosphere);// 4. 打光 (科幻感的关键)constambientLight=newTHREE.AmbientLight(0x333333);// 环境微光scene.add(ambientLight);constsunLight=newTHREE.DirectionalLight(0xffffff,1);// 模拟太阳光sunLight.position.set(5,3,5);scene.add(sunLight);// 5. 满天星斗 (粒子系统)conststarGeo=newTHREE.BufferGeometry();conststarCount=2000;constposArray=newFloat32Array(starCount*3);for(leti=0;i<starCount*3;i++){posArray[i]=(Math.random()-0.5)*100;// 随机分布}starGeo.setAttribute('position',newTHREE.BufferAttribute(posArray,3));conststarMat=newTHREE.PointsMaterial({color:0xffffff,size:0.05});conststarMesh=newTHREE.Points(starGeo,starMat);scene.add(starMesh);// 6. 动画循环functionanimate(){requestAnimationFrame(animate);// 地球自转earth.rotation.y+=0.002;atmosphere.rotation.y+=0.002;// 星空缓慢旋转starMesh.rotation.y-=0.0005;renderer.render(scene,camera);}animate();// 窗口自适应window.addEventListener('resize',()=>{camera.aspect=window.innerWidth/window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth,window.innerHeight);});</script></body></html>

运行图如下


🎨 代码解析:为什么这么写才“炫”?

  1. MeshPhongMaterial
    这是 Three.js 中用于模拟有光泽表面的材质。
    如果不加specularMap(高光贴图),整个地球会像一个塑料球一样反光。加了之后,你会发现只有海洋在反光,陆地是哑光的,真实感瞬间提升 10 倍。
  2. AdditiveBlending (叠加混合)
    在做大气层(atmosphere)时,我们用了一个比地球稍大的球体,并开启了AdditiveBlending。这意味着它的颜色会和背景叠加变亮,从而模拟出发光、通透的空气感,这是科幻风格的精髓。
  3. 粒子星空
    不要用一张星空图片做背景,那样太死板。用THREE.Points生成 2000 个随机点,让它们缓慢反向旋转,整个场景就**“活”**过来了。

🚀 进阶:如何做得更像电影级?

上面的代码只是基础版。如果你想达到大屏可视化交付的标准,还需要加入:

  1. 后期处理 (Post-Processing)
    使用UnrealBloomPass(辉光通道),让地球边缘的蓝色光晕产生“溢出”的效果,就像电影镜头拍摄的那样。
  2. 着色器 (Shaders)
    用 GLSL 手写 Shader,实现大气散射 (Rayleigh Scattering),这样日出日落的边缘会有真实的橙红色渐变。
  3. 交互控制
    引入OrbitControls,允许用户缩放、旋转查看细节。

📝 总结

Web 3D 技术并没有想象中那么难,它更多的是对**“图层、光影、材质”**的理解。
当你能用 100 行代码手搓出一个地球时,你在面试官眼里的等级,已经从“切图仔”升级到了“图形工程师”。

不要停留在 2D 的舒适区,升维打击才是王道。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:17:44

24、计算机技术术语与Linux认证全解析

计算机技术术语与Linux认证全解析 在计算机技术的领域中,有着众多专业术语和认证体系,了解这些内容对于深入学习和从事相关工作至关重要。下面将为大家详细介绍一些常见的计算机术语以及Linux专业认证的相关信息。 常见计算机术语解析 访问(access) :连接并使用设备,…

作者头像 李华
网站建设 2026/6/10 9:53:01

NotebookLM 分享笔记

NotebookLM 分享笔记&#xff1a;您的私人 AI 研究助理 Google NotebookLM | AI 研究工具与思考伙伴 NotebookLM 是 Google 推出的一款以 AI 为核心的专业研究与笔记工具。它与通用型聊天机器人&#xff08;如 Gemini&#xff09;的核心区别在于&#xff0c;它不是在公共网络…

作者头像 李华
网站建设 2026/6/9 13:33:35

notepad++ 安装

下载地址 https://github.com/notepad-plus-plus/notepad-plus-plus/releases/tag/v8.8.9

作者头像 李华
网站建设 2026/6/9 20:51:17

2026毕设ssm+vue基于的智慧酒店系统论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容关于酒店客房管理系统的研究&#xff0c;现有研究主要以单体酒店或传统 C/S 架构为主&#xff0c;专门针对“SSM&#xff08;SpringSpringM…

作者头像 李华
网站建设 2026/6/10 9:51:29

2025年休闲解压台球手游成新宠,究竟好玩在哪?

在快节奏的现代生活中&#xff0c;人们对于休闲解压的需求日益增长。2025年&#xff0c;休闲解压台球手游成为了新宠&#xff0c;其中《天天台球》更是备受瞩目&#xff0c;那么这类手游究竟好玩在哪呢&#xff1f;真实体验&#xff0c;还原赛场氛围《天天台球》最大的亮点之一…

作者头像 李华