three融合GIS创建地球模型(二)

创建一个地球模型通常涉及到使用纹理贴图来给球体添加地球表面的图像。在 Three.js 中,你可以通过加载一张地球的图片作为纹理,并将其应用到一个 SphereGeometry 上来实现这一点。以下是如何完成这个过程的一个基本示例:

步骤 1: 设置场景、相机和渲染器

这部分与前面创建基础球体时相同。

import * as THREE from 'three';

// 创建场景
const scene = new THREE.Scene();

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 8; // 将相机后移,以便看到整个地球

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);


步骤 2: 加载地球纹理

我们需要从某个 URL 加载地球的纹理图片。Three.js 提供了 TextureLoader 来处理这一任务。

const textureLoader = new THREE.TextureLoader();
const earthTexture = textureLoader.load('path/to/earth_texture.jpg'); // 确保你有正确的路径指向地球纹理图片
 

步骤 3: 创建地球材质并应用纹理

我们将使用 MeshPhongMaterial 来创建一个可以反射光线的材质,并将纹理应用到它上面。

// 创建地球材质
const material = new THREE.MeshPhongMaterial({
    map: earthTexture,
    shininess: 10
});

步骤 4: 创建地球几何体

接下来,我们创建一个球体几何体,并用之前定义的材质来包裹它。

// 创建球体几何体
const geometry = new THREE.SphereGeometry(1, 64, 64); // 半径为1,细分度为64x64,以获得更平滑的球面

// 创建地球网格
const earth = new THREE.Mesh(geometry, material);

// 将地球添加到场景中
scene.add(earth);


步骤 5: 添加光源

为了让地球看起来更真实,我们需要添加光源。这里我们添加一个环境光和一个定向光。

// 添加环境光
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);

// 添加定向光
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(5, 5, 3); // 调整位置以达到理想的光照效果
scene.add(directionalLight);


步骤 6: 渲染循环及窗口大小调整

最后,我们需要设置渲染循环以及监听窗口大小变化的事件处理器。

function animate() {
    requestAnimationFrame(animate);
    // 可选:旋转地球
    earth.rotation.y += 0.005;
    renderer.render(scene, camera);
}
animate();

window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
});


完整代码

这是所有代码段合并后的完整示例:

import * as THREE from 'three';

// 场景、相机、渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 8;
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 纹理加载
const textureLoader = new THREE.TextureLoader();
const earthTexture = textureLoader.load('path/to/earth_texture.jpg');

// 材质与几何体
const material = new THREE.MeshPhongMaterial({ map: earthTexture, shininess: 10 });
const geometry = new THREE.SphereGeometry(1, 64, 64);
const earth = new THREE.Mesh(geometry, material);
scene.add(earth);

// 光源
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(5, 5, 3);
scene.add(directionalLight);

// 渲染循环
function animate() {
    requestAnimationFrame(animate);
    earth.rotation.y += 0.005;
    renderer.render(scene, camera);
}
animate();

// 窗口调整
window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
});

确保你有一个可用的地球纹理图片,并且正确设置了其路径。这样,当你运行这段代码时,你应该能看到一个带有纹理的地球模型在页面上旋转。

融合到vue3创建地球模型实现及效果

示例代码

