Three.js教程_02场景、相机与渲染器全面解析
Three.js 场景、相机与渲染器全面解析
Three.js 是一个强大的 JavaScript 库,用于在网页上创建和渲染 3D 图形。本文将深入解析 Three.js 中的几个核心概念,并介绍它们的用法及拓展方法。内容包括场景、相机、渲染器、网格对象、光源、坐标轴、控制器和动画的基本用法与技巧。
目录
- Scene(场景)
- Camera(相机)
- Renderer(渲染器)
- Mesh(网格对象)
- Light(光源)
- AxesHelper(坐标轴辅助工具)
- Controls(控制器)
- Animation(动画)
1. Scene(场景)
场景是 Three.js 中的一个容器,它保存了所有的 3D 对象、光源、相机等内容。每个 Three.js 应用至少需要一个场景对象。
场景拓展:
- 添加更多对象:不仅仅是物体,还可以添加光源、相机、背景等。
- 背景设置:你可以设置场景的背景颜色或纹理。
scene.background = new THREE.Color(0xeeeeee); // 设置场景背景色为浅灰色 // 或者使用纹理 scene.background = new THREE.TextureLoader().load('background.jpg');
- 加载模型:通过加载外部 3D 模型来拓展场景。
const loader = new THREE.GLTFLoader(); loader.load('model.glb', function(gltf) {scene.add(gltf.scene); });
2. Camera(相机)
相机定义了 3D 世界的视角。Three.js 中常用的相机类型有 PerspectiveCamera
(透视相机)和 OrthographicCamera
(正交相机)。
透视相机
fov
:控制视野角度。aspect
:控制宽高比。near
和far
:控制可见范围。const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 2000);
正交相机
- 正交相机常用于二维图像或正交投影。
const camera = new THREE.OrthographicCamera(-window.innerWidth / 2, window.innerWidth / 2, window.innerHeight / 2, -window.innerHeight / 2, 0.1, 1000);
相机动画
- 动态修改相机的位置、角度或旋转,创造动画效果。
camera.position.x = Math.sin(Date.now() * 0.001) * 10; camera.position.y = 5; camera.position.z = Math.cos(Date.now() * 0.001) * 10;
3. Renderer(渲染器)
渲染器负责将 3D 场景渲染为 2D 图像并显示在网页上。WebGLRenderer
是 Three.js 默认的渲染器。
渲染器拓展:
- 启用阴影:渲染器可以启用阴影效果,增强真实感。
renderer.shadowMap.enabled = true; renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 设置阴影类型
- 渲染目标:除了渲染到屏幕外,还可以渲染到其他目标,如帧缓冲对象(FBO)。
const renderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight); renderer.setRenderTarget(renderTarget); renderer.render(scene, camera);
4. Mesh(网格对象)
网格是场景中的实际物体,由几何体(形状)和材质组成。
网格拓展:
- 多个网格:可以创建多个不同的几何体,并将它们组合在同一个场景中。
const sphereGeometry = new THREE.SphereGeometry(1); const sphereMaterial = new THREE.MeshBasicMaterial({ color: 0x0000ff }); const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.set(0, 0, 0); scene.add(sphere);
- 添加纹理:通过
THREE.TextureLoader
加载纹理并应用到材质上。const texture = new THREE.TextureLoader().load('texture.jpg'); const material = new THREE.MeshBasicMaterial({ map: texture }); const cube = new THREE.Mesh(geometry, material);
5. Light(光源)
光源是 Three.js 中的关键元素,用于照亮场景中的物体。常见的光源有:点光源(PointLight)、平行光(DirectionalLight)、环境光(AmbientLight)等。
光源拓展:
- 点光源:模拟从一个点发出的光线。
const pointLight = new THREE.PointLight(0xffffff, 1, 100); pointLight.position.set(10, 10, 10); scene.add(pointLight);
- 平行光:模拟太阳光,光线平行。
const directionalLight = new THREE.DirectionalLight(0xffffff, 1); directionalLight.position.set(5, 5, 5).normalize(); scene.add(directionalLight);
- 环境光:提供均匀的光照。
const ambientLight = new THREE.AmbientLight(0x404040); // 灰色环境光 scene.add(ambientLight);
6. AxesHelper(坐标轴辅助工具)
坐标轴辅助工具用于在场景中显示坐标轴,帮助理解物体的位置。
坐标轴拓展:
- 自定义坐标轴的颜色和尺寸:
const axesHelper = new THREE.AxesHelper(10); // 坐标轴长度为10 axesHelper.material.linewidth = 2; // 设置坐标轴线宽 scene.add(axesHelper);
- 移除坐标轴:可以动态移除坐标轴辅助工具。
scene.remove(axesHelper);
7. Controls(控制器)
OrbitControls 是一种用于控制相机的工具,可以实现旋转、缩放和平移操作,并支持平滑的惯性效果。
控制器拓展:
- 控制器属性:
controls.enableZoom = true; // 启用缩放 controls.minDistance = 5; // 设置相机缩放的最小距离 controls.maxDistance = 100; // 设置相机缩放的最大距离 controls.enablePan = true; // 启用平移
- 平滑效果:为控制器启用惯性效果。
controls.enableDamping = true; // 开启惯性 controls.dampingFactor = 0.25; // 设置惯性强度
8. Animation(动画)
动画是 Three.js 中的核心部分,使用 requestAnimationFrame
函数来实现平滑的动画效果。
动画拓展:
- 物体动画:
function animate() {requestAnimationFrame(animate);cube.rotation.x += 0.01;cube.rotation.y += 0.01;renderer.render(scene, camera); } animate();
通过以上八大核心部分,你可以构建一个丰富的 3D 场景,加入各种动态元素和交互控制,打造出炫酷的网页 3D 应用。这些基础知识是学习 Three.js 的起点,你可以在此基础上进行拓展和创新。
相关文章:
Three.js教程_02场景、相机与渲染器全面解析
Three.js 场景、相机与渲染器全面解析 Three.js 是一个强大的 JavaScript 库,用于在网页上创建和渲染 3D 图形。本文将深入解析 Three.js 中的几个核心概念,并介绍它们的用法及拓展方法。内容包括场景、相机、渲染器、网格对象、光源、坐标轴、控制器和…...

