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/7/24 21:46:49阅读更多 →
Java虚拟机:堆的参数配置

Java虚拟机:堆的参数配置

一、JVM堆内存结构概览JVM将堆内存划分为几个不同的区域,每个区域有着不同的用途和回收策略:1.1 新生代(Young Generation)新生代是大多数对象创建和消亡的地方。它进一步分为三个区域:Eden空间:新创建的对…

2026/7/24 21:46:49阅读更多 →
手把手教你学pcie-第二种:MMIO 空间(Memory-Mapped I/O)

手把手教你学pcie-第二种:MMIO 空间(Memory-Mapped I/O)

目录 五、第二种:MMIO 空间(Memory-Mapped I/O) 1️⃣ MMIO 是什么? 2️⃣ MMIO 和配置空间的本质区别 3️⃣ MMIO 从哪里来? 4️⃣ CPU 眼中的 MMIO 5️⃣ Linux 驱动如何访问 MMIO? ✅ 第一步&…

2026/7/24 21:44:49阅读更多 →
大模型记忆系统:从短期记忆到长期存储的技术演进

大模型记忆系统:从短期记忆到长期存储的技术演进

1. 大模型记忆能力概述:从"金鱼脑"到"最强大脑"的进化之路作为一名长期奋战在AI应用一线的开发者,我深刻体会过大模型"健忘"带来的困扰。去年在开发客服对话系统时,客户反复抱怨:"每次都要重新…

2026/7/24 23:17:07阅读更多 →
从「能纠错」到「算得起」:量子计算真正的考验才刚刚开始

从「能纠错」到「算得起」:量子计算真正的考验才刚刚开始

文丨恩里科 排版丨恩里科 行业动向:4200字丨12分钟阅读 内容提要 在此前的文章容错跨过门槛:微软与 Quantinuum 取得量子纠错重大进展(内附Nature下载)当中,我们讲述了纠错领域的突破:微软与 Quantinuum…

2026/7/24 23:17:07阅读更多 →
给 AI Agent 的 Skill 装上”自我进化”引擎:一套可落地的优化闭环方案

给 AI Agent 的 Skill 装上”自我进化”引擎:一套可落地的优化闭环方案

本文整理自 Warp 创始人 Zach Lloyd 分享的一个工程实践:如何用”观察者 Skill”自动评估并迭代改进另一个 Skill,让 Agent 的能力越用越强,而不是一次性交付后就放在那里”等老化”。 一、为什么 Skill 需要”自优化” 如果你已经在用 Clau…

2026/7/24 23:17:07阅读更多 →
爽提:以“高效智能”赋能“高校传统”食堂运营转型升级

爽提:以“高效智能”赋能“高校传统”食堂运营转型升级

在来势汹涌的社会外卖冲击下,传统的高校食堂餐饮运营从单一的线下经营转向“线上线下”多渠道融合餐饮业态、实现智能化升级已成大势所趋。但食堂商户要想真正实现智能化运营转型,必然离不开能够联结线上与线下的并且以其方便、快捷、高效而远超传统餐饮…

2026/7/24 23:17:07阅读更多 →
【详细】FreeRTOS任务的内部机制

【详细】FreeRTOS任务的内部机制

一.结构体volatile StackType_t * pxTopOfStack:保存当前任务堆栈的栈顶指针。ListItem_t xStateListItem:用于将任务挂接到各种调度状态链表中。ListItem_t xEventListItem:当任务因等待某个同步/通信对象(队列、信号量、互斥量、…

2026/7/24 23:17:07阅读更多 →
基于HarmonyOS的AI春联对联生成——从对齐到评估的全流程技术实践

基于HarmonyOS的AI春联对联生成——从对齐到评估的全流程技术实践

基于HarmonyOS的AI春联对联生成——从对齐到评估的全流程技术实践 一、项目背景与需求分析(Align) 1.1 场景痛点分析 在现代数字生活中,用户对春联对联生成的需求日益增长。传统的春联对联生成方式存在效率低下、个性化不足等问题。通过AI技术…

2026/7/24 23:15:07阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →