当前位置: 首页 > news >正文

如何使用Three.js制作3D月球与星空效果

目录

  • 1. 基本设置
  • 2. 创建星空效果
  • 3. 创建月球模型
  • 4. 添加中文3D文字
  • 5. 光照与相机配置
  • 6. 动画与控制
  • 7. 响应式布局
  • 8. 结语

在本文中,我们将一起学习如何利用Three.js实现一个3D月球与星空的效果,并添加一些有趣的元素,比如中文3D文字和互动功能。Three.js是一个强大的JavaScript库,它简化了WebGL的使用,使得在网页上进行3D图形渲染变得更加容易。我们将逐步分析代码,帮助大家理解实现原理。

实现效果展示:

1. 基本设置

首先,我们需要引入Three.js的核心库及相关组件:

<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/examples/js/controls/OrbitControls.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/examples/js/loaders/FontLoader.js"></script>

这三行代码分别引入了Three.js核心库、OrbitControls(用于控制相机旋转)和FontLoader(用于加载字体)。
接下来,我们初始化一个Three.js场景、相机和渲染器:

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

scene:场景对象,所有的3D物体都会添加到这个场景中。
camera:透视相机,用来观察场景。
renderer:WebGL渲染器,用来将场景渲染到网页上。

2. 创建星空效果

我们使用BufferGeometry和PointsMaterial来创建一个星空背景,利用随机生成的点来模拟远处的星星:

