基于 Three.js 的 3D 地球可视化项目

🌍 基于 Three.js 的 3D 地球可视化项目

📢 项目说明

这是一个使用 Three.js 创建的交互式 3D 地球模型,支持鼠标拖动旋转、自动旋转动画和响应式布局。

📅 更新时间:2026 年 3 月 24 日

🎯 技术栈:HTML5 + CSS3 + JavaScript + Three.js

⏱️ 预计阅读时间:20-30 分钟

✍️ 作者:书到用时方恨少!


📋 完整目录

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    本篇博客内容导航                          │
├─────────────────────────────────────────────────────────────┤
│  第一部分:项目介绍                                          │
│  ├── 1. 项目背景                                             │
│  ├── 2. 效果预览                                             │
│  └── 3. 功能特性                                             │
├─────────────────────────────────────────────────────────────┤
│  第二部分:技术架构                                          │
│  ├── 4. 技术栈说明                                           │
│  ├── 5. 项目结构                                             │
│  └── 6. 核心原理                                             │
├─────────────────────────────────────────────────────────────┤
│  第三部分:代码详解                                          │
│  ├── 7. HTML 结构                                            │
│  ├── 8. CSS 样式                                             │
│  └── 9. JavaScript 核心代码                                  │
├─────────────────────────────────────────────────────────────┤
│  第四部分:核心功能讲解                                      │
│  ├── 10. Three.js 场景搭建                                   │
│  ├── 11. 地球材质与纹理                                      │
│  ├── 12. 灯光系统                                            │
│  ├── 13. 鼠标交互控制                                        │
│  └── 14. 动画循环                                            │
├─────────────────────────────────────────────────────────────┤
│  第五部分:扩展与优化                                        │
│  ├── 15. 功能扩展建议                                        │
│  ├── 16. 性能优化                                            │
│  └── 17. 常见问题                                            │
└─────────────────────────────────────────────────────────────┘

第一部分:项目介绍

1. 项目背景

在 Web 3D 可视化日益普及的今天,Three.js 成为了前端开发者创建 3D 内容的首选库。本项目通过创建一个交互式 3D 地球模型,帮助开发者快速掌握 Three.js 的核心概念,包括场景搭建、几何体、材质、纹理、灯光、交互控制和动画循环。

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    项目应用场景                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  🌐 数据可视化                                               │
│     • 全球业务分布展示                                      │
│     • 用户地理位置可视化                                    │
│     • 网络流量监控                                          │
│                                                             │
│  🎓 教育演示                                                 │
│     • 地理教学辅助                                          │
│     • 天文科普展示                                          │
│     • 互动学习平台                                          │
│                                                             │
│  🎨 创意展示                                                 │
│     • 企业官网首页                                          │
│     • 产品介绍页面                                          │
│     • 个人作品集                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2. 效果预览

🖼️ 项目效果

🎬 交互特性

交互方式 效果
鼠标拖动 地球跟随鼠标旋转
鼠标释放 恢复自动旋转
窗口缩放 自适应调整大小
右键菜单 禁用(防止干扰)

3. 功能特性

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    核心功能清单                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✅ 3D 地球渲染                                              │
│     • 高精度球体几何体(64×64 分段)                         │
│     • 多层纹理贴图(颜色/法线/高光)                        │
│     • Phong 材质光照效果                                    │
│                                                             │
│  ✅ 交互控制                                                 │
│     • 鼠标拖动旋转                                          │
│     • 平滑旋转动画                                          │
│     • 禁用右键菜单                                          │
│                                                             │
│  ✅ 自适应布局                                               │
│     • 响应式窗口大小                                        │
│     • 设备像素比适配                                        │
│     • 全屏显示                                              │
│                                                             │
│  ✅ 灯光系统                                                 │
│     • 环境光(基础照明)                                    │
│     • 方向光(模拟太阳)                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

第二部分:技术架构

4. 技术栈说明

🛠️ 核心技术

技术 版本 用途
HTML5 - 页面结构
CSS3 - 样式布局
JavaScript ES6+ 交互逻辑
Three.js r128 3D 渲染引擎

