<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>视差滚动 | YHK's life</title><link>https://yhk.life/tags/%E8%A7%86%E5%B7%AE%E6%BB%9A%E5%8A%A8/</link><atom:link href="https://yhk.life/tags/%E8%A7%86%E5%B7%AE%E6%BB%9A%E5%8A%A8/index.xml" rel="self" type="application/rss+xml"/><description>视差滚动</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 22 Oct 2026 00:00:00 +0000</lastBuildDate><image><url>https://yhk.life/media/icon.svg</url><title>视差滚动</title><link>https://yhk.life/tags/%E8%A7%86%E5%B7%AE%E6%BB%9A%E5%8A%A8/</link></image><item><title>That Earth · 那个地球</title><link>https://yhk.life/projects/that-earth/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://yhk.life/projects/that-earth/</guid><description>&lt;p&gt;&lt;strong&gt;That Earth&lt;/strong&gt; 是一个以 Three.js 构建的视差滚动落地页。它用一颗可以被旋转、放大、逐层剥离的三维地球，串起 That Earth 项目的三个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;现实地球&lt;/strong&gt; — 公开数据源构成的此刻（正文重点展开）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预测地球&lt;/strong&gt; — AI 气象 / 海洋模型驱动的未来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能地球&lt;/strong&gt; — 拥有记忆、推理与情景预演的数字孪生&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;它不负责计算，也不负责预测，它要解决的是另一个问题：&lt;strong&gt;怎么让一个庞大的地球项目，在打开网页的十秒内被理解。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;线上域名：&lt;code&gt;https://that.earth/&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="三个阶段一个滚动手势"&gt;三个阶段，一个滚动手势&lt;/h2&gt;
&lt;p&gt;落地页把项目的三个版本压进了一条滚动时间线里。读者不需要点开任何一个子页面，只要往下滚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现实地球&lt;/strong&gt;——由公开数据源构成的此刻，是全站正文的重点；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预测地球&lt;/strong&gt;——AI 气象与海洋模型驱动的未来；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能地球&lt;/strong&gt;——拥有记忆、推理与情景预演的数字孪生体。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同一颗球，在不同的滚动位置呈现不同的状态。这是我认为这类项目最合适的首页叙事：不去罗列功能清单，而是让读者先意识到“这是同一个地球的三个时间切片”，功能清单随后才有意义。&lt;/p&gt;
&lt;h2 id="页面结构与代码分工"&gt;页面结构与代码分工&lt;/h2&gt;
&lt;p&gt;整个站点没有框架包装，就是原生 HTML + CSS + Three.js，按职责切开：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文件&lt;/th&gt;
&lt;th&gt;职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全部语义化页面结构、三阶段文案、数据变量与数据源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/style.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;视觉系统、HUD、响应式布局与逐段显影&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/scene/World.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Three.js 世界：地球、太阳系、数据壳层、轨道、粒子与相机编排&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/scene/shaders.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;地表、云层、大气、数据层、等值面与星空的 GLSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/scene/Flow.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;风场 / 洋流粒子尾迹与闪电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/ui.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;滚动状态、固定侧栏、HUD、数据卡片与分段文案切换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/main.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;加载、启动与渲染循环&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;把 &lt;code&gt;World.js&lt;/code&gt;（场景）、&lt;code&gt;shaders.js&lt;/code&gt;（材质）、&lt;code&gt;Flow.js&lt;/code&gt;（粒子特效）、&lt;code&gt;ui.js&lt;/code&gt;（滚动与文案状态）拆开，好处是每一层都能单独调：改文案不用碰 shader，调粒子不用碰相机，换视觉不用重排 DOM。&lt;/p&gt;
&lt;h2 id="场景逻辑"&gt;场景逻辑&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;相机由滚动进度驱动。&lt;/strong&gt; 地球在章节之间左右平移，并在首屏完成“远景太阳系 → 近景地球”的推进：一开始是极简的太阳与轨道，随着滚动，地球从远处被拉到画面中央。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一阶段的数据章节使用 sticky 布局。&lt;/strong&gt; 滚动时依次激活四层数据壳——大气 / 海洋 / 地质 / 生物地球化学——上一层的壳体会从地球表面剥离、漂浮并消散。这是整个页面里最“脏”也最好看的部分：剥离动作把“很多层数据叠在同一颗球上”这件事变成了可见的物理过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后续阶段逐步加码。&lt;/strong&gt; 效果章节启用风场流线、洋流粒子尾迹与闪电；第二阶段启用等值面与线框；第三阶段出现轨道环与智能体节点。每一阶段的视觉密度都比上一阶段高一级，配合滚动节奏，正好对应“看见 → 预测 → 推演”的推进。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;合成稳定性是个真问题。&lt;/strong&gt; 这类深色、透明、多层叠加的页面，最容易在滚动时出现黑色方块或空帧。为此做了几件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;界面不使用 &lt;code&gt;backdrop-filter&lt;/code&gt; / &lt;code&gt;mix-blend-mode&lt;/code&gt; 等高风险合成层；&lt;/li&gt;
&lt;li&gt;WebGL 渲染器启用 &lt;code&gt;preserveDrawingBuffer&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;以 &lt;code&gt;translateZ(0)&lt;/code&gt; 固定画布图层；&lt;/li&gt;
&lt;li&gt;渲染管线改为直接输出：移除离屏 &lt;code&gt;EffectComposer&lt;/code&gt; / &lt;code&gt;UnrealBloomPass&lt;/code&gt;，改用 &lt;code&gt;renderer.render()&lt;/code&gt; 直出，并在自定义 shader 中内联 tone mapping 与颜色空间转换。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后一条是关键取舍：放弃 Bloom 之后，视觉并没有明显变差，但 Bloom 渲染目标在部分 GPU / 浏览器组合上产生的黑块彻底消失了。&lt;strong&gt;在“多一层后处理”和“所有人都不出 bug”之间，我选后者。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="先行复刻底部的四张卡片"&gt;先行复刻：底部的四张卡片&lt;/h2&gt;
&lt;p&gt;落地页底部的四张卡片，是对以下项目的学习、复刻与再搭建，均已部署在 That Earth 子域名：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参考项目&lt;/th&gt;
&lt;th&gt;我的线上版本&lt;/th&gt;
&lt;th&gt;源码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fluid Earth&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earth Clock&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这四个子项目分别验证了实时风场、海洋流体、地球光照与天气场等不同方向，也是 That Earth 第一阶段的重要技术积累。把它们做成卡片放在首页底部，既是致敬，也是给自己留下一条“技术来源”的索引。&lt;/p&gt;
&lt;h2 id="本地运行"&gt;本地运行&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认开发地址为 &lt;code&gt;http://127.0.0.1:5173/&lt;/code&gt;，若端口被占用，Vite 会自动切换到下一个端口。&lt;/p&gt;
&lt;p&gt;生产构建：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm preview
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;构建产物位于 &lt;code&gt;dist/&lt;/code&gt;，可直接部署到 Vercel、Netlify、Cloudflare Pages 或任意静态服务器。整个站点没有后端依赖，这也是它敢于做成“一句话域名”的原因。&lt;/p&gt;
&lt;h2 id="素材与致谢"&gt;素材与致谢&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;地表影像：NASA Blue Marble（Visible Earth，公有领域）&lt;/li&gt;
&lt;li&gt;云层影像：NASA Earth Observations (NEO)（公有领域）&lt;/li&gt;
&lt;li&gt;3D 引擎：
&lt;/li&gt;
&lt;li&gt;字体：Space Grotesk（SIL Open Font License）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="上线前还可以继续收尾的地方"&gt;上线前还可以继续收尾的地方&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;联系邮箱目前为占位地址 &lt;code&gt;hello@that.earth&lt;/code&gt;（&lt;code&gt;index.html&lt;/code&gt; 中 &lt;code&gt;mailto:&lt;/code&gt; 链接）。&lt;/li&gt;
&lt;li&gt;底部四张参考项目卡片与源码链接集中在 &lt;code&gt;index.html&lt;/code&gt; 的 &lt;code&gt;.subdomains&lt;/code&gt; / &lt;code&gt;.case-repos&lt;/code&gt; 中；若子域名或仓库地址调整，在这里同步替换。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og.jpg&lt;/code&gt; 为社交分享预览图，可按最终视觉替换。&lt;/li&gt;
&lt;li&gt;域名 DNS / 托管配置不在代码仓库内；将 &lt;code&gt;dist/&lt;/code&gt; 部署后，把 &lt;code&gt;that.earth&lt;/code&gt; 的 A/CNAME 记录指向托管服务即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;本文内容整理自项目 README，截图摄于 2026 年 10 月。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>