function createStarField() {const starsGeometry = new THREE.BufferGeometry();const starCount = 5000;const positions = new Float32Array(starCount * 3);for(let i = 0; i < starCount * 3; i += 3) {positions[i] = (Math.random() - 0.5) * 2000; // Xpositions[i+1] = (Math.random() - 0.5) * 2000; // Ypositions[i+2] = (Math.random() - 0.5) * 2000; // Z}starsGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));const starsMaterial = new THREE.PointsMaterial({color: 0xFFFFFF,size: 1.2,transparent: true,opacity: 0.8,sizeAttenuation: true,alphaTest: 0.5,map: createCircleTexture()});const starField = new THREE.Points(starsGeometry, starsMaterial);scene.add(starField);
}
createStarField();

BufferGeometry:用于高效地存储大量的点数据。
PointsMaterial:点的材质,通过设置透明度和大小来实现星星的效果。
createCircleTexture():创建一个简单的白色圆形纹理,用来表示星星。

3. 创建月球模型

为了让效果更加真实,我们还加载了月球的纹理,并将其应用到一个3D球体上,形成真实感的月球:

const textureLoader = new THREE.TextureLoader();
const moonTexture = textureLoader.load('https://threejs.org/examples/textures/planets/moon_1024.jpg');
const moonGeometry = new THREE.SphereGeometry(2, 64, 64);
const moonMaterial = new THREE.MeshStandardMaterial({map: moonTexture,roughness: 0.8,metalness: 0.2
});
const moon = new THREE.Mesh(moonGeometry, moonMaterial);
scene.add(moon);

TextureLoader:加载月球的纹理图。
SphereGeometry:创建一个球形几何体,用作月球的基础模型。
MeshStandardMaterial:创建一个标准材质,提供更真实的光照效果。

4. 添加中文3D文字

通过FontLoader,我们可以加载中文字体并创建3D文字:

const fontLoader = new THREE.FontLoader();
fontLoader.load('gongfannufangti_Regular.json', function(font) {const textGeometry = new THREE.TextGeometry('海上明月共潮生', {font: font,size: 0.8,height: 0.2,curveSegments: 12,bevelEnabled: true,bevelThickness: 0.03,bevelSize: 0.02,bevelOffset: 0,bevelSegments: 5});textGeometry.computeBoundingBox();const textWidth = textGeometry.boundingBox.max.x - textGeometry.boundingBox.min.x;const textMaterial = new THREE.MeshPhongMaterial({color: 0xfffff0,specular: 0x111111,shininess: 100});const textMesh = new THREE.Mesh(textGeometry, textMaterial);textMesh.position.set(-textWidth / 2, 3, 0);scene.add(textMesh);
}, undefined, function(err) {console.error('在线字体加载失败,请尝试备用方案');
});

5. 光照与相机配置

为了让场景更具真实感,我们添加了环境光和定向光照:

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

AmbientLight:提供均匀的全局光照,不会投射阴影。
DirectionalLight:模拟太阳光的定向光照,能投射阴影并增强场景的光照效果。

6. 动画与控制

通过OrbitControls,我们可以实现相机的旋转和平移功能,使得用户可以自由探索这个3D场景:

const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;
controls.autoRotate = true;
controls.autoRotateSpeed = 0.5;

autoRotate功能允许场景自动旋转,提升交互体验。

7. 响应式布局

为了让网页在不同设备上适配,我们添加了窗口大小变化时的适应性调整:

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

这样,无论是手机还是电脑,都能获得最佳的显示效果。

8. 结语

通过本文的介绍,我们成功地使用Three.js创建了一个3D月球与星空的效果,并结合了中文3D文字和相机控制等互动功能。你可以根据自己的需求进一步扩展和修改这个项目,比如添加更多星体、调整光照效果、使用自定义的字体等。任何问题欢迎在评论区交流和分享。完整源码在同名知识星球可下载。

相关文章:

如何使用Three.js制作3D月球与星空效果

目录 1. 基本设置2. 创建星空效果3. 创建月球模型4. 添加中文3D文字5. 光照与相机配置6. 动画与控制7. 响应式布局8. 结语 在本文中&#xff0c;我们将一起学习如何利用Three.js实现一个3D月球与星空的效果&#xff0c;并添加一些有趣的元素&#xff0c;比如中文3D文字和互动功…...

SQL语句语法

SQL数据库的结构为 库database 表table 段segment 行row 列column 或field SQL 语句主要分为以下几类&#xff1a; 数据定义语言&#xff08;DDL&#xff09;&#xff1a;用于定义数据库对象&#xff0c;如数据库、表、视图、索引等。数据操作语言&#xff08;DML&#xff09;&…...

github上文件过大无法推送问题

GitHub 对文件大小有限制&#xff0c;超过 100 MB 的文件无法直接推送到仓库中。 解决思路&#xff1a; 使用 Git Large File Storage (Git LFS) 来管理大文件不上传对应的大文件 使用Git LFS&#xff1a; 1. 安装 Git LFS 首先&#xff0c;你需要安装 Git LFS。可以按照以…...

微信小程序的请求函数封装(ts版本,uniapp开发)

主要封装函数代码&#xff1a; interface HttpOptions {url: string;method?: string;headers?: { [key: string]: string };data?: any; }class Http {private timeout: number;private baseUrl: string;public constructor() { this.timeout 60 * 1000;this.baseUrl ht…...

Visual Studio Code支持WSL,直接修改linux/ubuntu中的文件

步骤1 开始通过 WSL 使用 VS Code | Microsoft Learn 点击远程开发扩展包。 步骤2 Remote Development - Visual Studio Marketplace 点击install&#xff0c; 允许打开Visual Studio Code。 步骤3 共有4项&#xff0c;一齐安装。 步骤4 在WSL Linux(Ubuntu)中&#xf…...

openAI最新o1模型 推理能力上表现出色 准确性方面提升 API如何接入?

OpenAI o1模型在回答问题前会进行深入思考&#xff0c;并生成一条内部推理链&#xff0c;使其在尝试解决问题时可以识别并纠正错误&#xff0c;将复杂的步骤分解为更简单的部分&#xff0c;并在当前方法无效时尝试不同的途径。据悉&#xff0c;o1不仅数学水平与美国奥林匹克竞赛…...

GC 基础入门

什么是GC&#xff08;Garbage Collection&#xff09;&#xff1f; 内存管理方式通常分为两种&#xff1a; 手动内存管理&#xff08;Manual Memory Management&#xff09;自动内存管理&#xff08;Garbage Collection, GC&#xff09; 手动内存管理 手动内存管理是指开发…...

Go语言协程Goroutine高级用法(一)

什么协程 在Go语言中&#xff0c;协程就是一种轻量的线程&#xff0c;是并发编程的单元&#xff0c;由Go来管理&#xff0c;所以在GO层面的协程会更加的轻量、高效、开销更小&#xff0c;并且更容易实现并发编程。 轻量级线程 Go语言中协程&#xff08;线程&#xff09;与传…...

DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件

1 DeepSeek处理自有业务的案例&#xff1a;让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景 AI能力再强&#xff0c;如果不能在企业的自有业务上产生助益&#xff0c;那基本也是一无是处。将企业的自有业务上传到线上训练&#xff0c;那是脑子进水的做法&#xff…...

【鸿蒙HarmonyOS Next实战开发】lottie动画库

简介 lottie是一个适用于OpenHarmony和HarmonyOS的动画库&#xff0c;它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画&#xff0c;并在移动设备上进行本地渲染。 下载安裝 ohpm install ohos/lottieOpenHarmony ohpm 环境配置等更多内容&#xff0c…...

PAT乙级真题 — 1084 外观数列(java)

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…...

从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地

导读&#xff1a;日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案&#xff0c;替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度&#xff0c;规模达到…...

STM32——HAL库开发笔记19(串口中断接收实验)(参考来源:b站铁头山羊)

本实验&#xff0c;我们以中断的方式使得串口发送数据控制LED的闪烁速度&#xff0c;发送1&#xff0c;慢闪&#xff1b;发送2&#xff0c;速度正常&#xff1b;发送3&#xff0c;快闪。 一、电路连接图 二、实现思路&CubeMx配置 1、实现控制LED的闪烁速度 uint32_t bli…...

清影2.0(AI视频生成)技术浅析(二):自然语言处理

清影2.0(AI视频生成)中的自然语言处理(NLP)技术是其核心组件之一,负责将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指导后续的视频生成过程。 一、基本原理 1. 目标 清影2.0的NLP技术旨在将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指…...

Unity序列化多态数组

文档 Json序列化 脚本序列化 问题 Unity序列化数组时&#xff0c;只能存储基类内容&#xff0c;子类内容缺少。 Unity版本 2019.4.40 原因&#xff1a;Unity序列化不支持多态 测试类 将testarray类序列化时&#xff0c;多态列表personlist只转换了基类数据&#xff0c;子类…...

Spring Framework 中文官方文档

spring的部分中文文档。给总结在下面了&#xff1a; 看英文的大佬可以绕路了哈哈哈 一、 历史、设计理念、反馈、入门。 二、 IoC 容器、事件、资源、i18n、验证、数据绑定、类型转换、SpEL、AOP 三、 模拟对象、TestContext 框架、Spring MVC 测试、WebTestClient。 四、 事…...

力扣-二叉树-257 二叉树的所有路径

思路 除去根节点&#xff0c;每一层添加->val&#xff0c;然后使用前序遍历的顺序 代码 class Solution { public:vector<string> res;void getTreePaths(string s, TreeNode* root){s "->";s to_string(root->val);if(root->left nullptr &…...

如何调整 Nginx工作进程数以提升性能

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月15日14点20分 Nginx 的工作进程数&#xff0…...

FreeRTOS-rust食用指南

Rust 环境安装 rustup 是 Rust 的安装程序&#xff0c;也是它的版本管理程序&#xff0c;Linux 命令行下使用如下方式安装 # 安装 rustup curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh #更新 rustup rustup update# 版本检查 rustc -V cargo -VFreeRTOS-rust…...

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等&#xff0c;载体&#xff08;特别是涉密载体&#xff09;是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…...

日期格式化接收和格式化接收

SpringBoot 日期接收和输出格式化 全套 4 种方法&#xff08;最全总结&#xff0c;记下来够用整个开发生涯&#xff09;分两大场景&#xff1a;接收前端日期字符串 → 转 Java Date/LocalDateTime&#xff08;入参&#xff09;后端 Java 日期对象 → 返给前端标准字符串&#x…...

构建个人技能库:原子化设计与工程化实践指南

1. 项目概述&#xff1a;一个技能库的诞生与价值在技术社区里&#xff0c;我们常常会看到这样的现象&#xff1a;一位开发者分享了一个精巧的脚本&#xff0c;解决了某个特定问题&#xff0c;但几个月后&#xff0c;当他自己或其他人遇到类似场景时&#xff0c;却怎么也找不到当…...

H公司装配线平衡改进间歇泉算法优化方法【附FlexSim仿真】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;可以私信&#xff0c;或者点击《获取方式》 &#xff08;1&#xff09;改进间歇泉喷发策略与逻辑…...

KIWI 1P5 FPGA开发板:低成本数字逻辑设计与教学利器

1. KIWI 1P5 FPGA开发板概述KIWI 1P5是一款基于高云半导体(GOWIN)GW1N-UV1P5芯片的低成本FPGA开发板&#xff0c;售价仅为14美元。这款开发板专为数字逻辑设计、原型开发和教学应用而设计&#xff0c;具有工业级工作温度范围(-40C至75C)&#xff0c;适合从初学者到专业工程师的…...

如何实现跨平台输入法词库迁移?深蓝词库转换技术架构解析

如何实现跨平台输入法词库迁移&#xff1f;深蓝词库转换技术架构解析 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 在数字化工作环境中&#xff0c;输入法的个性化…...

在i.MX6ULL开发板上手搓DS18B20驱动:从GPIO配置到用户态测试的完整流程

在i.MX6ULL开发板上手搓DS18B20驱动&#xff1a;从GPIO配置到用户态测试的完整流程 温度传感器在工业控制、智能家居等领域有着广泛应用&#xff0c;而DS18B20作为一款经典的单总线数字温度传感器&#xff0c;以其独特的单线接口和较高的精度受到开发者青睐。本文将带你从零开始…...

NASA激光通信革命:从LCRD到DSOC,如何用光速重塑深空互联网

1. 项目概述&#xff1a;从射频到光子&#xff0c;深空通信的范式革命如果你关注航天科技&#xff0c;尤其是深空探测的数据回传&#xff0c;那你一定对“带宽焦虑”深有体会。想象一下&#xff0c;毅力号火星车拍下一张4K高清全景图&#xff0c;却需要花上好几天时间&#xff…...

告别手动配置!用CMake的CMAKE_TOOLCHAIN_FILE一键搞定嵌入式ARM交叉编译

嵌入式开发者的CMake救星&#xff1a;用CMAKE_TOOLCHAIN_FILE实现ARM交叉编译自动化 从x86平台转向嵌入式开发时&#xff0c;最令人头疼的莫过于交叉编译环境的搭建。每次新建项目都要重复配置arm-none-eabi-gcc路径、设置-mcpucortex-m4编译参数、调整链接脚本——这些机械性工…...

大模型服务吞吐翻3.8倍:SITS2026实测TensorRT-LLM+vLLM混合调度方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;大模型服务吞吐翻3.8倍&#xff1a;SITS2026实测TensorRT-LLMvLLM混合调度方案 在 SITS2026 大模型系统基准测试中&#xff0c;我们部署了基于 TensorRT-LLM 与 vLLM 的协同推理架构&#xff0c;通过动…...

独立开发者如何利用 Token 计费模式精细控制 AI 应用成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何利用 Token 计费模式精细控制 AI 应用成本 对于独立开发者或小型工作室而言&#xff0c;在开发集成大语言模型的应用…...