【Three.js入门】图形用户界面GUI、BufferGeometry创建矩形、随机生成多个随机颜色的三角形

简介: 【Three.js入门】图形用户界面GUI、BufferGeometry创建矩形、随机生成多个随机颜色的三角形

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

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


一、应用图形用户界面更改变量(GUI)

简介:图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。


终端键入如下命令,安装 dat.gui

npm install --save dat.gui

导入 gui,创建 gui 实例,修改代码如下:

// 导入 dat.gui
import * as dat from "dat.gui"
.......
// 创建 gui 实例
const gui = new dat.GUI()
// 在 x 轴移动(最小0,最大4,步数0.01,设置名字,改变时输出,完全停下来的时候也输出)
gui.add(cube.position, "x").min(0).max(4).step(0.01).name("沿x轴移动").onChange((value) => {
    console.log("值被修改了:", value)
}).onFinishChange((value) => {
    console.log("完全停下来:", value)
})

49d118dc45eb4ed99d3a0a7f116b81ee.png

e50921a26cb74348bf36d56ffa6577d1.png

接下来,深入了解一下 gui,完成修改物体颜色,显示/隐藏物体,让物体移动,以及添加文件夹显示边线的功能

......
const params = {
  // 修改物体的颜色
    color: "#ffff00",
    // 让立方体运动起来(2s移动到位置4),往返运动,无限循环
    fn: () => {
        gsap.to(cube.position, {
            x: 4,
            duration: 2,
            yoyo: true,
            repeat: -1
        })
    }
}
// 改变物体颜色
gui.addColor(params, "color").onChange((value) => {
    cube.material.color.set(value)
})
// 设置选项框(显示/隐藏物体)
gui.add(cube, "visible").name('显示/隐藏物体')
// 设置按钮点击触发某个事件
gui.add(params, 'fn').name('立方体运动')
// 设置文件夹
let folder = gui.addFolder('设置立方体')
// 显示实体/边线
folder.add(cube.material, 'wireframe')

https://www.bilibili.com/video/BV1Q8411n7GN?t=1.3

【GUI 用户界面更改变量】

二、BufferGeometry 设置顶点创建矩形

通过六个点,渲染出一个矩形

把原先 cube 相关内容删掉,我们通过创建六个点来渲染出一个矩形

import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 创建场景
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 geometry = new THREE.BufferGeometry()
// 设置顶点
const vertices = new Float32Array([
    -1.0, -1.0, 1.0,
    1.0, -1.0, 1.0,
    1.0, 1.0, 1.0,
    1.0, 1.0, 1.0,
    -1.0, 1.0, 1.0,
    -1.0, -1.0, 1.0
])
// 设置每三个值为一个坐标
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3))
// 创建材质
const material = new THREE.MeshBasicMaterial({
    color: 0xffff00
})
// 根据几何体和材质创建物体
const mesh = new THREE.Mesh(geometry, material)
// 将物体添加到场景中
scene.add(mesh)
console.log(mesh)
// 修改物体的颜色
const params = { color: "#ffff00" }
// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
// console.log(renderer)
// 将 webgl 渲染的 canvas 内容添加到 body
document.body.appendChild(renderer.domElement)
// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()
controls.enableDamping = true
// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(4)
// 添加到场景中
scene.add(axesHelper)
// 渲染函数
function render() {
    controls.update()
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    requestAnimationFrame(render)
}
render()

8afece1ed63342bbbe9ecce4204b516d.png

三、随机生成多个三角形

在上文知识的基础上,我们来实现 随机生成多个不同颜色不同大小的三角形

我们随机生成 45 个随机颜色的三角形,每xyz三个坐标确定一个点,每三个点确定一个三角形,随机生成它们

