three.js场景三元素

news2024/11/24 16:10:48

three.js是一个基于WebGL的轻量级、易于使用的3D库。它极大地简化了WebGL的复杂细节,降低了学习成本,同时提高了性能。

three.js的三大核心元素:

  1. 场景(Scene)

    • 场景是一个三维空间,是所有物品的容器。可以将其想象成一个空房间,里面可以放置要呈现的物体、相机、光源等。
    • 使用方法:通过new THREE.Scene()来创建一个新的场景。
/*
 *1. 创建场景  -- 放置物体对象的环境
 */
const scene = new THREE.Scene();
  1. 相机(Camera)
    相机用来确定观察位置、方向、角度。相机看到的内容,就是最终在屏幕上看到的内容。
    three.js中常用的相机类型包括:
    透视投影相机(PerspectiveCamera):模拟人眼看到的效果,近大远小。通过指定视野(Field of View,FOV)、长宽比、近端渲染距离和远端距离来创建。
    例如:new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000)
/*
 * 2.创建相机(这里是 透视摄像机--用来模拟人眼所看到的景象)
 */
const camera = new THREE.PerspectiveCamera(
  75, // 视野角度
  window.innerWidth / window.innerHeight, // 长宽比
  0.1, // 进截面
  1000 // 远截面
);
// 设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera); // 将相机添加到场景中

在这里插入图片描述

  • 使用THREE.PerspectiveCamera构造函数创建一个新的透视相机实例。
  • 75:视野角度(Field of View,简称FOV),表示相机“看到”的角度范围。这里设置为75度。
  • window.innerWidth / window.innerHeight:相机的纵横比(Aspect Ratio),通常设置为窗口的宽度与高度的比值,以确保渲染的图像不会拉伸或压缩。
  • 0.1:近裁剪面(Near Clipping Plane),表示相机能够“看到”的最近距离。小于这个距离的物体将不会被渲染。
  • 1000:远裁剪面(Far Clipping Plane),表示相机能够“看到”的最远距离。大于这个距离的物体将不会被渲染。
  • 使用camera.position.set()方法设置相机的位置。这里的坐标是(0, 0, 10),意味着相机位于世界坐标的原点上方10个单位的位置(在Z轴上)。在3D空间中,这通常意味着相机是“俯视”场景的。
    正交投影相机(OrthographicCamera):远近都是一样的大小,三维空间中平行的线,投影到二维空间也一定是平行的。
    在程序运行过程中,可以调整相机的位置、方向、角度。
// 假设你已经有一个场景(scene)对象  
  
// 创建正交相机  
const camera = new THREE.OrthographicCamera(  
  left, // 相机左平面  
  right, // 相机右平面  
  top, // 相机上平面  
  bottom, // 相机下平面  
  near, // 近裁剪面  
  far // 远裁剪面  
);  
  
// 设定相机位置(对于正交相机来说,这不是必需的,但通常你需要设置它以获得期望的视角)  
camera.position.set(0, 0, 10);  
  
// 将相机添加到场景中(注意:相机通常不直接添加到场景中,而是由渲染器使用)  
// 但在这里,如果你只是为了存储它或做其他操作,你可以这样做  
// scene.add(camera); // (这通常是不必要的)  

为了设置正交相机的参数,你需要定义六个值:

  • left:相机左平面与视图的左边界的距离。
  • right:相机右平面与视图的右边界的距离。
  • top:相机上平面与视图的上边界的距离。
  • bottom:相机下平面与视图的下边界的距离。
  • near:近裁剪面,相机能够“看到”的最近距离。
  • far:远裁剪面,相机能够“看到”的最远距离。
    在实际使用中,你可能需要根据你的场景大小和所需的视图范围来计算这些值。例如,如果你想要一个与窗口宽度和高度匹配的正交视图,你可以这样设置:
const aspectRatio = window.innerWidth / window.innerHeight;  
const width = 10; // 假设你想要的视图宽度为10个单位  
const height = width / aspectRatio; // 计算视图高度以保持相同的宽高比  
  
const camera = new THREE.OrthographicCamera(  
  -width / 2, // left  
  width / 2, // right  
  height / 2, // top  
  -height / 2, // bottom  
  1, // near  
  1000 // far  
);