📦 Three.js 核心模块

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    Three.js 模块使用                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  THREE.Scene           →  3D 场景容器                        │
│  THREE.PerspectiveCamera →  透视相机                        │
│  THREE.WebGLRenderer   →  WebGL 渲染器                      │
│  THREE.SphereGeometry  →  球体几何体                        │
│  THREE.TextureLoader   →  纹理加载器                        │
│  THREE.MeshPhongMaterial →  Phong 材质                      │
│  THREE.Mesh            →  网格对象                          │
│  THREE.AmbientLight    →  环境光                            │
│  THREE.DirectionalLight →  方向光                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

5. 项目结构

复制代码
project/
│
├── index.html          # 主页面(包含所有代码)
│
├── 纹理资源(CDN 加载)
│   ├── earth_atmos_2048.jpg    # 地球颜色纹理
│   ├── earth_normal_2048.jpg   # 法线贴图
│   └── earth_specular_2048.jpg # 高光贴图
│
└── 依赖库(CDN 加载)
    └── three.min.js (r128)     # Three.js 核心库

💡 说明 :本项目采用单文件结构,所有代码集成在 index.html 中,便于快速部署和测试。纹理和库文件通过 CDN 加载。


6. 核心原理

🔄 渲染流程

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    Three.js 渲染流程                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 创建场景 (Scene)                                        │
│         ↓                                                   │
│  2. 创建相机 (Camera)                                       │
│         ↓                                                   │
│  3. 创建渲染器 (Renderer)                                   │
│         ↓                                                   │
│  4. 添加几何体 + 材质 = 网格 (Mesh)                         │
│         ↓                                                   │
│  5. 添加灯光 (Light)                                        │
│         ↓                                                   │
│  6. 动画循环 (requestAnimationFrame)                        │
│         ↓                                                   │
│  7. 渲染场景 (renderer.render)                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🎮 交互原理

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    鼠标交互原理                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  mousedown → 记录起始位置 → isDragging = true               │
│         ↓                                                   │
│  mousemove → 计算位移差 → 更新旋转角度                      │
│         ↓                                                   │
│  mouseup → isDragging = false → 恢复自动旋转                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

第三部分:代码详解

7. HTML 结构

复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D 地球模型</title>
    <!-- CSS 样式 -->
</head>
<body>
    <div id="instructions">拖动地球旋转 | Drag to rotate the Earth</div>
    <div id="container"></div>
    
    <!-- 引入 Three.js -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    
    <!-- JavaScript 代码 -->
</body>
</html>

📋 关键元素说明

元素 作用
meta viewport 移动端适配
#instructions 操作提示文字
#container Three.js 渲染容器
script 引入 Three.js 库

8. CSS 样式

复制代码
body {
    margin: 0;
    overflow: hidden;
    background-color: #000000;
    font-family: Arial, sans-serif;
}

#container {
    width: 100%;
    height: 100vh;
    display: block;
}

#instructions {
    position: absolute;
    top: 20px;
    left: 0;
    width: 100%;
    text-align: center;
    color: white;
    font-size: 14px;
    text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
    pointer-events: none; /* 不阻挡鼠标事件 */
    z-index: 10;
}

🎨 样式要点

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    CSS 样式要点                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✅ margin: 0                                               │
│     移除默认边距,实现全屏效果                              │
│                                                             │
│  ✅ overflow: hidden                                        │
│     隐藏滚动条,防止拖动时页面滚动                          │
│                                                             │
│  ✅ pointer-events: none                                    │
│     提示文字不阻挡鼠标事件,确保能拖动地球                  │
│                                                             │
│  ✅ text-shadow                                             │
│     文字阴影,增强在黑色背景上的可读性                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

9. JavaScript 核心代码

📦 代码结构概览

复制代码
// 1. 场景设置
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(...);
const renderer = new THREE.WebGLRenderer(...);

// 2. 地球创建
const geometry = new THREE.SphereGeometry(...);
const material = new THREE.MeshPhongMaterial({...});
const earth = new THREE.Mesh(geometry, material);

// 3. 灯光系统
const ambientLight = new THREE.AmbientLight(...);
const directionalLight = new THREE.DirectionalLight(...);

// 4. 交互控制
// 鼠标事件监听函数...

// 5. 动画循环
function animate() { ... }

第四部分:核心功能讲解

10. Three.js 场景搭建

🔍 场景、相机、渲染器

复制代码
// 场景设置
const scene = new THREE.Scene();

