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

news2025/2/4 20:42:34

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端
📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招)
🚀未来打算: 为中国的工业软件事业效力n年
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2&Vue3项目实战 🥝Node.js 🍒Three.js
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享&商务合作,快加入进来吧

Three.js 系列文章目录

Three.js 专栏参考链接
Three.js 入门案例程序人生——与足球共舞的火柴人
Three.js 入门(一)创建第一个场景和物体(轨道控制器、坐标轴辅助器…)
Three.js 入门(二)处理动画、尺寸自适应、双击进入/退出全屏

文章目录

  • Three.js 系列文章目录
    • 一、应用图形用户界面更改变量(GUI)
    • 二、BufferGeometry 设置顶点创建矩形
    • 三、随机生成多个三角形


【使用 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)
})

在这里插入图片描述

在这里插入图片描述


接下来,深入了解一下 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')

【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()

在这里插入图片描述


三、随机生成多个三角形

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

我们随机生成 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)
})

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


在这里插入图片描述


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

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

相关文章

第四章操作系统测试

一. 单选题&#xff08;共24 题&#xff0c;72.0分&#xff09; (单选题,3.0分)用户编写的程序中所使用的地址是&#xff08; C &#xff09;。 A. 内存地址 B. 物理地址 C. 逻辑地址 D. 绝对地址 解释&#xff1a;逻辑地址&#xff1a;用户空间中使用的一种地址又称相对地址 …

一行 Python 代码能实现什么丧心病狂的功能?

手头有 109 张头部 CT 的断层扫描图片&#xff0c;我打算用这些图片尝试头部的三维重建。基础工作之一&#xff0c;就是要把这些图片数据读出来&#xff0c;组织成一个三维的数据结构&#xff08;实际上是四维的&#xff0c;因为每个像素有 RGBA 四个通道&#xff09;。这个数据…

gitLab

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。下面是使用步骤 1. 注册 进入注册页面&#xff08;需要公司的人提供地址&#xff09;例如&#xff1a; http://xx.xxx.xx.xx:18000/users/sign_in …

大漠插件最新版7.2248

工具名称:大漠插件最新版7.2248 工具简介:/ v7.2242更新时间2022年11月16日:/ v7.2248 1. 优化某些模式,在绑定时,有小概率会卡死在绑定函数里的问题. 2. 解决Assemble DisAssemble和GetRemoteApiAddress的COM版本的DLL&#xff0c;在E语言下用类库封装后调用时,对64位地址解析…

4.http模块

http模块是Node.js官方提供创建web服务器的模块&#xff0c;在使用http模块前首先导入http模块 目录 1 一些概念 1.1 IP 1.2 域名 1.3 端口 2 创建一个基本的web服务器 3 req请求对象 4 res响应对象 5 不同地址获取不同响应 6 在服务中加载html文件 6.1 基…

vsomeip 快速入门

vsomeip 快速入门 文章目录vsomeip 快速入门1. 下载仓库2. 编译2.1 安装相关依赖2.2 编译vsomeip2.3 编译hello_world example3. 运行1. 下载仓库 git clone https://github.com/COVESA/vsomeip.git2. 编译 2.1 安装相关依赖 我的ubuntu 版本是20.04&#xff0c;所以以ubunt…

Python幂分布

文章目录幂分布帕累托分布Zipf分布power(a)p(x)axa−1p(x)ax^{a-1}p(x)axa−1幂分布pareto(a)p(x)amaxa1p(x)\frac{am^a}{x^{a1}}p(x)xa1ama​帕累托分布zipf(a)p(k)k−aζ(a)p(k)\frac{k^{-a}}{\zeta(a)}p(k)ζ(a)k−a​齐普夫分布 幂分布 幂分布的形式是非常简单的&#xff…

计算机毕设Python+Vue学习管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

大脑皮层的分割方法