【数据结构】动态规划-基础篇
针对动态规划问题,我总结了以下5步: 确定dp数组以及下标的含义; 递推公式; dp数组如何初始化; 遍历顺序; 打印dp数组(用来debug); 以上5步适用于任何动态规划问题&#x…...

opencv读取展示图片
import time import cv2 # 创建窗口 cv2.namedWindow(window, cv2.WINDOW_AUTOSIZE) # cv2.WINDOW_AUTOSIZE自动大小,不允许修改窗口大小 cat cv2.imread("./6.jpg", 0) # opencv默认读取bgr,0代表的是灰度图模式,1是彩色图 # 展示名字为window…...

网站访问统计A/B测试与数据分析
在网站运营中,访问统计和数据分析是优化用户体验和提高转化率的关键工具。A/B测试作为一种数据驱动的方法,能够帮助网站运营者验证设计和内容的有效性。A/B测试的基本原理是同时展示两个不同的版本(A和B),通过比较它们…...

前端开发 之 15个页面加载特效下【附完整源码】
文章目录 十二:铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三:扇形百分比加载特效1.效果展示2.HTML完整代码 十四:四色圆环显现加载特效1.效果展示2.HTML完整代码 十五:跷跷板加载特效1.效果展示2.HTML完整代码 十二ÿ…...

详解八大排序(六)------(三路划分,自省排序,归并排序外排序)
文章目录 1. 快排之三路划分1. 1 三路划分的诞生由来1. 2 三路划分的具体思路1. 3 代码实现 2. 快排之自省排序2. 1 自省排序的目的2. 2 自省排序的思路2. 3 自省排序的实现代码 3. 归并排序外排序3. 1 外排序介绍3. 2 归并排序外排序的思路3. 3 归并排序的实现代码 1. 快排之三…...
【Java从入门到放弃 之 从字节码的角度异常处理】
从字节码的角度异常处理 生成字节码Javap 命令的使用基本语法 字节码文件testTryCatchtestTryCatchFinallytestTryWithResource 如果大家对与java的异常使用还有问题或者还不太了解,建议先看一下我之前写的Java异常了解一下基本 的异常处理知识,再看这篇…...
Java虚拟机(JVM)中的元空间(Metaspace)一些关键点的总结
• 元空间的引入:在Java 8中,JVM的内存结构经历了变化,其中方法区被替代为元空间(Metaspace)。元空间用于存储类的元数据信息,包括类的名称、方法、字段等信息。 • 存储位置:与方法区不同&…...

