React+Three.js 实现 Apple 热成像 logo
React Three.js 实现 Apple 热成像 Logo引言热成像效果是一种通过颜色渐变来表现温度分布的可视化技术在工业检测、医疗影像和艺术创作中都有广泛应用。本文将带你从零开始使用 React 和 Three.js 构建一个动态的 Apple logo 热成像效果。我们将从基础概念出发逐步深入最终实现一个可交互的 3D 场景。## 一、基础概念Three.js 与 React 的结合Three.js 是一个基于 WebGL 的 3D 图形库而 React 是流行的前端框架。通过react-three/fiber和react-three/drei这两个库我们可以将 Three.js 的声明式 API 无缝集成到 React 组件中。### 核心组件介绍-Canvas: 提供 Three.js 渲染上下文-Mesh: 代表 3D 物体包含几何体geometry和材质material-ShaderMaterial: 允许自定义着色器实现热成像效果的关键## 二、环境搭建与基础场景首先我们需要安装必要的依赖包。创建一个新的 React 项目然后安装bashnpm install three react-three/fiber react-three/drei接下来我们创建一个基础场景包含一个简单的 3D 物体jsx// App.jsx - 基础 Three.js 场景import React from react;import { Canvas } from react-three/fiber;import { OrbitControls } from react-three/drei;// 定义一个简单的立方体组件function Box() { return ( mesh {/* 几何体长方体 */} boxGeometry args{[2, 2, 2]} / {/* 材质标准材质带颜色 */} meshStandardMaterial colorhotpink / /mesh );}export default function App() { return ( div style{{ width: 100vw, height: 100vh }} {/* Canvas 是 Three.js 的渲染容器 */} Canvas camera{{ position: [0, 0, 5] }} {/* 环境光提供基础照明 */} ambientLight intensity{0.5} / {/* 点光源提供方向性照明 */} pointLight position{[10, 10, 10]} / {/* 我们的 3D 对象 */} Box / {/* 轨道控制器允许用户旋转视角 */} OrbitControls / /Canvas /div );}这段代码创建了一个基础的 3D 场景一个粉色的立方体支持鼠标拖拽旋转。这是理解 Three.js 在 React 中工作的第一步。## 三、热成像效果的原理热成像效果的核心是通过颜色映射color mapping来表现数据。在 3D 图形中我们可以通过顶点着色器vertex shader和片元着色器fragment shader来控制每个像素的颜色。### 颜色映射技术1.线性渐变从蓝色低温到红色高温2.伪彩色使用彩虹色阶3.自定义调色板根据需求设计颜色过渡我们将使用自定义着色器基于模型表面的法线方向或自定义数据来生成热成像效果。## 四、实现 Apple Logo 模型为了简化我们使用内置几何体组合成 Apple logo 的形状。实际项目中可以导入 SVG 或 GLTF 模型。jsx// AppleLogo.jsx - Apple Logo 3D 模型import React from react;import * as THREE from three;export default function AppleLogo() { return ( group {/* 主体使用圆环几何体组合 */} mesh position{[-1, 0, 0]} ringGeometry args{[0.8, 1.2, 32]} / meshStandardMaterial colorgray / /mesh mesh position{[1, 0, 0]} ringGeometry args{[0.8, 1.2, 32]} / meshStandardMaterial colorgray / /mesh {/* 叶子使用球体 */} mesh position{[0, 1.2, 0]} sphereGeometry args{[0.3, 16, 16]} / meshStandardMaterial colorgreen / /mesh {/* 茎使用圆柱体 */} mesh position{[0, 0.8, 0]} cylinderGeometry args{[0.1, 0.1, 0.5, 8]} / meshStandardMaterial colorbrown / /mesh /group );}## 五、热成像着色器实现现在进入核心部分——自定义着色器。我们将创建一个 ShaderMaterial通过顶点位置和自定义数据来生成热成像颜色。### 顶点着色器glsl// vertex.glslvarying float vTemperature;void main() { // 基于位置计算温度值模拟热源 vTemperature position.y position.x * 0.5; gl_Position projectionMatrix * modelViewMatrix * vec4(position, 1.0);}### 片元着色器glsl// fragment.glslvarying float vTemperature;void main() { // 颜色映射从蓝色到红色 vec3 color1 vec3(0.0, 0.0, 1.0); // 蓝色 vec3 color2 vec3(1.0, 0.0, 0.0); // 红色 // 根据温度插值 vec3 finalColor mix(color1, color2, vTemperature); gl_FragColor vec4(finalColor, 1.0);}### 完整的 React 组件jsx// ThermalApple.jsx - 热成像 Apple Logoimport React, { useMemo } from react;import * as THREE from three;import { useFrame } from react-three/fiber;export default function ThermalApple() { // 创建自定义着色器材质 const shaderMaterial useMemo(() { return new THREE.ShaderMaterial({ // 顶点着色器传递位置信息作为温度 vertexShader: varying float vTemperature; void main() { // 基于位置和时间的温度计算 vTemperature position.y * 0.5 position.x * 0.3 0.5; gl_Position projectionMatrix * modelViewMatrix * vec4(position, 1.0); } , // 片元着色器颜色映射 fragmentShader: varying float vTemperature; void main() { // 热成像色阶蓝 - 青 - 黄 - 红 vec3 colorLow vec3(0.0, 0.0, 1.0); // 蓝色 vec3 colorMid vec3(0.0, 1.0, 0.0); // 绿色 vec3 colorHigh vec3(1.0, 0.0, 0.0); // 红色 vec3 finalColor; if (vTemperature 0.5) { finalColor mix(colorLow, colorMid, vTemperature * 2.0); } else { finalColor mix(colorMid, colorHigh, (vTemperature - 0.5) * 2.0); } gl_FragColor vec4(finalColor, 1.0); } , // 传递 uniforms这里可以添加时间等动态数据 uniforms: {} }); }, []); return ( group {/* 主体部分应用热成像着色器 */} mesh position{[-1, 0, 0]} material{shaderMaterial} ringGeometry args{[0.8, 1.2, 64]} / /mesh mesh position{[1, 0, 0]} material{shaderMaterial} ringGeometry args{[0.8, 1.2, 64]} / /mesh {/* 叶子 */} mesh position{[0, 1.2, 0]} material{shaderMaterial} sphereGeometry args{[0.3, 32, 32]} / /mesh {/* 茎 */} mesh position{[0, 0.8, 0]} material{shaderMaterial} cylinderGeometry args{[0.1, 0.1, 0.5, 16]} / /mesh /group );}## 六、动态热成像效果为了让效果更生动我们可以添加时间变量让热成像图案动态变化。jsx// DynamicThermalApple.jsx - 动态热成像import React, { useMemo, useRef } from react;import * as THREE from three;import { useFrame } from react-three/fiber;export default function DynamicThermalApple() { const materialRef useRef(); // 创建包含时间 uniform 的着色器 const shaderMaterial useMemo(() { return new THREE.ShaderMaterial({ uniforms: { uTime: { value: 0 } }, vertexShader: varying float vTemperature; uniform float uTime; void main() { // 动态温度随时间变化的正弦波 vTemperature sin(position.x * 2.0 uTime) * 0.5 0.5; gl_Position projectionMatrix * modelViewMatrix * vec4(position, 1.0); } , fragmentShader: varying float vTemperature; void main() { vec3 color1 vec3(0.0, 0.0, 1.0); // 蓝 vec3 color2 vec3(1.0, 1.0, 0.0); // 黄 vec3 color3 vec3(1.0, 0.0, 0.0); // 红 vec3 finalColor; if (vTemperature 0.5) { finalColor mix(color1, color2, vTemperature * 2.0); } else { finalColor mix(color2, color3, (vTemperature - 0.5) * 2.0); } gl_FragColor vec4(finalColor, 1.0); } }); }, []); // 每帧更新时间 uniform useFrame((state) { if (materialRef.current) { materialRef.current.uniforms.uTime.value state.clock.elapsedTime; } }); return ( group mesh position{[-1, 0, 0]} ref{materialRef} material{shaderMaterial} ringGeometry args{[0.8, 1.2, 64]} / /mesh mesh position{[1, 0, 0]} material{shaderMaterial} ringGeometry args{[0.8, 1.2, 64]} / /mesh /group );}## 七、整合到主应用最后我们将所有组件整合到主应用中并添加一些交互元素jsx// App.jsx - 主应用import React from react;import { Canvas } from react-three/fiber;import { OrbitControls, Stats } from react-three/drei;import DynamicThermalApple from ./DynamicThermalApple;export default function App() { return ( div style{{ width: 100vw, height: 100vh, background: #1a1a2e }} Canvas camera{{ position: [0, 0, 6], fov: 60 }} {/* 环境光 */} ambientLight intensity{0.3} / {/* 点光源 */} pointLight position{[5, 5, 5]} intensity{0.8} / {/* 动态热成像 Apple Logo */} DynamicThermalApple / {/* 轨道控制器 */} OrbitControls enablePan{false} minDistance{3} maxDistance{10} / {/* 性能统计 */} Stats / /Canvas {/* UI 提示 */} div style{{ position: absolute, bottom: 20, left: 50%, transform: translateX(-50%), color: white, fontFamily: Arial, fontSize: 14, opacity: 0.7 }} 拖拽旋转 · 滚轮缩放 /div /div );}## 总结通过本文我们完成了从零到一的 React Three.js 热成像 Apple Logo 实现。整个过程涵盖了1.基础环境搭建使用react-three/fiber和react-three/drei集成 Three.js2.3D 模型构建组合基础几何体模拟 Apple Logo 形状3.着色器编程通过 GLSL 实现颜色映射从简单的线性渐变到动态热成像4.交互优化添加轨道控制器和性能统计热成像效果的核心在于着色器中的颜色映射算法。在实际项目中你可以- 使用更复杂的调色板如彩虹色阶- 导入真实的 3D 模型文件- 添加鼠标交互让温度随光标位置变化- 结合 WebRTC 实现实时热成像数据可视化这个项目展示了前端技术与计算机图形学的完美结合为数据可视化和创意编程提供了无限可能。欢迎在此基础上继续探索创造出更多惊艳的视觉效果。

