Three.js 实现地球仪并标注城市教程(Trae实现)

Threejs实现绘制地球,地理位置标注、经纬度转换世界坐标threejs坐标 1,介绍 该示例使用的是 r95版本Three.js库。 主要实现功能:绘制地球和地理位置进行标注 效果图如下: 2,主要说明 准备一张地图,创建一个球体并进行贴图,把地理位置经纬度转换成threejs的世界坐标,并进行标注。 创建地球,部分代码如下: // 创建地球 半径100 function createEarth() { var earthGeo = new THREE.SphereGeometry(radius, 50, 50); var earthMate.... 阅读详情

本人最近在做一个全球地铁的导航网站——metrolinehub,于是就想做一个3D的旋转的地球,做3D的地球的话首先想到的是 Three.js。在三维可视化领域,Three.js 是一个强大且易用的 JavaScript 库,能够帮助开发者轻松创建各种炫酷的 3D 场景。本文将带你从零开始,使用 Three.js 实现一个精美的地球仪,并在地球仪上标注北京、上海、东京等城市。

在这里插入图片描述

网站

全球城市地铁地图: https://www.metrolinehub.com/zh

准备工作

在开始之前,你需要准备以下内容:

工具

  1. Trae工具:用于快速编写代码。
  2. three.js 库:可以从官方网站(https://threejs.org/ ) 下载,也可以使用 CDN 引入。

原理

  1. 就是使用 SphereGeometry 来创建一个球体,它定义了地球的基本形状,通过贴图实现地球的渲染,通过调整参数能控制球体的细分程度。
  2. 利用 requestAnimationFrame 函数创建一个动画循环,该函数会在浏览器准备好重绘页面时被调用。在每一帧中,通过修改地球网格对象的 rotation 属性(如 rotation.y )来改变地球的旋转角度,最后调用渲染器的 render 方法更新画面,从而实现地球持续旋转的视觉效果。

简单的说就是一个旋转的球,它可以是地球,也可以是篮球、足球等

一、项目搭建

在这里插入图片描述

首先,我们需要创建一个基本的 HTML 页面,并引入 Three.js 库。可以通过 CDN 引入 Three.js,在 HTML 文件的标签中添加以下代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r151/three.min.js"></script>

接着,在标签中创建一个用于渲染 3D 场景的容器元素,例如:

<div id="canvas-container"></div>

然后,在 HTML 文件末尾引入我们的 JavaScript 代码文件(假设文件名为script.js):

<script src="script.js"></script>

二、创建地球仪

在script.js文件中,开始编写创建地球仪的代码。首先,创建一个场景、相机和渲染器:

// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('canvas-container').appendChild(renderer.domElement);

接下来,创建地球的几何体和材质。我们使用SphereGeometry来创建球体几何体,并使用带有地球纹理的MeshStandardMaterial来赋予其地球外观。可以从网上下载合适的地球纹理图片,这里假设纹理图片文件名为earth.jpg:

// 创建地球几何体
const geometry = new THREE.SphereGeometry(2, 32, 32);
// 创建地球材质
const texture = new THREE.TextureLoader().load('earth.jpg');
const material = new THREE.MeshStandardMaterial({ map: texture });
// 创建地球模型
const earth = new THREE.Mesh(geometry, material);
scene.add(earth);

最后,在一个渲染循环函数中不断更新场景并渲染:

function animate() {
    requestAnimationFrame(animate);
    // 可以在这里添加地球旋转等动画逻辑
    earth.rotateY(0.01);
    renderer.render(scene, camera);
}
animate();

此时,运行 HTML 文件,你应该能看到一个旋转的地球仪。

三、准备城市数据

为了在地球仪上标注城市,我们需要准备城市的相关数据,包括城市名称、经纬度坐标等。可以将这些数据存储在一个 JavaScript 数组中,示例如下:

const cities = [
    { name: '北京', lat: 39.9042, lng: 116.4074 },
    { name: '上海', lat: 31.2304, lng: 121.4737 },
    { name: '东京', lat: 35.6895, lng: 139.6917 }
];

这里的经纬度坐标决定了城市在地球仪上的位置,需要根据实际情况准确获取。

四、在地球仪上标注城市

有了城市数据后,我们就可以将城市标注添加到地球仪上。首先,创建一个用于存放标注的组:

const cityMarkers = new THREE.Group();
scene.add(cityMarkers);

然后,遍历城市数据数组,为每个城市创建标注。标注可以使用Mesh或Sprite来实现,这里我们使用Sprite,它能始终面向相机,更适合做文字标注:

const fontLoader = new THREE.FontLoader();
fontLoader.load('https://cdnjs.cloudflare.com/ajax/libs/three.js/r151/fonts/helvetiker_regular.typeface.json', (font) => {
    cities.forEach((city) => {
        const textGeometry = new THREE.TextGeometry(city.name, {
            font: font,
            size: 0.2,
            height: 0.01
        });
        const textMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff });
        const textMesh = new THREE.Mesh(textGeometry, textMaterial);
        // 将经纬度坐标转换为三维空间中的位置
        const phi = (90 - city.lat) * Math.PI / 180;
        const theta = (city.lng - 180) * Math.PI / 180;
        const radius = 2.2; // 标注在地球表面外一定距离
        textMesh.position.x = radius * Math.sin(phi) * Math.cos(theta);
        textMesh.position.y = radius * Math.cos(phi);
        textMesh.position.z = radius * Math.sin(phi) * Math.sin(theta);
        cityMarkers.add(textMesh);
    });
});