在这里插入图片描述

  1. 渲染器(Renderer)

    • 渲染器是用来通过相机把画面渲染到屏幕上的组件。
    • 使用方法:创建一个WebGL渲染器实例,设置渲染的尺寸大小,然后将渲染器的canvas内容添加到HTML文档的body中。
    • 例如:使用new THREE.WebGLRenderer()来创建一个WebGL渲染器,并通过renderer.setSize(width, height)设置渲染尺寸,最后使用document.body.appendChild(renderer.domElement)将渲染的canvas添加到页面中。
      以下是如何创建一个THREE.WebGLRenderer并将其添加到HTML文档中的基本步骤:
      1.创建渲染器实例:
      使用new THREE.WebGLRenderer()来创建一个新的WebGL渲染器实例。
      2.设置渲染器尺寸:
      使用renderer.setSize(width, height)方法来设置渲染器的宽度和高度。这通常与HTML元素的尺寸相匹配,例如元素。
      3.将渲染器的DOM元素添加到HTML文档中:
      渲染器会创建一个canvas元素,你可以通过renderer.domElement访问它。将这个canvas元素添加到HTML文档的某个位置,通常是body元素内。
      4.渲染场景:
      使用renderer.render(scene, camera)方法来渲染场景。这个方法需要两个参数:场景(Scene)和相机(Camera)。它会将相机视角下的场景内容渲染到渲染器的canvas元素上。
      下面是一个简单的示例代码:
// 假设你已经有了场景(scene)和相机(camera)

// 1. 创建渲染器实例
const renderer = new THREE.WebGLRenderer();

// 2. 设置渲染器尺寸(通常与canvas元素或窗口大小匹配)
renderer.setSize(window.innerWidth, window.innerHeight);

// 3. 将渲染器的DOM元素添加到HTML文档中
document.body.appendChild(renderer.domElement);

// 4. 渲染场景
renderer.render(scene, camera);

// 注意:你可能还需要一个动画循环来持续更新和渲染场景
function animate() {
    requestAnimationFrame(animate); // 请求下一个动画帧

    // 更新场景中的物体(如果需要)
    // ...

    // 渲染场景
    renderer.render(scene, camera);
}
animate();

// 另外,你可能还需要处理窗口大小变化事件来更新渲染器尺寸
window.addEventListener('resize', onWindowResize, false);
function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight; // 更新相机纵横比(如果需要)
    camera.updateProjectionMatrix(); // 更新投影矩阵
    renderer.setSize(window.innerWidth, window.innerHeight); // 更新渲染器尺寸
}

在这个示例中,animate函数使用requestAnimationFrame来创建一个动画循环,该循环在每个动画帧中更新场景并渲染它。同时,还添加了一个事件监听器来处理窗口大小变化事件,以确保渲染器的尺寸与窗口尺寸保持一致。

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

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

相关文章

桌面提醒工具哪个好?简单好用的便签提醒app推荐

在日常的生活和工作中,我们经常会遇到各种各样的事情,有时候可能会遗忘一些重要的事情。这个时候,一个简单好用的便签提醒工具就显得尤为重要了。那么,哪款桌面提醒工具比较好用呢?下面,就为大家推荐一款我…

新手教程系列 -- SQLAlchemy对同一张表联表两次

在开发过程中,我们经常会遇到对同一张表进行多次联表查询的需求。比如在查询航线时,我们希望将起飞和降落的机场名称代入结果中。为了实现这一目标,机场名称统一存放在 AirPort 表中。下面,我们将介绍如何通过 SQLAlchemy 实现这一需求。 问题描述 一般情况我们第一时间会…

AI 激发算力需求暴增,施耐德电气解码智算中心发展

随着全球碳达峰目标的持续推进,各行各业都在加速绿色转型的步伐,尤其是高耗能产业更是备受关注。人工智能行业以其迅猛的发展速度令人瞩目,它所带来的不仅是算力需求的飙升,更是日益凸显的能耗问题。 目前,人工智能预…

11.常见的Transforms(二)

常见的Transforms(二) 1.Resize() 的使用 1.1 作用 resize可以把输入的图片按照输入的参数值重新设定大小。 1.2 所需参数 需要输入想要重新设定的图片大小。 输入的参数类型可以为包含长和宽数值的一个序列(h,w)或者一个整…