相关新闻

从0到1构建AI模型评估实验室:含自动化测试脚本、偏见检测模板、推理延迟压测方案(限前200家企业领取)

从0到1构建AI模型评估实验室:含自动化测试脚本、偏见检测模板、推理延迟压测方案(限前200家企业领取)

更多请点击: https://intelliparadigm.com 第一章:企业AI模型选择建议 企业在落地AI应用时,模型选择不应仅聚焦于“最先进”或“参数量最大”,而需围绕业务目标、数据特征、工程约束与长期维护成本进行系统性权衡。盲目引入大模型…

2026/9/28 5:15:02 阅读更多 →
ncmdumpGUI:Windows下一键解密网易云音乐NCM文件的完整指南

ncmdumpGUI:Windows下一键解密网易云音乐NCM文件的完整指南

ncmdumpGUI:Windows下一键解密网易云音乐NCM文件的完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了喜欢的歌曲…

2026/9/28 1:18:31 阅读更多 →
LTE站点DUS板卡副板DISABLED故障案例分析——EC总线异常导致小区退服及资源激活超时案例

LTE站点DUS板卡副板DISABLED故障案例分析——EC总线异常导致小区退服及资源激活超时案例

一、故障现象 LTE站点上报小区退服,告警显示为资源激活超时,如下: 查询小区当前是DISABLED,如下: 二、故障排查与处理过程 1、初步排查:RU设备及光路状态正常,如下: 2、深入排查:主板状态正常,副板DISABLED,如下: 3、后台操作:经分析,ru状态正常,但副板卡没起…

