本文档旨在为初学者提供一个全面的 Three.js 入门指南。我们将从 Three.js 的基本概念开始,逐步介绍如何创建场景、添加物体、设置材质、使用光照和相机,以及如何实现简单的动画和交互。通过本教程,你将能够掌握 Three.js 的核心知识,并为进一步学习和开发复杂的 3D 应用打下坚实的基础。

1. Three.js 简介

Three.js 是一个基于 JavaScript 的 3D 图形库,它简化了 WebGL 的使用,允许开发者使用更高级别的 API 创建和渲染 3D 场景。WebGL 本身是一个底层的图形 API,直接操作起来比较复杂,而 Three.js 封装了 WebGL 的许多细节,使得开发者可以更专注于场景的构建和交互逻辑。

Three.js 的主要特点:

  • 易于使用: 提供了简洁的 API,降低了 3D 图形开发的门槛。
  • 跨平台: 基于 WebGL,可以在支持 WebGL 的浏览器上运行。
  • 丰富的特性: 支持各种 3D 模型格式、材质、光照、阴影、动画等。
  • 活跃的社区: 拥有庞大的用户群体和丰富的资源。

2. 环境搭建

在使用 Three.js 之前,需要先搭建开发环境。最简单的方式是直接在 HTML 文件中引入 Three.js 的 CDN 链接。

<!DOCTYPE html>
<html><head><title>Three.js 教程</title><style>body {margin: 0;}canvas {display: block;}</style></head><body><script src="https://cdn.jsdelivr.net/npm/three@0.155.0/build/three.min.js"></script><script>// Three.js 代码将在这里编写</script></body>
</html>

也可以使用 npm 安装 Three.js,并在项目中使用模块化的方式引入。

npm install three
import * as THREE from 'three'
3. 基本概念

Three.js 中有几个核心概念需要理解:

  • Scene (场景): 3D 世界的容器,所有物体、光照和相机都添加到场景中。
  • Camera (相机): 定义了观察场景的视角。
  • Renderer (渲染器): 将场景渲染到屏幕上。
  • Geometry (几何体): 定义了物体的形状,例如立方体、球体等。
  • Material (材质): 定义了物体的外观,例如颜色、纹理等。
  • Mesh (网格): 几何体和材质的组合,是场景中实际可见的物体。
  • Light (光照): 照亮场景,影响物体的颜色和阴影。
    在这里插入图片描述
4. 创建第一个 Three.js 场景

下面是一个简单的 Three.js 场景,包含一个立方体:

// 1. 创建场景
const scene = new THREE.Scene()// 2. 创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.z = 5// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)// 4. 创建几何体
const geometry = new THREE.BoxGeometry(1, 1, 1)// 5. 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })// 6. 创建网格
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)// 7. 渲染循环
function animate() {requestAnimationFrame(animate)cube.rotation.x += 0.01cube.rotation.y += 0.01renderer.render(scene, camera)
}animate()

代码解释:

  1. 创建场景: new THREE.Scene() 创建了一个新的场景。

  2. 创建相机: new THREE.PerspectiveCamera() 创建了一个透视相机,参数分别是:

    • 75:视野角度(FOV)。
    • window.innerWidth / window.innerHeight:宽高比。
    • 0.1:近平面。
    • 1000:远平面。
    • camera.position.z = 5 将相机沿 Z 轴移动 5 个单位,以便观察立方体。
  3. 创建渲染器: new THREE.WebGLRenderer() 创建了一个 WebGL 渲染器。
    renderer.setSize() 设置渲染器的大小,使其与窗口大小一致。
    document.body.appendChild(renderer.domElement) 将渲染器的 DOM 元素添加到页面中。

  4. 创建几何体: new THREE.BoxGeometry() 创建了一个立方体几何体,参数分别是立方体的宽度、高度和深度。

  5. 创建材质: new THREE.MeshBasicMaterial() 创建了一个基础材质,参数是材质的颜色。

  6. 创建网格: new THREE.Mesh() 创建了一个网格,将几何体和材质组合在一起。
    scene.add(cube) 将立方体添加到场景中。

  7. 渲染循环: animate() 函数是一个循环,不断更新场景并渲染。
    requestAnimationFrame(animate) 请求浏览器在下一次重绘之前调用 animate() 函数。
    cube.rotation.x += 0.01cube.rotation.y += 0.01 使立方体沿 X 轴和 Y 轴旋转。
    renderer.render(scene, camera) 使用相机渲染场景。

5. 几何体

Three.js 提供了多种几何体,例如:

  • THREE.BoxGeometry:立方体。
  • THREE.SphereGeometry:球体。
  • THREE.PlaneGeometry:平面。
  • THREE.CylinderGeometry:圆柱体。
  • THREE.TorusGeometry:圆环。

可以根据需要选择合适的几何体,并设置其参数。

6. 材质