// 相机:透视相机
const camera = new THREE.PerspectiveCamera(
    75,                              // 视野角度 (FOV)
    window.innerWidth / window.innerHeight,  // 宽高比
    0.1,                             // 近截面
    1000                             // 远截面
);
camera.position.z = 2;               // 相机位置

// 渲染器
const renderer = new THREE.WebGLRenderer({ 
    antialias: true  // 开启抗锯齿
});
renderer.setPixelRatio(window.devicePixelRatio);  // 设备像素比
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('container').appendChild(renderer.domElement);

📊 参数详解

参数 说明
FOV 75 视野角度,值越大视野越广
宽高比 innerWidth/innerHeight 保持画面不变形
近截面 0.1 小于该距离的物体不渲染
远截面 1000 大于该距离的物体不渲染
相机 Z 轴 2 相机距离原点的距离

🎯 相机位置示意图

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    相机位置示意                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│                    📷 相机 (z=2)                            │
│                      │                                      │
│                      │ 看向                                 │
│                      ↓                                      │
│                    🌍 地球 (0,0,0)                          │
│                                                             │
│         X 轴 → 左右旋转                                     │
│         Y 轴 → 上下旋转                                     │
│         Z 轴 → 前后移动                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

11. 地球材质与纹理

🔍 几何体创建

复制代码
const geometry = new THREE.SphereGeometry(1, 64, 64);
参数 说明
半径 1 球体半径
水平分段 64 经线方向分段数
垂直分段 64 纬线方向分段数

💡 提示:分段数越高,球体越圆滑,但性能消耗越大。64×64 是质量和性能的平衡点。

🔍 纹理加载

复制代码
const textureLoader = new THREE.TextureLoader();

// 三种纹理
const map = textureLoader.load('earth_atmos_2048.jpg');      // 颜色纹理
const bumpMap = textureLoader.load('earth_normal_2048.jpg'); // 法线贴图
const specularMap = textureLoader.load('earth_specular_2048.jpg'); // 高光贴图

🎨 三种纹理对比

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    纹理类型对比                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  🗺️ 颜色纹理 (map)                                          │
│  ═══════════                                                │
│  • 显示地球表面颜色                                         │
│  • 包含陆地、海洋、云层                                     │
│  • 基础视觉效果                                             │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  🏔️ 法线贴图 (bumpMap)                                      │
│  ═══════════                                                │
│  • 模拟表面凹凸效果                                         │
│  • 增强山脉、地形的立体感                                   │
│  • bumpScale 控制凹凸强度                                   │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  ✨ 高光贴图 (specularMap)                                  │
│  ═══════════                                                │
│  • 控制反光强度                                             │
│  • 海洋反光强,陆地反光弱                                   │
│  • 增强真实感                                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🔍 材质配置

复制代码
const material = new THREE.MeshPhongMaterial({
    map: map,                    // 颜色纹理
    bumpMap: bumpMap,            // 法线贴图
    bumpScale: 0.05,             // 凹凸强度
    specularMap: specularMap,    // 高光贴图
    specular: new THREE.Color(0x333333), // 高光颜色
    shininess: 5                 // 光泽度
});

const earth = new THREE.Mesh(geometry, material);
scene.add(earth);

📊 材质参数说明

参数 效果
bumpScale 0.05 凹凸强度,值越大越明显
specular 0x333333 高光颜色(深灰色)
shininess 5 光泽度,值越大越亮

12. 灯光系统

🔍 灯光配置

复制代码
// 环境光 - 基础照明
const ambientLight = new THREE.AmbientLight(0x404040, 1);
scene.add(ambientLight);

// 方向光 - 模拟太阳
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(2, 1, 3).normalize();
scene.add(directionalLight);

💡 灯光类型对比

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    灯光类型对比                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  🌑 环境光 (AmbientLight)                                   │
│  ═════════════                                              │
│  • 均匀照亮整个场景                                         │
│  • 无方向性                                                 │
│  • 防止背光面全黑                                           │
│  • 颜色:0x404040(深灰色)                                │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  ☀️ 方向光 (DirectionalLight)                               │
│  ═════════════                                              │
│  • 模拟平行光源(如太阳)                                   │
│  • 有方向性                                                 │
│  • 产生明暗对比                                             │
│  • 位置:(2, 1, 3) 归一化                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🎯 灯光效果示意

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    灯光效果示意                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│                    ☀️ 方向光                                │
│                   ╱                                         │
│                  ╱                                          │
│                 ╱                                           │
│                🌍 地球                                      │
│               ╱│                                            │
│              ╱ │ 环境光(整体)                             │
│                                                             │
│         亮面 ← 方向光照射                                   │
│         暗面 ← 背光面                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