2026/9/28 18:08:05 阅读更多 →

最新新闻

浏览器待办清单实战:数据驱动与localStorage持久化全解析

浏览器待办清单实战:数据驱动与localStorage持久化全解析

第二次作业,听起来像赶着交差的玩意儿,但真做下来我才发现,它比第一次作业的含金量高得多。第一次作业大家基本都在确认一件事:我会写代码。第二次作业就是逼着你面对另一个问题:能不能把一个东西从零到一做成“能用”…

2026/10/1 17:41:17 阅读更多 →
JDK17 G1 GC调优:从参数解析到实战优化

JDK17 G1 GC调优:从参数解析到实战优化

如果你是从 JDK8 直接跳到 JDK17 维护线上服务,第一件要接受的事是:过去那套 GC 调优经验,至少有一半已经作废了。JDK17 的默认垃圾回收器是 G1,不是 ParallelGC,也不是早就退役的 CMS;原本习惯用的 PrintG…

2026/10/1 17:41:17 阅读更多 →
Linux批量移动指定层级文件夹:find与Python脚本实战

Linux批量移动指定层级文件夹:find与Python脚本实战

经常跟服务器文件打交道的人,应该都遇到过这种需求:某个根目录下堆了几百个子目录,层级有深有浅,现在要把其中特定层级的文件夹批量挪到另一个目录去。看起来不过是加一条 find 再加一条 mv,但真正落地的时候处处是坑—…

2026/10/1 17:41:17 阅读更多 →
JSP+SQLServer网上书店系统源码:从建库到部署的完整指南

JSP+SQLServer网上书店系统源码:从建库到部署的完整指南

简介:在Java Web开发中,JSP与Servlet构成了经典的服务端页面技术组合,而SQLServer作为企业级关系型数据库,常与JDBC驱动配合支撑业务数据持久化。理解JSP页面的请求流转、Servlet的控制器职责以及DAO层对数据库的访问封装&#xf…

2026/10/1 17:41:17 阅读更多 →
CODESYS读写CSV文件完整方案:从库配置到工程落地

CODESYS读写CSV文件完整方案:从库配置到工程落地

干过几年PLC项目的人应该都有这种体会:设备调试阶段最烦的不是逻辑写不对,而是甲方突然甩过来一张Excel表,说“把这些配方导进去”,或者“把这几天的运行数据导出来给我们看看”。你要是拿U盘一个个手动输入,几百个参数…

2026/10/1 17:41:17 阅读更多 →
基于Python的网络舆情分析系统实战:爬虫、情感分析与主题聚类

基于Python的网络舆情分析系统实战:爬虫、情感分析与主题聚类

简介:一套基于Python构建的网络舆情分析系统完整实现方案,源自哈工大课程实践项目,包含全部可执行源代码与配套实验报告,在评审中获得接近满分评价。定位面向高校学生、毕业设计者以及自然语言处理初学者,难度中等&…

2026/10/1 17:40:17 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →