探索三维世界:从Hello World开始的Three.js入门之旅

探索三维世界:从Hello World开始的Three.js入门之旅

  • 1、什么是Three.Js
  • 2、前要准备工作
  • 3、Hello World
    • 3.1、引入three
    • 3.2、创建场景
    • 3.3、创建相机
    • 3.4、渲染器
    • 3.5、创建物体
    • 3.6、渲染
    • 3.7、让正方体“动”起来
    • 3.8、手动控制正方体的运动
    • 3.9、坐标轴辅助器

1、什么是Three.Js

Three.js是一个基于JavaScript的开源3D图形库,用于创建和显示动态三维图形的Web应用程序。它提供了丰富的功能和工具集,可以轻松地创建出各种三维场景、动画和交互式体验,支持多种3D模型格式和材质,可用于游戏、虚拟现实、数据可视化等领域。

2、前要准备工作

three.js官网:https://threejs.org/ 但是由于其是部署在外国站点,直接访问起来的效果不是那么好,所以还是推荐本地直接部署一个官网文档,找到其GitHub地址:https://github.com/threejs 直接将代码下载下来,或者git pull 同理,之后执行以下命令进行本地启动

npm install
npm run dev

简单介绍一下启动项目打开的文件夹说明

文件夹名称说明
build编译后代码
docs文档
editor可视化编辑器
examples案例
src源码

3、Hello World

安装依赖,这里构建一个vue的项目就跳过了,可以快速初始化一个Vue脚手架项目

npm i three

3.1、引入three

为了真正能够让你的场景借助three.js来进行显示,我们需要以下几个对象:场景、相机和渲染器,下面就对几个对象分别说明

import * as THREE from 'three'

3.2、创建场景

场景就好比于是整个ThreeJs需要展示到哪里的地方,可以将其理解为一个大的容器

const scene = new THREE.Scene();

3.3、创建相机

three.js里有几种不同的相机,在这里,我们使用的是PerspectiveCamera(透视摄像机)。

  • 第一个参数是视野角度(FOV)。视野角度就是无论在什么时候,你所能在显示器上看到的场景的范围,它的单位是角度(与弧度区分开)。
  • 第二个参数是长宽比(aspect ratio)。 也就是你用一个物体的宽除以它的高的值。比如说,当你在一个宽屏电视上播放老电影时,可以看到图像仿佛是被压扁的。
  • 接下来的两个参数是近截面(near)和远截面(far)。 当物体某些部分比摄像机的远截面远或者比近截面近的时候,该这些部分将不会被渲染到场景中。或许现在你不用担心这个值的影响,但未来为了获得更好的渲染性能,你将可以在你的应用程序里去设置它。
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
camera.position.set( 0, 0, 5 );
scene.add( camera );

3.4、渲染器

除了我们在这里用到的WebGLRenderer渲染器之外,Three.js同时提供了其他几种渲染器,当用户所使用的浏览器过于老旧,或者由于其他原因不支持WebGL时,可以使用这几种渲染器进行降级。

除了创建一个渲染器的实例之外,我们还需要在我们的应用程序里设置一个渲染器的尺寸。比如说,我们可以使用所需要的渲染区域的宽高,来让渲染器渲染出的场景填充满我们的应用程序。因此,我们可以将渲染器宽高设置为浏览器窗口宽高。

const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

// 使用渲染器   通过相机将场景渲染
renderer.render( scene, camera );

3.5、创建物体

要创建一个立方体,我们需要一个BoxGeometry(立方体)对象. 这个对象包含了一个立方体中所有的顶点(vertices)和面(faces)。对于这个立方体,我们需要给它一个材质,来让它有颜色。Three.js自带了几种材质,在这里我们使用的是MeshBasicMaterial。所有的材质都存有应用于他们的属性的对象。这里设置一个color属性,值为0x00ff00,也就是绿色。

最后我们需要一个Mesh(网格)。 网格包含一个几何体以及作用在此几何体上的材质,我们可以直接将网格对象放入到我们的场景中,并让它在场景中自由移动。