13. 鼠标交互控制

🔍 变量定义

复制代码
let isDragging = false;
let previousMousePosition = {
    x: 0,
    y: 0
};

🔍 事件处理函数

复制代码
// 鼠标按下
function onMouseDown(event) {
    isDragging = true;
    previousMousePosition = {
        x: event.clientX,
        y: event.clientY
    };
}

// 鼠标移动
function onMouseMove(event) {
    if (isDragging) {
        const deltaX = event.clientX - previousMousePosition.x;
        const deltaY = event.clientY - previousMousePosition.y;

        // 根据鼠标移动调整地球旋转
        earth.rotation.y += deltaX * 0.01;
        earth.rotation.x += deltaY * 0.01;

        previousMousePosition = {
            x: event.clientX,
            y: event.clientY
        };
    }
}

// 鼠标释放
function onMouseUp() {
    isDragging = false;
}

// 鼠标离开
function onMouseLeave() {
    isDragging = false;
}

// 禁用右键菜单
function onContextMenu(event) {
    event.preventDefault();
}

🔍 事件监听器绑定

复制代码
renderer.domElement.addEventListener('mousedown', onMouseDown, false);
window.addEventListener('mousemove', onMouseMove, false);
window.addEventListener('mouseup', onMouseUp, false);
renderer.domElement.addEventListener('mouseleave', onMouseLeave, false);
renderer.domElement.addEventListener('contextmenu', onContextMenu, false);

🎮 交互流程图

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    交互控制流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────┐                                           │
│  │ 鼠标按下    │ ──→ isDragging = true                     │
│  │ mousedown   │     记录起始位置                          │
│  └─────────────┘                                           │
│         ↓                                                   │
│  ┌─────────────┐                                           │
│  │ 鼠标移动    │ ──→ 计算位移差                            │
│  │ mousemove   │     更新旋转角度                          │
│  │ (isDragging)│     更新上次位置                          │
│  └─────────────┘                                           │
│         ↓                                                   │
│  ┌─────────────┐                                           │
│  │ 鼠标释放    │ ──→ isDragging = false                    │
│  │ mouseup     │     恢复自动旋转                          │
│  └─────────────┘                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

📊 旋转参数说明

参数 说明
deltaX * 0.01 Y 轴旋转 水平拖动控制左右旋转
deltaY * 0.01 X 轴旋转 垂直拖动控制上下旋转
0.01 灵敏度 值越大旋转越快

14. 动画循环

🔍 核心代码

复制代码
function animate() {
    requestAnimationFrame(animate);

    // 非拖动状态下自动旋转
    if (!isDragging) {
        earth.rotation.y += 0.001;
    }

    renderer.render(scene, camera);
}

animate();

🔄 动画原理

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    动画循环原理                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  requestAnimationFrame(animate)                             │
│         ↓                                                   │
│  浏览器准备下一帧渲染                                       │
│         ↓                                                   │
│  检查是否拖动                                               │
│         ↓                                                   │
│  ┌─────────────┐     ┌─────────────┐                       │
│  │ 拖动中      │     │ 未拖动      │                       │
│  │ 不自动旋转  │     │ 自动旋转    │                       │
│  └─────────────┘     └─────────────┘                       │
│         ↓                   ↓                               │
│  renderer.render()  ←───┘                                   │
│         ↓                                                   │
│  重复循环(约 60fps)                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

📊 响应式适配

复制代码
function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
}

window.addEventListener('resize', onWindowResize, false);
操作 说明
更新宽高比 保持画面不变形
更新投影矩阵 应用新的宽高比
更新渲染器尺寸 适配新窗口大小

第五部分:扩展与优化

15. 功能扩展建议

🚀 可扩展功能

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    功能扩展建议                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  🌟 基础扩展                                                 │
│  ├── 添加月球绕地球旋转                                     │
│  ├── 添加大气层效果                                         │
│  ├── 添加星空背景                                           │
│  └── 添加云层动画                                           │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  📍 交互扩展                                                 │
│  ├── 鼠标滚轮缩放                                           │
│  ├── 点击显示地点信息                                       │
│  ├── 添加标记点(城市/景点)                                │
│  └── OrbitControls 专业控制                                 │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  📊 数据可视化                                               │
│  ├── 显示飞行航线                                           │
│  ├── 显示人口密度                                           │
│  ├── 显示天气数据                                           │
│  └── 显示实时地震                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