上述代码中,首先加载了一个字体文件,然后为每个城市创建一个TextGeometry作为文字内容,设置好材质后创建Mesh。接着,通过经纬度坐标计算出城市在三维空间中的位置,并将标注添加到之前创建的cityMarkers组中。

五、优化与拓展

  1. 标注样式优化:可以为标注添加阴影、调整字体颜色和大小,使其更加美观醒目。

  2. 添加交互:可以添加鼠标悬停提示、点击跳转等交互功能,提升用户体验。例如,使用THREE.Raycaster实现鼠标点击检测,当点击到标注时弹出城市详细信息。

  3. 更多城市数据:可以从网络获取更多城市数据,丰富地球仪上的标注内容。

通过以上步骤,我们成功地使用 Three.js 实现了一个带有城市标注的地球仪。希望本文能帮助你在 Three.js 的学习和实践中有所收获,你可以根据自己的需求进一步拓展和完善这个项目。

在这里插入图片描述

其他文章

使用 Leaflet.js 生成北京地铁地图(Trae实现)

中国地铁导航
在这里插入图片描述

Three.js 创建 3D 地球 Three.js经常会和WebGL混淆, 但也并不总是,Three.js其实是使用WebGL来绘制三维效果的。WebGL是一个只能画点、线和三角形的非常底层的系统。想要用WebGL来做一些实用的东西通常需要大量的代码, 这就是Three.js的用武之地。它封装了诸如场景、灯光、阴影、材质、贴图、空间运算等一系列功能,让你不必要再从底层WebGL开始写起。 阅读详情

相关推荐

使用three.js着色器创建地球

使用three.js着色器创建地球

weixin_60168606的博客 687

threejs炫酷地图(地图流光,飞线,水印动画,高光)

我们这套课程将会学习如何创建3D地图,地图流光效果,波浪效果,省份标签,地图飞线,飞机效果,水印文字,高光效果。涉及到的知识点:物体,材质,线段,文字加载,屏幕后处理,shader。我们地图流光的效果做法比网络上的一些做法要简单很多。学完这套课程,你可以加载任何城市的地图,并实现一些炫酷效果!!!

用 Three.js 创建一个酷炫且真实的地球

背景就是插入任何你认为适合的天空盒,我这里使用等距柱状图像来实现。

4410

基于ThreeJS的3D地球

标记点、动画、旋转、标记点点击事件、信息弹窗

张_优秀的博客 7625

【ThreeJs】如何给模型打上文字标签?

ThreeJs渲染中创建的网格模型,有时候我们需要给模型添加标签文字,方便识别不同的物体。这时候我们可以使用这两个库,里面提供了三种打标签的方式,随着相机角度的变化,三种标签的显示效果各不相同。

IT飞牛 1万+

Three.js专栏(三)、创建一个简单的3D地球

用Three.js创建一个简单的3D地球;

weixin_44121341的博客 2539

Three.js 地球仪城市标注实战:用 Trae 从零搭建可交互 3D 地球

用 Trae 写 Three.js 地球仪城市标注,卡点常在经纬度转三维坐标:phi 取 90-lat、theta 取 lng+180、x 加负号,标注半径略大于球体避免 z-fighting。接入 TaoToken 配置 Base URL 与 Key 后,可让 Trae 快速补全 Raycaster 点击检测代码。官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_42613018的博客 176

Threejs实现3d地球记录(5)

在渲染飞线处,渲染波动光圈矩形网格模型,并将得到的波动光圈Mash数组存入WaveMeshArr 中,方便后续在渲染循环中对光圈的波动进行设置。标注的点与飞线段起始点一致,因此可在渲染飞线处,渲染球面标注。

qq_41051239的博客 2080

Threejs入门之十一:创建旋转的地球

HTML+Threejs写的一个旋转地球的例子,从目录结构到代码实现,详细介绍了每一步的代码内容

九仞山的专栏 3141

three.js 3D地球实例,支持国家点击和飞线

three.js 3D地球实例,支持国家点击和飞线

基于KiCad的STM32最小系统设计实战案例(含PCB布线)