Three.js 提供了多种材质,例如:

  • THREE.MeshBasicMaterial:基础材质,不受光照影响。
  • THREE.MeshLambertMaterial:Lambert 材质,受光照影响,但没有镜面反射。
  • THREE.MeshPhongMaterial:Phong 材质,受光照影响,有镜面反射。
  • THREE.MeshStandardMaterial:标准材质,基于物理的渲染 (PBR),更真实。

可以根据需要选择合适的材质,并设置其颜色、纹理、光泽度等属性。

7. 光照

Three.js 提供了多种光照,例如:

  • THREE.AmbientLight:环境光,照亮整个场景。
  • THREE.DirectionalLight:平行光,模拟太阳光。
  • THREE.PointLight:点光源,从一个点向四周发光。
  • THREE.SpotLight:聚光灯,从一个点向一个方向发光。

需要将光照添加到场景中,才能使物体显示出颜色和阴影。

8. 动画

可以使用 requestAnimationFrame() 函数创建动画。在每一帧中,更新物体的位置、旋转或缩放,然后重新渲染场景。

9. 交互

可以使用 JavaScript 事件监听器来处理用户的交互,例如鼠标点击、键盘按键等。可以根据用户的交互来改变场景中的物体或相机。

10. 总结

本教程介绍了 Three.js 的基本概念和使用方法。通过学习本教程,你应该能够创建简单的 3D 场景,并实现简单的动画和交互。要深入学习 Three.js,可以参考官方文档、示例代码和社区资源。祝你学习愉快!

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

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

相关文章

遥感领域解决方案丨高光谱、无人机多光谱、空天地数据识别与计算

一&#xff1a;AI智慧高光谱遥感实战&#xff1a;手撕99个案例项目、全覆盖技术链与应用场景一站式提升方案在遥感技术飞速发展的今天&#xff0c;高光谱数据以其独特的光谱分辨率成为环境监测、精准农业、地质勘探等领域的核心数据源。然而&#xff0c;海量的波段数据、复杂的…

(LeetCode 面试经典 150 题) 114. 二叉树展开为链表 (深度优先搜索dfs+链表)

题目&#xff1a;114. 二叉树展开为链表 思路&#xff1a;深度优先搜索dfs链表&#xff0c;时间复杂度0(n)。 C版本&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : …

《线程状态转换深度解析:从阻塞到就绪的底层原理》

目录 一、线程的五种基本状态 二、线程从 RUNNABLE 进入阻塞 / 等待状态的三种典型场景 1. 调用sleep(long millis)&#xff1a;进入 TIMED_WAITING 状态 2. 调用wait()&#xff1a;进入 WAITING/TIMED_WAITING 状态 3. 等待 I/O 资源或获取锁失败&#xff1a;进入 BLOCKE…

面经整理-猿辅导-内容服务后端-java实习

部门管理系统设计 题目要求 设计部门 MySQL 数据表实现接口&#xff1a;根据中间部门 ID 获取其下属叶子部门 ID设计包含子节点列表的 Java 数据对象&#xff0c;并实现批量获取功能 一、MySQL 部门表设计 表结构 CREATE TABLE department (id BIGINT PRIMARY KEY AUTO_INCREME…

Openharmony之window_manager子系统源码、需求定制详解

1. 模块概述 Window Manager 模块是 OpenHarmony 操作系统的核心窗口管理系统,负责窗口的创建、销毁、布局、焦点管理、动画效果以及与硬件显示的交互。该模块采用客户端-服务端架构,提供完整的窗口生命周期管理和用户界面交互支持。 1.1架构总览 Window Manager Client 应…

《CDN加速的安全隐患与解决办法:如何构建更安全的网络加速体系》

CDN&#xff08;内容分发网络&#xff09;作为提升网站访问速度的关键技术&#xff0c;被广泛应用于各类互联网服务中。然而&#xff0c;在享受加速优势的同时&#xff0c;CDN也面临诸多安全隐患。本文将解析常见的CDN安全问题&#xff0c;并提供实用的解决办法&#xff0c;帮助…

【Linux指南】GCC/G++编译器:庖丁解牛——从源码到可执行文件的奇幻之旅

不只是简单的 gcc hello.c 每一位Linux C/C++开发者敲下的第一行编译命令,几乎都是 gcc hello.c -o hello 或 g++ hello.cpp -o hello。这像一句神奇的咒语,将人类可读的源代码变成了机器可执行的二进制文件。但在这条简单的命令背后,隐藏着一个如同精密钟表般复杂的多步流…

地区电影市场分析:用Python爬虫抓取猫眼_灯塔专业版各地区票房

在当今高度数据驱动的影视行业&#xff0c;精准把握地区票房表现是制片方、宣发团队和影院经理做出关键决策的基础。一部电影在北上广深的表现与二三线城市有何差异&#xff1f;哪种类型的电影在特定区域更受欢迎&#xff1f;回答这些问题&#xff0c;不能再依赖“拍脑袋”和经…