grpc学习golang版( 八、双向流示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…

远程监控在工业机械安全操作中的应用——以汽车起重机为例

远程监控技术,作为现代信息技术的重要分支,正逐渐在各个领域展现其独特的价值。从字面上理解,远程监控可以分为“监”和“控”两部分:其中,“监”指的是通过网络进行信息的获取与传递,实现远程状态的实时感…

Dominate_一个用于生成和操作 HTML 文档的 Python 库

目录 01初识 Dominate 什么是 Dominate? 为什么选择 Dominate? 安装与配置 02Dominate 的基本使用 创建简单的 HTML 文档 添加表格 嵌套结构 03Dominate 的高级功能 动态内容生成 使用…

第十九课,编写并调用自定义函数

一,函数五大组成部分 因为其重要性故再此强调,参数列表可以为任意个数,返回值只能有一个(请初学者暂时这样认为) 特殊的,如果不需要返回结果,用None替代! 二,编写自定义…

JDK线程池ThreadPoolExecutor运行原理详解

jdk线程池,是java后端处理异步任务的主要解决方案,使用广泛。jdk线程池相关的面经,网上很多,但是鱼龙混杂,很多瞎写的。要想真正了解原理,还是要看源码。所以,写一篇文章,深入的了解一下 文章目…

web项目打包成可以离线跑的exe软件

目录 引言打开PyCharm安装依赖创建 Web 应用运行应用程序打包成可执行文件结语注意事项 引言 在开发桌面应用程序时,我们经常需要将网页集成到应用程序中。Python 提供了多种方法来实现这一目标,其中 pywebview 是一个轻量级的库,它允许我们…

【渗透工具】内网多级代理工具Venom详细使用教程

免责申明 本公众号的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息…

SecureBoost:一种无损的联邦学习框架

SecureBoost:一种无损的联邦学习框架 文章目录 SecureBoost:一种无损的联邦学习框架1 引言2 预备知识与相关工作3 问题描述4 联邦学习与SecureBoost5 联邦推理6 无损属性的理论分析7 安全讨论8 实验9 结论 摘要——用户隐私保护是机器学习中的一个重要问…

MySQL高级-SQL优化- limit优化(覆盖索引加子查询)

文章目录 0、limit 优化0.1、从表 tb_sku 中按照 id 列进行排序,然后跳过前 9000000 条记录0.2、通过子查询获取按照 id 排序后的第 9000000 条开始的 10 条记录的 id 值,然后在原表中根据这些 id 值获取对应的完整记录 1、上传5个sql文件到 /root2、查看…

AV Foundation学习笔记二 - 播放器

ASSets AVFoundation框架的最核心的类是AVAsset,该类是整个AVFoundation框架设计的中心。AVAsset是一个抽象的(意味着你不能调用AVAsset的alloc或者new方法来创建一个AVAsset实例对象,而是通过该类的静态方法来创建实例对象)、不…

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数: 函数二 函数三 主函数 运行结果 src: model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征,实现高准确度的身份识别。…

多地高温持续“热力”爆表 约克VRF中央空调带你清凉舒爽一夏

“出门5分钟,流汗2小时”,夏季高温天气,怎一个“热”字了得?6月以来,我国多地迎来高温“炙烤”,全国出现40℃以上高温的范围持续增加,随着中央气象台高温预警持续拉响,人们都很纳闷:…

springboot + Vue前后端项目(第二十一记)

项目实战第二十一记 写在前面1. springboot文件默认传输限制2. 安装视频插件包命令3. 前台Video.vue4. 创建视频播放组件videoDetail.vue5. 路由6. 效果图总结写在最后 写在前面 本篇主要讲解系统集成视频播放插件 1. springboot文件默认传输限制 在application.yml文件中添…

5. Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么?★ (Spring 是包含了众多⼯具⽅法的 IoC 容器)1.1.1 什么是容器?1.1.2 什么是 IoC?★ (IoC: Inversion of Control (控制反转))总…

2.用BGP对等体发送路由

2.用BGP对等体发送路由 实验拓扑: 实验要求:用BGP对等体发送路由信息 实验步骤: 1.完成基本配置(略) 2.建立BGP对等体(略) 3.创建路由信息(用创建一个loop back接口就能产生一个直连…

毅速丨金属3D打印是制造业转型升级的重要技术

随着科技的进步,金属3D打印技术已成为制造业升级的重要驱动力。它以其独特的优势,正引领着制造业迈向新的未来。 金属3D打印技术的突破: 设计自由。金属3D打印能制造任意形状和结构的零件,为设计师提供了无限的创意空间。 快速制…