小程序 模版与配置
WXML模版语法 一、数据绑定 1、数据绑定的基本原则 (1)在data中定义数据 (2)在WXML中使用数据 2、在data中定义页面的数据 3、Mustache语法的格式(双大括号) 4、Mustache语法的应用场景 (…...

当大的div中有六个小的div,上面三个下面三个,当外层div高变大的时候我希望里面的小的div的高也变大
问: 当大的div中有六个小的div,上面三个下面三个,当外层div高变大的时候我希望里面的小的div的高也变大 回答: 这时候我们就不能写死六个小的div的高度,否则上下的小的div的间距就会变大,因为他们的高度…...

MySQL——操作
一.库的操作 1.基本操作 创建数据库 create database 数据库名称; 查看数据库 show databases; 删除数据库 drop database 数据库名称; 执行删除之后的结果: 数据库内部看不到对应的数据库 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删…...

Python语法之正则表达式详解以及re模块中的常用函数
正则表达式详解及re模块中的常用函数 概念、作用和步骤 概念: 本身也是一个字符串,其中的字符具有特殊含义,将来我们可以根据这个字符串【正则表达式】去处理其他的字符串,比如可以对其他字符串进行匹配,切分…...
《地球化学》
《地球化学》主要报道近代地球化学, 特别是其主要分支学科, 如岩石地球化学、元素地球化学、有机地球化学、环境地球化学、矿床地球化学、实验地球化学、生物地球化学、天体化学、计算地球化学、分析地球化学、海洋地球化学、沉积地球化学、纳米地球化学、油气地球化学和同位素…...
alpine openssl 编译
./config no-shared --prefix/usr/local/openssl apk add musl-dev gcc g apk add linux-headers ssh root 登录 编辑 SSH 配置文件 打开 SSH 配置文件 /etc/ssh/sshd_config: vi /etc/ssh/sshd_config PermitRootLogin yes...

【AI模型对比】AI新宠Kimi与ChatGPT的全面对比:技术、性能、应用全揭秘
文章目录 Moss前沿AI技术背景Kimi人工智能的技术积淀ChatGPT的技术优势 详细对比列表模型研发Kimi大模型的研发历程ChatGPT的发展演进 参数规模与架构Kimi大模型的参数规模解析ChatGPT的参数体系 模型表现与局限性Kimi大模型的表现ChatGPT的表现 结论:如何选择适合自…...

【C#设计模式(17)——迭代器模式(Iterator Pattern)】
前言 迭代器模式可以使用统一的接口来遍历不同类型的集合对象,而不需要关心其内部的具体实现。 代码 //迭代器接口 public interface Iterator {bool HashNext();object Next(); } //集合接口 public interface Collection {Iterator CreateIterator(); } //元素迭…...

二、部署docker
二、安装与部署 2.1 安装环境概述 Docker划分为CE和EE,CE为社区版(免费,支持周期三个月),EE为企业版(强调安全,付费使用)。 Docker CE每月发布一个Edge版本(17.03&…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发十九,ffmpeg封装
封装就是将 一个h264,和一个aac文件重新封装成一个mp4文件。 这里我们的h264 和 aac都是来源于另一个mp4文件,也就是说,我们会将 in.mp4文件解封装成一路videoavstream 和 一路 audioavstream,然后 将这两路的 avstream 合并成一…...

ML 系列:第 39 节 - 估计方法:最大似然估计 (MLE)
目录 一、说明 二、什么是最大似然估计 (MLE)? 2.1 理解公式 2.2 MLE 的定义 2.3 我们何时使用 MLE? 三、结论 一、说明 在统计学领域,我们经常需要根据观察到的数据估计统计模型的参数。为此目的广泛使用的两种关键方法是最大似然估计 ( MLE…...

Linux 权限管理:用户分类、权限解读与常见问题剖析
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 💯L…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...