💡 扩展代码示例

添加星空背景
复制代码
// 创建星空
function createStars() {
    const starGeometry = new THREE.BufferGeometry();
    const starMaterial = new THREE.PointsMaterial({color: 0xffffff});
    const starVertices = [];
    
    for(let i = 0; i < 10000; i++) {
        const x = (Math.random() - 0.5) * 2000;
        const y = (Math.random() - 0.5) * 2000;
        const z = (Math.random() - 0.5) * 2000;
        starVertices.push(x, y, z);
    }
    
    starGeometry.setAttribute('position', 
        new THREE.Float32BufferAttribute(starVertices, 3));
    const stars = new THREE.Points(starGeometry, starMaterial);
    scene.add(stars);
}

createStars();
添加鼠标滚轮缩放
复制代码
camera.position.z = 2;

renderer.domElement.addEventListener('wheel', (event) => {
    camera.position.z += event.deltaY * 0.001;
    camera.position.z = Math.max(1.5, Math.min(5, camera.position.z));
});
使用 OrbitControls(推荐)
复制代码
<!-- 引入 OrbitControls -->
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.js"></script>

<script>
// 添加控制器
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;
controls.autoRotate = true;
controls.autoRotateSpeed = 1.0;

// 在 animate 中更新
function animate() {
    requestAnimationFrame(animate);
    controls.update();
    renderer.render(scene, camera);
}
</script>

16. 性能优化

⚡ 优化建议

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    性能优化建议                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✅ 几何体优化                                               │
│     • 适当降低分段数(32×32 足够)                          │
│     • 使用 LOD(多细节层次)                                │
│                                                             │
│  ✅ 纹理优化                                                 │
│     • 使用压缩纹理(KTX/DDS)                               │
│     • 根据设备选择纹理大小                                  │
│     • 使用纹理压缩格式                                      │
│                                                             │
│  ✅ 渲染优化                                                 │
│     • 限制最大帧率                                          │
│     • 离屏时暂停渲染                                        │
│     • 使用请求动画帧                                        │
│                                                             │
│  ✅ 资源管理                                                 │
│     • 及时释放不用的资源                                    │
│     • 使用纹理缓存                                          │
│     • 延迟加载资源                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🔧 代码优化示例

复制代码
// 优化 1:降低几何体分段数
const geometry = new THREE.SphereGeometry(1, 32, 32); // 64→32

// 优化 2:离屏时暂停渲染
let isVisible = true;
document.addEventListener('visibilitychange', () => {
    isVisible = !document.hidden;
});

function animate() {
    if (isVisible) {
        requestAnimationFrame(animate);
        // ... 渲染代码
    } else {
        requestAnimationFrame(animate);
    }
}

// 优化 3:使用纹理压缩
// 在生产环境中使用 .ktx 或 .dds 格式

17. 常见问题

❓ FAQ

问题 原因 解决方案
地球不显示 纹理加载失败 检查 CDN 链接,使用本地纹理
画面模糊 像素比未设置 添加 setPixelRatio
拖动卡顿 性能问题 降低几何体分段数
移动端无法拖动 缺少触摸事件 添加 touch 事件监听
窗口缩放变形 未更新相机 添加 resize 事件处理

🔍 移动端适配

复制代码
// 添加触摸事件支持
let touchStartX = 0;
let touchStartY = 0;

renderer.domElement.addEventListener('touchstart', (event) => {
    isDragging = true;
    touchStartX = event.touches[0].clientX;
    touchStartY = event.touches[0].clientY;
});

renderer.domElement.addEventListener('touchmove', (event) => {
    if (isDragging) {
        const deltaX = event.touches[0].clientX - touchStartX;
        const deltaY = event.touches[0].clientY - touchStartY;
        
        earth.rotation.y += deltaX * 0.01;
        earth.rotation.x += deltaY * 0.01;
        
        touchStartX = event.touches[0].clientX;
        touchStartY = event.touches[0].clientY;
    }
});

renderer.domElement.addEventListener('touchend', () => {
    isDragging = false;
});