Spark03-RDD02-常用的Action算子

一、常用的Action算子 1-1、countByKey算子 作用&#xff1a;统计key出现的次数&#xff0c;一般适用于K-V型的RDD。 【注意】&#xff1a; 1、collect()是RDD的算子&#xff0c;此时的Action算子&#xff0c;没有生成新的RDD&#xff0c;所以&#xff0c;没有collect()&…

[Android] 显示的内容被导航栏这挡住

上图中弹出的对话框的按钮“Cancel/Save”被导航栏遮挡了部分显示&#xff0c;影响了使用。Root cause: Android 应用的主题是 Theme.AppCompat.Light1. 修改 AndroidManifest.xml 将 application 标签的 android:theme 属性指向新的自定义主题&#xff1a;<applicationandr…

分贝单位全指南:从 dB 到 dBm、dBc

引言在射频、音频和通信工程中&#xff0c;我们经常会在示波器、频谱仪或测试报告里看到各种各样的dB单位&#xff0c;比如 dBm、dBc、dBV、dBFS 等。它们看起来都带个 dB&#xff0c;实则各有不同的定义和参考基准&#xff1a;有的表示相对功率&#xff0c;有的表示电压电平&a…

怎么确定mysql 链接成功了呢?

asyncio.run(test_connection()) ✗ Connection failed: cryptography package is required for sha256_password or caching_sha2_password auth methods 根据你提供的错误信息,问题出现在 MySQL 的认证插件和加密连接配置上。以下是几种解决方法: 1. 安装 cryptography 包…

(5)软件包管理器 yum | Vim 编辑器 | Vim 文本批量化操作 | 配置 Vim

Ⅰ . Linux 软件包管理器 yum01 安装软件在 Linux 下安装软件并不像 Windows 下那么方便&#xff0c;最通常的方式是去下载程序的源代码并进行编译&#xff0c;从而得到可执行程序。正是因为太麻烦&#xff0c;所以有些人就把一些常用的软件提前编译好并做成软件包&#xff0c;…

VGG改进(3):基于Cross Attention的VGG16增强方案

第一部分&#xff1a;交叉注意力机制解析1.1 注意力机制基础注意力机制的核心思想是模拟人类的选择性注意力——在处理信息时&#xff0c;对重要部分分配更多"注意力"。在神经网络中&#xff0c;这意味着模型可以学习动态地加权输入的不同部分。传统的自注意力(Self-…

代理ip平台哪家好?专业代理IP服务商测评排行推荐

随着互联网的深度发展&#xff0c;通过网络来获取全球化的信息资源&#xff0c;已成为企业与机构在竞争中保持优势的一大举措。但想要获取其他地区的信息&#xff0c;可能需要我们通过代理IP来实现。代理IP平台哪家好&#xff1f;下文就让我们从IP池资源与技术优势等细节&#…

PWA》》以京东为例安装到PC端

如果访问 浏览器右侧出现 安装 或 点击这个 也可以完成安装桌面 会出现 如下图标

Linux系统:C语言进程间通信信号(Signal)

1. 引言&#xff1a;从"中断"到"信号"想象一下&#xff0c;你正在书房专心致志地写代码&#xff0c;这时厨房的水烧开了&#xff0c;鸣笛声大作。你会怎么做&#xff1f;你会暂停&#xff08;Interrupt&#xff09; 手头的工作&#xff0c;跑去厨房关掉烧水…

LoRa 网关组网方案(二)

LoRa 网关组网方案 现有需求&#xff1a;网关每6秒接收不同节点的数据&#xff0c;使用SX1262芯片。 以下是完整的组网方案&#xff1a;1. 网络架构设计 采用星型拓扑&#xff1a; 网关&#xff1a;作为中心节点&#xff0c;持续监听多个信道节点&#xff1a;分布在网关周围&am…

服装外贸系统软件怎么用才高效防风险?

服装外贸系统软件概述 服装外贸系统软件&#xff0c;如“艾格文ERP”&#xff0c;是现代外贸企业不可或缺的管理工具。它整合了订单处理、库存管理、客户资源保护、财务控制等多功能模块&#xff0c;旨在全面提升业务运营效率。通过系统化的管理方式&#xff0c;艾格文ERP能够从…

【沉浸式解决问题】peewee.ImproperlyConfigured: MySQL driver not installed!

目录一、问题描述二、原因分析三、解决方案✅ 推荐&#xff1a;安装 pymysql&#xff08;纯 Python&#xff0c;跨平台&#xff0c;安装简单&#xff09;✅ 可选&#xff1a;安装 mysqlclient&#xff08;更快&#xff0c;但需要本地编译环境&#xff09;✅ 总结四、mysql-conn…