const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );

到这里我们就完成了一个简单的ThreeJs入门的案例了,可以将一个正方体绘制到页面上了。

3.6、渲染

这里直接将整个场景给渲染到body标签下:

const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

在这里插入图片描述

3.7、让正方体“动”起来

在前面我们已经创建好了一个正方体对象cube,只需要修改其postion的xyz的值就可以修改其位置了,也就是让正方体动起来,使用js的requestAnimationFrame方法即每帧都会执行(正常情况下是60次/秒),这就让立方体有了一个看起来很不错的旋转动画。

function animate() {
    requestAnimationFrame( animate );

    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
    cube.rotation.z += 0.01;

    renderer.render( scene, camera );
}

animate();

在这里插入图片描述

3.8、手动控制正方体的运动

这里我们可以添加一个轨道控制器,它可以使得相机围绕目标进行轨道运动。OrbitControls 是一个附加组件,必须显式导入。

创建轨道控制器包含两个参数

  • object: (必须)将要被控制的相机。该相机不允许是其他任何对象的子级,除非该对象是场景自身。
  • domElement: 用于事件监听的HTML元素。
import {
    OrbitControls
} from 'three/examples/jsm/controls/OrbitControls.js'
const controls = new OrbitControls(camera, renderer.domElement);

在这里插入图片描述

3.9、坐标轴辅助器

用于简单模拟3个坐标轴的对象。红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.

const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬件语言Verilog HDL牛客刷题day07 计数器与存储器部分

1.VL50 简易秒表 1.题目: 请编写一个模块,实现简易秒表的功能:具有两个输出,当输出端口second从1-60循环计数,每当second计数到60,输出端口minute加一,一直到minute60,暂停计数。 …

亚马逊美国站严查磁体产品?亚马逊最新政策公布

近期,亚马逊美国站公布磁铁产品(不包含玩具)的最新政策更新公告,公告如下: 公告显示,由于美国消费品安全委员会(US Consumer Product Safety Commission)出台了新的安全规定&#xf…

67页新型智慧城市整体规划建设方案

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 新型智慧城市总体规划智慧城市基础平台的定位对于省:智慧城市建设是省数字政府的核心节点和重要一环 对于市直单位:智慧城市基础平台是全市数据资源和公…

ToBeWritten之反入侵安全技术面经总结

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

Transformer中的注意力机制及代码

文章目录1、简介2、原理2.1 什么是注意力机制2.2 注意力机制在NLP中解决了什么问题2.3 注意力机制公式解读2.4 注意力机制计算过程3、单头注意力机制与多头注意力机制4、代码4.1 代码14.2 代码21、简介 最近在学习transformer,首先学习了多头注意力机制&#xff0c…

动态规划之线性DP

