【Three.js入门】渲染第一个场景及物体(轨道控制器、坐标轴辅助器、移动缩放旋转)

简介: 【Three.js入门】渲染第一个场景及物体(轨道控制器、坐标轴辅助器、移动缩放旋转)

https://www.bilibili.com/video/BV1hD4y1h7pi?t=1.0

【使用 Three.js 实现的效果】


一、前言

什么是 Three.js ?


Three.js 是 JavaScript 编写的 WebGL 第三方库。提供了非常多的 3D 显示功能。


你可以用它创建各种三维场景,包括了 摄影机、光影、材质等 各种对象。


Three.js 的应用场景 ?

开发工业软件、智慧城市、轻量的3D展示、建筑家装,以及其他 3D 展示效果。


几个概念 ?


场景:场景能够让你在什么地方、摆放什么东西来交给three.js来渲染,这是你放置物体、灯光和摄像机的地方。


摄相机:摄像机的抽象基类。在构建新摄像机时,应始终继承此类。


渲染器:WebGL Render 用WebGL渲染出你精心制作的场景。

二、使用 Three.js 渲染第一个场景及物体

1、基本步骤

创建场景——>创建相机——>创建物体——>把物体放进场景——>通过渲染器进行渲染

2、实例展示

(1)首先导入进来 three 文件(这里是创建了一个项目,通过 npm install 安装的依赖)

(2)创建场景

(3)创建相机对象(透视相机)

(4)设置相机的位置

(5)在场景里面添加相机

(6)创建几何体和材质

(7)根据几何体和材质创建物体

(8)将几何体添加到场景中

(9)初始化渲染器

(10)设置渲染的尺寸大小

(11)将 webgl 渲染的 canvas 内容添加到 body

(12)使用渲染器,通过相机将场景渲染进来

// 导入 three 文件
import * as THREE from 'three'
// 创建场景
const scene = new THREE.Scene()
// 创建相机对象(角度,宽高比,近端,远端)
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
// 设置相机的位置(x,y,z)
camera.position.set(0, 0, 10)
// 场景里面添加相机
scene.add(camera)
// 添加物体
// 创建几何体
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
// 创建材质
const cubeMaterial = new THREE.MeshBasicMaterial({color: 0xffff00})
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
// 将几何体添加到场景当中
scene.add(cube)
// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
// console.log(renderer)
// 将 webgl 渲染的 canvas 内容添加到 body
document.body.appendChild(renderer.domElement)
// 使用渲染器,通过相机将场景渲染进来
renderer.render(scene, camera)

5a991b76e028492c8803e7ba2997c613.png

三、轨道控制器

Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。

在上文的基础上进行如下改动,添加轨道控制器,使得物体可旋转

import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 使用控制器查看3d物体
......
// 使用渲染器,通过相机将场景渲染进来
// renderer.render(scene, camera)
// 创建轨道控制器 (domElement->用于事件监听的 HTML元素)
const controls = new OrbitControls(camera, renderer.domElement)
// 渲染函数
function render() {
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    requestAnimationFrame(render)
}
render()

https://www.bilibili.com/video/BV1LA411R792?t=0.9

使用轨道控制器效果图】

四、坐标轴辅助器

红色代表 X 轴,绿色代表 Y 轴,蓝色代表 Z 轴。

在上文的基础上添加如下代码,添加坐标轴辅助器

// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(4)
// 添加到场景中
scene.add(axesHelper)

38d748e628194dbba086fcb2dd742f68.png

五、设置物体移动

修改 cube 的 position 即可(x、y、z)

在上文的基础上把渲染函数的代码进行如下改动,就可以让物体移动起来

// 渲染函数
function render() {
    cube.position.x += 0.01
    if (cube.position.x > 4) {
        cube.position.x = 0
    }
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    requestAnimationFrame(render)
}

https://www.bilibili.com/video/BV1y44y1Z7R2?t=0.8

【设置物体的移动】

六、设置物体的缩放和旋转

修改 cube 的 scale 即可进行对物体的缩放(x、y、z)

// x 三倍,y 两倍,z 一倍
cube.scale.set(3, 2, 1)

0336937e6c4e4406b3ddbc6f278becfa.png

修改 cube 的 rotation 即可进行对物体的旋转(x、y、z)

Math.PI为180°,下面代码即沿 x 轴旋转 45°

cube.rotation.set(Math.PI / 4, 0, 0)

faaf41ef3f8e4505af870c496b525662.png

45fc82a82c6542bdb2ff4986377d8db3.png

相关文章
|
3月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
3月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
676 2
|
8天前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
26天前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
43 3
|
2月前
|
数据采集 JavaScript 搜索推荐
服务器端渲染(SSR)(Nuxt+Next.js)
服务器端渲染(SSR)技术在服务器上生成页面HTML,提升首屏加载速度和SEO效果。Nuxt.js和Next.js分别是基于Vue.js和React.js的流行SSR框架。Nuxt.js提供自动化路由管理、页面级数据获取和布局系统,支持SSR和静态站点生成。Next.js支持SSR、静态生成和文件系统路由,通过`getServerSideProps`和`getStaticProps`实现数据获取。SSR的优点包括首屏加载快、SEO友好和适合复杂页面,但也会增加服务器压力、开发限制和调试难度。选择框架时,可根据项目需求和技术栈决定使用Nuxt.js或Next.js。
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
178 1
|
2月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
100 10
|
2月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
3月前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
55 1
|
3月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战