import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControl } from 'three/examples/jsm/controls/OrbitControls'
// 创建场景
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)
// 添加物体
// 创建三角形
for (let i = 0; i < 45; i++) {
    // 每个三角形,需要3个顶点,每个顶点需要3个值
    const geometry = new THREE.BufferGeometry()
    //  32 位的浮点数型数组,设置顶点
    const positionArray = new Float32Array(9)
    for (let j = 0; j < 9; j++) {
        positionArray[j] = Math.random() * 10 - 5
    }
    // 设置每三个值为一个坐标
    geometry.setAttribute('position', new THREE.BufferAttribute(positionArray, 3))
    // 随机生成颜色
    let color = new THREE.Color(Math.random(), Math.random(), Math.random())
    // 创建材质(设置颜色,透明度)
    const material = new THREE.MeshBasicMaterial({
        color: color,
        // 设置透明度
        transparent: true,
        opacity: 0.6
    })
    // 根据几何体和材质创建物体
    const mesh = new THREE.Mesh(geometry, material)
    // 将物体添加到场景中
    scene.add(mesh)
    console.log(mesh)
}
// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
// console.log(renderer)
// 将 webgl 渲染的 canvas 内容添加到 body
document.body.appendChild(renderer.domElement)
// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()
controls.enableDamping = true
// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5)
// 添加到场景中
scene.add(axesHelper)
// 渲染函数
function render() {
    controls.update()
    renderer.render(scene, camera)
    // 请求动画帧-下一帧的时候重新渲染
    requestAnimationFrame(render)
}
render()
// 监听画面的变化,更新渲染画面
window.addEventListener('resize', () => {
    // 更新摄像头
    camera.aspect = window.innerWidth / window.innerHeight
    // 更新摄像机的投影矩阵
    camera.updateProjectionMatrix()
    // 更新渲染器
    renderer.setSize(window.innerWidth, window.innerHeight)
    // 设置渲染器的像素比
    renderer.setPixelRatio(window.devicePixelRatio)
})

https://www.bilibili.com/video/BV1f14y1A7a4?t=0.7

【随机生成多个随机颜色的三角形】

45fc82a82c6542bdb2ff4986377d8db3.png


相关文章
|
2月前
|
JavaScript 前端开发 C语言
javascript基础入门
javascript基础入门
24 1
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
28 0
|
3月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
77 0
|
2天前
|
存储 JavaScript 前端开发
【JavaScript技术专栏】JavaScript基础入门:变量、数据类型与运算符
【4月更文挑战第30天】本文介绍了JavaScript的基础知识,包括变量(var、let、const)、数据类型(Number、String、Boolean、Undefined、Null及Object、Array)和运算符(算术、赋值、比较、逻辑)。通过实例展示了如何声明变量、操作数据类型以及使用运算符执行数学和逻辑运算。了解这些基础知识对初学者至关重要,是进阶学习JavaScript的关键。
|
7天前
|
前端开发 JavaScript
前端 富文本编辑器原理——从javascript、html、css开始入门(二)
前端 富文本编辑器原理——从javascript、html、css开始入门
19 0
前端 富文本编辑器原理——从javascript、html、css开始入门(二)
|
7天前
|
前端开发 JavaScript 索引
前端 富文本编辑器原理——从javascript、html、css开始入门(一)
前端 富文本编辑器原理——从javascript、html、css开始入门
18 0
|
2月前
Three.js点线几何空间图形代码
Three.js点线几何空间图形代码
15 2
Three.js点线几何空间图形代码
|
2月前
|
前端开发
编程笔记 html5&css&js 018 HTML颜色
编程笔记 html5&css&js 018 HTML颜色
|
3月前
|
前端开发 JavaScript
从零开始学习前端开发:HTML、CSS、JavaScript入门指南
【2月更文挑战第1天】本文将带领读者从零开始学习前端开发,介绍HTML、CSS和JavaScript的基础知识与应用,帮助读者快速入门前端开发领域。
66 1
|
3月前
|
JSON 前端开发 JavaScript
Webpack【Webpack图片处理、Webpack中proxy代理 、自动清理dist、Webpack优化、JavaScript中的代码检查】(三)-全面详解(学习总结---从入门到深化)
Webpack【Webpack图片处理、Webpack中proxy代理 、自动清理dist、Webpack优化、JavaScript中的代码检查】(三)-全面详解(学习总结---从入门到深化)
39 0
Webpack【Webpack图片处理、Webpack中proxy代理 、自动清理dist、Webpack优化、JavaScript中的代码检查】(三)-全面详解(学习总结---从入门到深化)