<template><div id="three" ref="three"></div>
</template><script lang="ts">
import type {AmbientLight,AxesHelper,Clock,DirectionalLight,Mesh,OrthographicCamera,Scene,Texture,WebGLRenderer
} from 'three'
import * as THREE from 'three'
import { defineComponent, onBeforeUnmount, onMounted, ref } from 'vue'
import Stats from 'stats.js'
import CameraControls from 'camera-controls'
import { useThree } from '@/hooks'let scene: Scene,camera: OrthographicCamera,renderer: WebGLRenderer,point: DirectionalLight,ambient: AmbientLight,axesHelper: AxesHelper,mesh: Mesh,stats: Stats,cameraControls: CameraControls,clock: Clock,animation: number,texture: Textureexport default defineComponent({name: 'gallery4',setup () {const three = ref<HTMLElement>(document.createElement('div'))const {initScene,initCamera,initRenderer,initLight,initHelpers,initStats,windowResize,initControls,initClock} = useThree(scene, camera, renderer, point, ambient, axesHelper, stats, cameraControls, clock)// 初始化模型function initModel () {const geometry = new THREE.SphereGeometry(100, 100, 100) // 球体const textureLoader = new THREE.TextureLoader()// 加载纹理贴图const texture = textureLoader.load('/img/earth.png')// 加载法线贴图const textureNormal = textureLoader.load('/img/earth_normal.png')// 加载高光贴图const textureSpecular = textureLoader.load('/img/earth_spec.png')const material = new THREE.MeshPhongMaterial({map: texture,normalMap: textureNormal, // 法线贴图normalScale: new THREE.Vector2(1.5, 1.5), // 设置深浅程度,默认值(1,1)。shininess: 40, // 高光部分的亮度,默认30specularMap: textureSpecular // 高光贴图})mesh = new THREE.Mesh(geometry, material)scene.add(mesh)}// 渲染function render () {scene && renderer.render(scene, camera)stats && stats.update()cameraControls && cameraControls.update(clock.getDelta())animation = requestAnimationFrame(render)mesh.rotateY(0.005)}// 初始化function init (el: HTMLElement) {scene = initScene()camera = initCamera()renderer = initRenderer(el)stats = initStats(el)cameraControls = initControls()clock = initClock()initLight()initHelpers()initModel()render()}onMounted(() => {const el = three.valueinit(el)window.addEventListener('resize', windowResize)})onBeforeUnmount(() => {cancelAnimationFrame(animation)cameraControls && cameraControls.dispose()window.removeEventListener('resize', windowResize)})return {three}}
})
</script>

  如果对您有所帮助,请点赞打赏支持!

技术合作交流qq:2401315930

最后分享一下地图下载器设计及下载地址:

链接:https://pan.baidu.com/s/1RZX7JpTpxES-G7GiaVUxOw 
提取码:61cn

地图下载器代码结构设计及功能实现_地图下载管理器解析-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rust入门基础总结

文章目录 前言1、输出格式规范一、占位符相关&#xff08;一&#xff09;{}与{:?} 二、参数替换方式&#xff08;一&#xff09;位置参数&#xff08;二&#xff09;具名参数 三、格式化参数&#xff08;一&#xff09;宽度&#xff08;二&#xff09;对齐&#xff08;三&…

php生成PDF文件(FPDF)

FPDF即“Free PDF”&#xff0c;FPDF类库提供了基本的PDF创建功能&#xff0c;其源代码和使用权是免费的。 PDF格式文档优势 通用&#xff1a;PDF文档在UNIX和Windows系统均可正常使用。 安全&#xff1a;PDF文档可设置为只读模式&#xff0c;并且可以添加密码等保护措施。 美…

【JDK、Maven、Git、PostgreSQL】VSCode后端开发环境配置样例

文章目录 一、文件下载1 Maven早期版本下载安装1.1 文件下载1.2 设置系统变量1.3 查看是否设置成功1.4 设置MAVEN的本地仓库 和 镜像等内容 2 Git 下载安装3 下载并安装PostgreSQL 103.1 下载并安装3.2 配置系统环境变量 4 在VScode中下载扩展包5 在VSCode中为项目配置JDK 二、…

Maven 的使用:在 IDEA 中配置 Maven 的超详细步骤

一、概述 记录时间 [2024-10-20] Maven 用来管理 Java 项目中的依赖。 为什么要进行 Maven 配置呢&#xff1f;IDEA 默认选择内置的 Maven 仓库&#xff0c;但是不好用。 本文所讲述的 Maven 配置可以说是超详细的&#xff01; 从下载 Maven 这个东西开始&#xff0c;修改它…

sql-labs靶场第十七关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

基于微信小程序的智能校园社区服务推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

华为eNSP:端口安全

一、什么是端口安全 端口安全是指保护计算机端口免受未经授权的访问、攻击或滥用的一种措施。计算机上的每个服务或应用程序都依靠特定的端口进行通信。端口安全的目的是限制对计算机端口的访问&#xff0c;确保只有经过授权的用户或服务可以使用这些端口。通过配置防火墙、访…

线性可分支持向量机的原理推导 标准优化目标 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-6 是从之前的最大化间隔问题&#xff08;公式 9-4 和 9-5&#xff09;推导出来的支持向量机&#xff08;SVM&#xff09;的优化问题。它表示的是一…

影刀RPA实战番外:excel函数应用指南

Excel函数是用于执行特定计算、分析和数据处理任务的预定义公式。它们可处理数学计算、文本处理、逻辑判断、日期和时间运算、查找和引用数据等。例如&#xff0c;SUM函数可以计算一系列数字的总和&#xff0c;IF函数进行逻辑测试&#xff0c;VLOOKUP函数在表格中查找数据&…

基于vue框架的的房屋租借系统6vsj6(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,房东,房源类型,房屋租赁,租赁信息,续租信息,退租信息 开题报告内容 基于Vue框架的的房屋租借系统开题报告 一、选题背景 随着城市化进程的加速和人口流动性的增强&#xff0c;房屋租赁市场日益繁荣&#xff0c;成为满足人们居住…

使用Redisson的布隆过滤器解决缓存穿透问题

使用Redisson实现缓存穿透的布隆过滤器示例 以下是一个使用Redisson库的RBloomFilter来解决缓存穿透问题的Java代码示例。在这个示例中&#xff0c;我们会通过布隆过滤器预先过滤无效的请求&#xff0c;以减少对数据库的压力。 代码示例 首先&#xff0c;确保在项目中引入Re…

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中&#xff0c;updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别&#xff1a; 一、功能 updateByPrimaryKey&#xff1a; 会根据传入的实体对象&#xff0c;将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…

esp32c6 开发实战:http 协议

esp32c6 提供一系列的事件来处理 http 协议&#xff08;这一点与低功耗蓝牙相似&#xff09;。 编写含有 http 协议的程序基本上就以下几个步骤&#xff1a; 初始化注册回调函数 每当事件发生&#xff08;接收到来自客户端的请求就会触发事件&#xff09;&#xff0c;esp32c…

C++ (一) 基础语法

基础语法&#xff1a;C的开胃小菜 欢迎来到C的世界&#xff0c;这里是编程的盛宴&#xff0c;也是逻辑的迷宫。别担心&#xff0c;我们不会一开始就让你啃硬骨头&#xff0c;而是从基础语法开始&#xff0c;让你慢慢品尝编程的美味。准备好了吗&#xff1f;让我们开始这场编程…

揭秘 Mark Word 的存储结构

一个Java对象被初始化之后会存储在堆内存中&#xff0c;那么这个对象在堆内存中存储了哪些信 呢? Java 对象存储结构可以分为三个部分:对象头、实例数据、对齐填充。当我们构建一个0b lock new Object() 对象实例时&#xff0c;这个1ock实例最终的存储结构就对应下面…

如何高效集成聚水潭数据至MySQL-技术案例解析

如何高效集成聚水潭数据至MySQL-技术案例解析 聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中&#xff0c;我们将探讨如何通过轻易云数据集成平台&#xff0c;将聚水潭的店铺信息高效地集成到MySQL数据库中。具体方案为“聚水潭-店铺信息查询-->BI崛起-店铺信息表”…

SSL证书有免费的吗?在哪里可以申请到?——附带申请步骤

申请免费的SSL证书通常可以通过以下几个步骤完成&#xff0c;这里以使用JoySSL为例进行说明&#xff0c;因为JoySSL提供了一个免费、自动化和开放的证书颁发机构&#xff08;CA&#xff09;来促进网站从HTTP向HTTPS的转换。 步骤&#xff1a; 选择工具&#xff1a; 访问JoySSL…

理解 React 中的 ReactElement、children 和 ReactNode

1. 什么是 ReactElement&#xff1f; ReactElement 是 React 用来描述 UI 界面元素的最基本的对象&#xff0c;是构建虚拟 DOM 的核心元素。 定义&#xff1a;ReactElement 是不可变的对象&#xff0c;表示界面中的某个元素。它包含了用于渲染 UI 所需的信息&#xff0c;如元…

【Nuvoton干货分享】开发应用篇 5 -- 32bit MCU Flash 操作

在实际开发中&#xff0c;我们都会碰到需要把部分数据存放在不易失存储空间上&#xff0c;比如外部NOR FLASH、EEPROM、SD等存储空间上&#xff0c;针对数据量不大的情况下&#xff0c;可以考虑将数据存放在芯片ROM存储空间。Nuvoton 32bit MCU ROM存储空间包括LDROM、APROM、S…

ImportError: DLL load failed while importing _ext: 找不到指定的程序。

下载mmcv&#xff0c;torch时报错&#xff1a; ImportError: DLL load failed while importing _ext: 找不到指定的程序。 报错原因&#xff1a; mmcv&#xff0c;torch&#xff0c;python的版本冲突问题&#xff08;版本对应不上&#xff09;。 最新版本&#xff0c;请参考…