📝 总结

核心知识点回顾

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    知识点总览                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Three.js 基础                                               │
│  ├── Scene(场景)                                          │
│  ├── Camera(相机)                                         │
│  ├── Renderer(渲染器)                                     │
│  └── Geometry + Material = Mesh                             │
│                                                             │
│  材质与纹理                                                  │
│  ├── 颜色纹理(map)                                        │
│  ├── 法线贴图(bumpMap)                                    │
│  └── 高光贴图(specularMap)                                │
│                                                             │
│  灯光系统                                                    │
│  ├── AmbientLight(环境光)                                 │
│  └── DirectionalLight(方向光)                             │
│                                                             │
│  交互控制                                                    │
│  ├── 鼠标事件监听                                           │
│  ├── 旋转角度计算                                           │
│  └── 动画循环                                               │
│                                                             │
│  响应式适配                                                  │
│  ├── 窗口 resize 处理                                       │
│  ├── 设备像素比适配                                         │
│  └── 移动端触摸支持                                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🎯 学习路线建议

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    Three.js 学习路线                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  📌 第一阶段:基础                                           │
│     ├── 场景搭建                                            │
│     ├── 几何体与材质                                        │
│     └── 本项目的地球模型                                    │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  📌 第二阶段:交互                                           │
│     ├── 鼠标/触摸控制                                       │
│     ├── OrbitControls                                       │
│     └── 点击检测                                            │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  📌 第三阶段:进阶                                           │
│     ├── 粒子系统                                            │
│     ├── 着色器编程                                          │
│     └── 物理引擎                                            │
│                                                             │
│  ─────────────────────────────────────────────────────────  │
│                                                             │
│  📌 第四阶段:实战                                           │
│     ├── 数据可视化                                          │
│     ├── 游戏开发                                            │
│     └── VR/AR 应用                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

📚 推荐资源

类型 名称 链接
官网 Three.js 官方网站 https://threejs.org
文档 Three.js 文档 https://threejs.org/docs
示例 Three.js 示例 https://threejs.org/examples
教程 Three.js 入门教程 https://threejs-journey.com
社区 GitHub https://github.com/mrdoob/three.js
中文 Three.js 中文网 http://www.webgl3d.cn

💬 结语

"3D 可视化是前端开发的重要方向,掌握 Three.js,让你的网页更加生动!"

通过本项目,你已经:

  • ✅ 掌握了 Three.js 的基本使用流程
  • ✅ 理解了 3D 场景、相机、渲染器的关系
  • ✅ 学会了材质与纹理的应用
  • ✅ 实现了鼠标交互控制
  • ✅ 完成了响应式适配

下一步建议

  1. 尝试添加更多功能(月球、星空、标记点)
  2. 学习 OrbitControls 专业控制器
  3. 探索粒子系统和着色器
  4. 将地球模型应用到实际项目中

记住3D 世界的大门已经打开,尽情发挥你的创造力!


📅 更新时间:2026 年 3 月 24 日
✍️ 作者:书到用时方恨少!
💌 如有疑问,欢迎在评论区留言讨论!

如果这篇博客对你有帮助,请点赞👍、收藏⭐、转发🔄,让更多的小伙伴一起探索 3D 世界!

相关推荐
聆风吟º2 小时前
【C标准库】深入理解C语言memcpy函数:用法、原理与避坑指南
c语言·开发语言·memcpy·库函数
一个写bug的人2 小时前
elementui中表格的表头固定 侧边列表固定 滚动条在头部 且使用鼠标滚轮横向时 可同步给顶部滚动条
前端·javascript·elementui
泯仲2 小时前
RAG系统核心之意图识别与意图树实现全解析
开发语言·大模型·agent·rag
mjhcsp2 小时前
C++ 信息论(Information Theory)完整万字教程
开发语言·c++
Anastasiozzzz2 小时前
编程语言错误处理的清流:Go 错误处理
开发语言·后端·golang
四维碎片2 小时前
【Qt】 无边框窗口方案
开发语言·qt
C++ 老炮儿的技术栈2 小时前
现代 C++(C++11 及以后)的移动语义
linux·c语言·开发语言·c++·github
sycmancia2 小时前
QT——Qt Creator工程介绍
开发语言·qt
deviant-ART2 小时前
为什么 Java 编译器要求 catch 块显式 return 或 throw
java·开发语言