文章目录定义题单Acwing题单AcWing 898. 数字三角形(模板题)AcWing 895. 最长上升子序列(模板题)AcWing 896. 最长上升子序列 II(模板题,优化贪心)AcWing 897. 最长公共子序列(模板题…

基于凸集上投影(POCS)的聚类算法

POCS:Projections onto Convex Sets。在数学中,凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点,可以通过找到该点在该凸集合上的投影来进行操作。该投…

Vue+springboot+java学生成绩动态追踪系统课程资源课件下载设计与实现

随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,学生成绩动态追踪系统设计与实现当然也不能排除在外,从科目信息、学生成绩的统计和分析,在过程中会产生…

Linux下的shell编程(必须给予执行权限)

目录 一:Shell编程的基本介绍 1.1 Shell脚本的执行方式 1.2 Shell变量 1.2.1 shell编程规范 1.3 Shell环境变量 1.4 Shell位置参数变量 1.5 预定义变量 1.6 运算符 1.7 条件判断(if) 1.8 流程控制 1.8.1 多分支(if-else if) 1.8.2 case(Switch case) 1…

ChatGPT帮我和老板吵架,半分钟做了个思维导图...

大家好,我是小z,也可以叫我阿粥最近那个疑似成都电科的截图已经传疯了,贴一张图回味下:这种壮士断腕式的吵法,可以说几乎是单方面的虐杀。但是有朋友问了,在职场中还是有所顾忌,有没有更体面点的…

ospf综合实验

实验要求 1,R4为ISP,其上只能配置IP地址;R4与其他所有直连设备间均使用公有IP 2,R3-R5/6/7为MGRE环境,R3为中心站点; 3,整个0sPF环境IP基于172.16.0.0/16划分; 4,所有设备均可访问R4的环回; 5,减少LSA的更新量&#xf…

【Spring Boot】自定义 Banner

文章目录1. 什么是 Banner2. 如何修改 Banner3. IDEA 中演示4. 快速生成 Banner5. 指定 banner.txt 的位置6. 在 Spring Boot 2 中的说明6.1 图片生成 Banner6.1 增强显示效果6.3 更多配置项7. 补充Spring Boot Version: 3.0.x 1. 什么是 Banner 启动 Spring Boot 时&#xf…

VisualStudio如何进行OneNote插件开发?

文章目录0、引言1、工具和数据准备2、创建工程3、创建ribbon配置文件4、编写功能代码5、安装和部署6、OneNote插件展示0、引言 在OneNote做笔记很方便,但笔者用久后,就觉得OneNote缺少自己想要的一些功能,希望通过二次开发实现不断增长的需求…

springcloud:xxl-job的任务触发机制及调度过期策略

0.引言 我们都会用xxl-job,但很少有人能够说清楚xxl-job的任务触发机制,面临任务阻塞、服务重启如何处理任务,本期我们就来一起看看xxl-job的任务触发机制 1. 调度过期策略 我们在配置策略时可以看到有一个调度过期策略配置,也…

IT知识百科:什么是BGP?

BGP(Border Gateway Protocol)是一种用于在互联网中交换路由信息的协议。BGP在互联网的路由选择和转发中扮演着至关重要的角色,是互联网的核心协议之一。在本文中,我们将深入探讨BGP的基本概念、特点和使用方法。 一、BGP的基本概…

Linux系统【centos7】常用系统命令大全

CentOS 7是一款流行的Linux操作系统。在本教程中,我们将介绍CentOS 7的一些重要功能和基本操作。 安装CentOS 7 1. 下载CentOS 7 ISO文件,并将其刻录到DVD上。 2. 将DVD插入计算机并启动。选择从DVD启动,进入CentOS 7安装程序。 3. 选择语…

剪枝与重参第二课:修剪方法和稀疏训练

目录修剪方法和稀疏训练前言1.修剪方法1.1 经典框架:训练-剪枝-微调1.2 训练时剪枝(rewind)1.3 removing剪枝2.dropout and dropconnect3.稀疏训练(Sparse training)总结修剪方法和稀疏训练 前言 手写AI推出的全新模型剪枝与重参课程。记录下个人学习笔记&#xff…

webpack5搭建react框架-开发环境配置

webpack5配置react基础开发环境 1、前言 之前已经使用webpack5进行了react框架基础环境的搭建(基础环境配置),但是每次修改完项目代码都需要重新执行npm run build指令进行构建,并且需要刷新浏览器中的页面查看最新修改的代码结…

【Linux】文件系统

文章目录文件系统1. 了解磁盘的物理结构2. 磁盘的具体物理存储结构3. 逻辑抽象4. 文件系统5. 软硬连接5.1 制作软硬连接,对比差别文件系统 我们目前的文件都是被打开的,如果没有被打开那,在哪里? 一定不是在内存当中,只…

《论文阅读》Unified Named Entity Recognition as Word-Word Relation Classification

总结 将NER视作是word-word间的 Relation Classification。 这个word-word 间的工作就很像是TPlinker那个工作,那篇工作是使用token间的 link。推荐指数:★★★☆☆值得学习的点: (1)用关系抽取的方法做NER抽取 &…
最新文章