news 2026/3/6 5:45:16

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/3/3 14:29:31

20、SSH:强大且多功能的远程访问解决方案

SSH:强大且多功能的远程访问解决方案 1. 利用脚本建立安全VPN连接 要通过加密的SSH连接创建安全的VPN会话,可以按照以下步骤操作: 1. 保存脚本为 wee-pee-en (或其他你想要的名称),并使其可执行: chmod a+x wee-pee-en在客户端使用该脚本并通过可信VPN连接访问SS…

作者头像 李华
网站建设 2026/3/3 14:29:23

当本科生面对论文“三座大山”:选题迷茫、文献堆积、格式焦虑——书匠策AI如何用智能科研工具悄然化解

每年到了毕业季&#xff0c;高校图书馆的灯光总是亮得格外早&#xff0c;熄得格外晚。大四学生们的脸上写满了疲惫与焦虑&#xff0c;而他们面前的电脑屏幕上&#xff0c;往往只有一行孤零零的标题&#xff1a;“我的本科毕业论文”。 这并非夸张。对绝大多数本科生而言&…

作者头像 李华
网站建设 2026/3/3 14:29:25

3、Linux系统信息查找、文档编写与用户支持全解析

Linux系统信息查找、文档编写与用户支持全解析 1. Linux邮件列表 Linux有多个邮件列表,有些是通用的,有些则适用于特定的发行版。 - 加入邮件列表 :若要加入 comp.os.linux.announce 的邮件列表镜像,可发送邮件至 Linux-Announce-Request@NEWS-DIGESTS.MIT.EDU ,…

作者头像 李华
网站建设 2026/3/3 14:29:26

6、Linux文件系统:全面指南

Linux文件系统:全面指南 1. 分区操作收尾与文件系统命名 在完成分区定义后,可以通过 w 命令退出 fdisk 并将更改保存到分区表。若不想保存更改,使用 q 命令退出即可。 接下来,要为每个打算使用的分区关联合适的Linux文件系统名称,这可通过特定发行版的安装程序完…

作者头像 李华
网站建设 2026/2/25 19:14:15

HoRain云--Nginx性能优化实战:从入门到精通

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/3/3 14:29:26

基于springboot + vue奶茶销售服务管理平台系统

奶茶销售服务管理平台 目录 基于springboot vue奶茶销售服务管理平台系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue奶茶销售服…

作者头像 李华