手把手带你用KiCad完成STM32最小系统设计,涵盖原理图绘制、封装匹配、规则约束设置及关键信号PCB布线技巧;全程基于开源EDA工具KiCad,强调实操细节与常见坑点规避。

weixin_42452483的博客 356

ThreeJS——在3D地球上标记中国地图板块

用于获取地图的位置以及到下一个目的地的总路程,可以将实际路程转成自己配置的路程,以及正在路上的标识,可以用头像表示,经过的地方可以嵌入链接点击进行跳转 如果是 Vue 写的话需要从生命周期中获取 Dom 元素 动画渲染函数 用于制作开始场景镜头动画(由远到近并附带略微旋转) 这个动画在后面会用到,是根据滚动下方内容进行左右镜头旋转的动画效果 此时星空就已经搭建好了,可以左右旋转试试效果其实也就是创建一个球,然后贴个准确的贴图放在圆上调整一些光感即可 绘制红色圆点和点与点之间的飞线效果 用画布渲染

NanChen的博客 4341

用Python写个彩票小助手:自动生成双色球/大乐透号码并保存到桌面

本文介绍如何使用Python开发一个智能彩票助手,实现双色球和大乐透号码的随机生成与桌面文件保存功能。通过详细的代码示例,包括随机号码生成、文件操作、用户交互和错误处理,帮助Python初学者快速掌握实用工具开发技巧。

weixin_42566121的博客 515

three.js 制作地球标注的两种方法

three.js制作地球标注的两种方法。

weixin_38946164的博客 2966

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1303

大规模新闻聚合爬虫实战:Python爬取数百万新闻数据的完整指南

本文详细介绍了如何构建一个大规模新闻聚合爬虫,结合Python异步爬虫技术,实现高效、稳定的新闻数据采集。增加NLP模块对新闻内容做自动分类、情感分析。引入机器学习模型检测新闻真实性。使用分布式爬虫框架进一步提升规模。增加多媒体内容抓取与处理。

2201_76125261的博客 1554

使用 Threejs 从基础开始构建 3D 地球

使用 Threejs 从基础开始构建 3D 地球。

weixin_43909743的博客 2586

【CANoe示例分析】0002_SOMEIPDemo

该工程由Vector官方提供,作为仿真SOME/IP节点的示例。Demo中介绍了两种仿真SOME/IP节点的方法,一种是基于arxml数据库的仿真,另一种是没有数据库(arxml、fibex)的仿真。无论是哪种形式的仿真,如果想要通过CAPL程序接收或者发送SOME/IP信息,都需要添加交互层的信息,这些信息可以通过添加DLL文件实现,DLL文件路径在CANoe安装目录下的Exec32文件中。

jasonj333 3517

Threejs实现3d地球记录(1)

Threejs实现3d地球

qq_41051239的博客 1624

小论文/大论文必备 | RT-DETR目标检测、数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强,助力小论文和大论文实验涨点策略,平均提升模型mAP约1-2个百分点

RT-DETR目标检测数据增强策略研究 ,本文针对RT-DETR目标检测模型提出9种数据增强方法,包括几何变换(水平/垂直翻转、中心裁剪)、光照调整(亮度、对比度)和噪声添加(高斯/椒盐噪声)等。所有增强操作均保持图像与标签同步变换,确保训练数据的准确性。实验表明,该策略可提升模型mAP 1-2个百分点,对小目标检测效果尤为显著。文中提供了完整的Python实现代码,支持批量处理图像和标签文件,并详细说明了各增强方法的功能特点。该方法通过提升数据多样性,有效增强了模型在复杂场景下的鲁棒性和泛化能力。

Ai缝合怪、助力小伙伴高效发论文 460

Python之afdx包语法、参数和实际应用案例

Python 的 afdx 包是针对 AFDX 协议的轻量级开发工具,专注于 AFDX 数据帧的解析、构造、发送/接收、协议合规性校验等核心能力,广泛应用于航空电子设备测试、仿真、数据监控等场景。

王国平的博客 982

threejs实现模型内标注插点/拖曳/模型呼吸灯 功能

threejs实现模型内标注插电/拖曳/模型呼吸灯功能

weixin_43374521的博客 3640

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3236

three.js三维地球

1、在vue项目中安装依赖: npm i three。

weixin_47425074的博客 1926

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

threejs实现标签标注的三种方式

threejs常见创建标签的三种方式

Pure_White520的博客 2888

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

threejs 全景区加可点击标注

<template> <divclass="test-wrapper"id="container"> <el-dialog:visible.sync="dialogVisible"> {{pointName}} </el-dialog> </div> ...

Fisher_yu01的博客 4143

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 使用 Leaflet.js 生成北京地铁地图(Trae实现)
下一篇: 做个开源项目出海赚钱:一个强大的 JavaScript 随机数据生成库(1/5)- 从零开始打造 RandBox
027西瓜皮
博客等级 码龄5年 98粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值