【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


相关文章
|
15天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
112 2
|
3天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
23 10
|
1天前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
2月前
|
JavaScript 前端开发 小程序
一小时入门Vue.js前端开发
本文是作者关于Vue.js前端开发的快速入门教程,包括结果展示、参考链接、注意事项以及常见问题的解决方法。文章提供了Vue.js的基础使用介绍,如何安装和使用cnpm,以及如何解决命令行中遇到的一些常见问题。
一小时入门Vue.js前端开发
|
18天前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
18天前
|
自然语言处理 JavaScript 前端开发
JavaScript高级——ES6基础入门
JavaScript高级——ES6基础入门
17 1
|
23天前
|
Web App开发 JSON JavaScript
深入浅出:Node.js后端开发入门与实践
【10月更文挑战第4天】在这个数字信息爆炸的时代,了解如何构建一个高效、稳定的后端系统对于开发者来说至关重要。本文将引导你步入Node.js的世界,通过浅显易懂的语言和逐步深入的内容组织,让你不仅理解Node.js的基本概念,还能掌握如何使用它来构建一个简单的后端服务。从安装Node.js到实现一个“Hello World”程序,再到处理HTTP请求,文章将带你一步步走进Node.js的大门。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往后端开发新世界的大门。
|
25天前
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
253 0
|
26天前
|
前端开发 JavaScript 安全
JavaScript代码混淆入门
JavaScript代码混淆是Web应用安全防护的重要一环,通过一系列技术手段提高代码的防护能力。正确应用混淆策略不仅能有效阻止或延缓恶意攻击,还能在一定程度上保护开发者的核心技术和商业秘密。然而,需要注意的是,混淆并非绝对安全,应将其视为整体安全策略的一部分,结合其他防御措施共同构建坚固的安全防线。
49 0
|
28天前
|
数据采集 JavaScript 前端开发
【逆向基础】JS逆向入门:小白也可以看懂
【逆向基础】JS逆向入门:小白也可以看懂