大脑皮层分割的意义 神经元之间的相互联系构成了大脑内信息传递的主要手段&#xff0c;这些连接构成了一个复杂的网络。可以通过现代医学成像技术&#xff0c;如磁共振成像MRI在宏观尺度上进行估计 网络节点的定义是构建大脑连接网络的关键步骤之一。使用体素水平的网络具有高…

vue之动态组件

切换组件案例 点击一个tab-bar&#xff0c;切换不同的组件显示&#xff1a; 这个可以通过两种不同的思路来实现&#xff1a; 方式一&#xff1a;通过v-if来判断&#xff0c;显示不同的组件。方式二&#xff1a;动态组件的方式。 &#xff08;1&#xff09;通过v-if来判断显示不…

高粱根质膜中K~+ -ATPase活性重组入人工脂质体/硫修饰脂质体包裹的VEGF反义寡核苷酸的相关研究

小编在这里给大家整理了高粱根质膜中K~ -ATPase活性重组入人工脂质体/硫修饰脂质体包裹的VEGF反义寡核苷酸的相关研究&#xff0c;一起来看&#xff01; 高粱根质膜中K~ -ATPase活性重组入人工脂质体相关研究&#xff1a; 将高粱根质膜中K~ -ATPase活性重组入人工脂质体中 ,并…

迁移速度与计算性能兼得!天翼云DirtyLimit技术大显身手

虚拟机技术的快速发展使系统迁移变得更加灵活且多样化&#xff0c;其广泛应用也促使用户对虚拟机迁移速度和性能影响提出了更高要求。天翼云弹性计算虚拟化团队创新研发DirtyLimit虚拟机迁移加速技术&#xff0c;能够在保证读vCPU性能几乎不下降的情况下&#xff0c;有效缩短虚…

行业沙龙第五期丨供应商全生命周期管理赋能高质量采购

找不到好的供应商、供应商管理难&#xff0c;高成本效率低&#xff0c;货品质量难管控、交货不及时等等&#xff0c;导致错失了客户&#xff0c;太可惜了&#xff0c;怎么办呢&#xff1f;追根溯源&#xff0c;这些问题的源头多在于没有做好供应商管理。 供应商管理是供应链采…

[LeetCode 1760]袋子里最少数目的球

题目描述 题目链接&#xff1a;[LeetCode 1760]袋子里最少数目的球 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#xff0c;并…

week8 正交化/human-level error/train,dev,test sets

文章目录前言一、8.1,8.2 正交化二、8.3,8.4评估指标1、 单一量化评估指标2、满足和优化指标三、8.5-8.7训练开发测试数据集1、训练开发测试数据集的分布。2、训练开发测试数据集的大小选择3、何时更改指标或者开发测试数据集四、 8.8-8.12 与人类水平相比较1、为什么选择与人类…

单商户商城系统功能拆解49—应用中心—在线客服

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

工业物联网解决方案:油井数据远程监控系统

石油行业是国民经济的重要能源支柱&#xff0c;是推动工业发展的原动力。随着物联网、云计算、5G无线通信等技术的发展&#xff0c;多种要素驱动下的生产系统逐步向着数字化转型&#xff0c;重要性越来越明显。油井数字化就是其中的重要一环。 油田开采区域广阔&#xff0c;分…

【苹果推iMessage送】摆设overrideUserInterfaceStyle属性以使该视图及其子视图具备特定的UIUserInterfaceStyle

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

攻防世界-宜兴网信办-fileinclude

题目 访问题目场景 查看网页源代码&#xff0c;发现其中存在php代码 <?php if( !ini_get(display_errors) ) { //ini_get是获取php.ini里的环境变量的值。环境变量未设置错误回显ini_set(display_errors, On);} error_reporting(E_ALL);//报告所有类型的错误 $lan $_COOK…

微信小程序遍历Echarts图表,实现遍历多个柱状图

1.wxml文件 <view stylewidth:100%;height:200rpx><ec-canvas id"mychart-dom-bar" canvas-id"mychart-bar" ec"{{ ec }}"></ec-canvas> </view>2.js文件 import * as echarts from ../../common/ec-canvas/echarts; …