Three.js--》Gui.js库的使用讲解

news2024/12/28 5:24:09

目录

Gui.js库基本使用

使用three自带gui库实现基本操作

gui库实现下拉菜单和单选框

gui库分组方法实现

使用dat.gui第三方库


Gui.js库基本使用

gui.js说白了就是一个前端js库,对HTML、CSS和JavaScript进行了封装,学习开发3d技术时借助该库可以快速创建控制三维场景的UI界面,当然你也可以通过npm去安装第三方包的方式来获取该库的内容,为了方便,three.js官方中的扩展库当中也为我们提供了gui.js库,达到的效果大致一样但是使用的API可能不同,当然两种方式我都介绍一下吧。

使用three自带gui库实现基本操作

这个我百度了一下,好像之前three版本使用的是dat.gui库,而我现在下载是three.js使用的是另一个lil.gui库,这是两个不同的GUI库,虽然它们的作用相似,但是它们的用法和API有所不同,目前我下载的three.js库使用的就是lil.gui库,就姑且以它举例说明吧。

引入lil.gui库

// 引入gui.js库
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'

创建一个GUI对象

// 实例化一个gui对象
const gui = new GUI()

在页面的右上角出现了这样一个类似控制器的界面:

改变GUI界面默认是style样式:如果想修改gui界面是css样式,比如说将位置设置在左上角,可以通过如下方式进行:

使用add方法快速创建UI交互界面:执行gui的.add()方法可以快速创建一个UI交互界面,比如一个拖动条,可以用来改变一个JavaScript对象属性的属性值,格式如下:

格式:.add(控制对象,对象具体属性,其他参数)

其他参数:可以是一个或多个,数据类型也可以不同,gui会自动根据参数形式,自动生成对应的交互界面,参数3和参数4分别是一个数字,交互界面是一个鼠标可以拖动的拖动条,可以在一个区间改变属性的值。

光源对象具有一个光照强度属性 .intensity ,可以通过gui拖动改变该属性:

再比如我想修改一个立方体的位置,mesh.position是JS对象,改变其xyz数值即可:

使用name方法命名GUI功能模块: 如果你不使用name方法的话,默认情况下GUI界面显示功能模块的名称是属性名称,如果相同属性名称但是功能不同的模块的话,我们就很难分清到底功能模块对应的功能是哪一个了,这里就需要调用name方法进行命名,如下:

使用step方法设置界面改变属性值的间隔:这个方法就是避免如果GUI界面某属性值的范围太大或者太小拖到的话很难把握准度准备的,如下:

使用onChange方法来执行某些代码: 这方法作用就是比如你拖到数值到达某个值或范围时就想执行你设定的一些代码,也是比较人性化的,如下我想改变颜色:

gui库实现下拉菜单和单选框

经过上文的操作,想必大家也都了解了gui库的一些基本操作,接下来开始讲解借助add方法创建新的UI交互界面,比如下拉菜单和单选框。

实现下拉框的方式很简单,将原本的书写范围的参数替换成一个数组或对象即可,如下:

如果想实现一个单选框的话很简单,只要是布尔类型的就行,这边我举个例子,通过单选框来控制立方体的旋转与否:

在渲染器函数处进行判断

gui库分组方法实现

当GUI交互界面需要控制的属性比较多的时候,为了避免混乱可以进行适当的分组,这样更清晰:

通过addFolder方法能够为当前的功能模块设置一个子菜单,凡是使用其定义的常量进行添加功能模块的,统统归属于当前子菜单中的内容。

当然子菜单默认是展开的,如果想默认是关闭的状态可以进行如下设置:

如果想进行套娃效果,比如说在子菜单中嵌套子菜单的话,可通过如下方式:

使用dat.gui第三方库

终端执行如下命令,安装第三方包:

npm install dat.gui

安装完成之后进行导入使用即可:

// 导入dat.gui
import * as dat from 'dat.gui'
const Gui = new dat.GUI()

相关操作和上文基本差不多,不过还是有一些出入的地方,这些就大家自行探索吧,博主在这就不再过多赘述。ok给出本文的笔记代码:

import * as THREE from 'three';
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 引入gui.js库
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
// 实例化一个gui对象
const gui = new GUI()

// 1.创建场景
const scene = new THREE.Scene();
// 2.创建相机
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)
// 3.添加物体,创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1) // 设置几何体大小
const cubeMaterial = new THREE.MeshLambertMaterial({color:0xff0000}) // 设置几何体材质
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
// 修改物体的位置
// gui.add(cube.position,'x',[0,5,10])
// gui.add(cube.position,'y',{'left':-10,'center':0,'right':10})
const position = gui.addFolder('坐标位置')
const position1 = position.addFolder('坐标位置1')
position.close() // 默认是关闭状态

position1.add(cube.position,'x',0,10)

position.add(cube.position,'y',0,10)
position.add(cube.position,'z',-10,10)
scene.add(cube)
cube.position.y=2

// 修改物体的颜色
const obj = {
  color:0x00ffff,
  bool:false
}
const color = gui.addFolder('物体颜色')
color.addColor(obj,'color').onChange(value=>{
  cube.material.color.set(value)
})
gui.add(obj,'bool').name('控制旋转')

// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth,window.innerHeight)
document.body.appendChild(renderer.domElement)

// 添加一个环境光
const ambient = new THREE.AmbientLight(0xffffff,0.9)
scene.add(ambient)
gui.add(ambient,'intensity',0,2).name('环境光源').step(0.01)
// 创建一个点光源
const pointLight = new THREE.PointLight(0xffffff,1.0)
pointLight.position.set(0,5,0)
scene.add(pointLight)
gui.add(pointLight,'intensity',0,5).name('点光源')

// 创建地面网格参照
const planeGeometry = new THREE.PlaneGeometry(30,30) // 平面几何的宽高
const PlaneMateial = new THREE.MeshStandardMaterial({color:0xF8F8FF}) // 几何平面的颜色
const plane = new THREE.Mesh(planeGeometry,PlaneMateial)
plane.rotation.x = -0.5*Math.PI
plane.position.set(0,0,0)
scene.add(plane)
// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5) // 数值代表线的长度
scene.add(axesHelper) // 添加到场景之中

// 创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement)
// 设置控制器阻尼,让控制器更有真实效果,但必须在动画循环里调用 .update()
controls.enableDamping = true

export function render(){
  if(obj.bool){
    cube.rotation.y+=0.05
  }
  // 每次循环渲染时调用stats更新方法,来刷新时间
  controls.update()
  renderer.render(scene,camera) // 周期性执行相机的渲染功能,更新canvas画布上的内容
  requestAnimationFrame(render) // 接下来渲染下一帧的时候就会调用render函数
}
// 先开始就渲染一下
render()

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

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

相关文章

230502-LLM-Vicuna介绍、安装与注意事项整理

最终效果 在对话过程中,GPU与CPU均会有波动,但是主要还是CPU波动为主 相关资料 序号链接说明001本地CPU6G内存部署类ChatGPT模型(Vicuna 小羊驼) - 知乎极简安装版本,只支持CPU与命令行002最新开源语言模型 Vicuna 媲…

【Linux进阶之路】初始Linux

文章目录 一.时代背景二.硅谷发展模式三.操作系统基本定义常见的操作系统Linux系统的常见安装方式 四.基本指令的使用登录指令与用户相关的指令ls 指令——信息查看pwd指令——打印当前所处的文件位置cd指令——访问文件rm——删除指令touch——创建文件与修改文件信息tree ——…

Rust - 变量与数据的交互方式(clone)

在上一篇文章中我们介绍了变量与数据的交互方式-move,通过底层原理我们知道Rust 永远也不会自动创建数据的 “深拷贝”。因此,任何 自动的复制可以被认为对运行时性能影响较小。 但是如果我们 确实需要深度复制 String中堆上的数据,而不仅仅…

RT1010 PWM 组成配置和 PWMX 的使用

1. 前言 本篇博文将着眼于 i.MX RT1010 内部的 eFlexPWM,介绍其各个功能模块,以及 PWM 产生的原理。 2. 功能模块组成 以下是 RT1010 内部 PWM 的一个 Submoudle 的组成框图,从框图中我们可以看到: 自左向右依次有 Prescaler 对…

【C++入门】C++为什么要有缺省参数

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

后端程序员的前端必备【Vue】- 01 Vue入门

Vue概述与基础入门 1 Vue简介1.1 简介1.2 MVVM 模式的实现者——双向数据绑定模式1.3 其它 MVVM 实现者1.4 为什么要使用 Vue.js1.5 Vue.js 的两大核心要素1.5.1 数据驱动![请添加图片描述](https://img-blog.csdnimg.cn/963aca7d7a4447009a23f6900fdd7ee1.png)1.5.2 组件化 2 …

IDEA2022版教程上(下载、卸载、安装、新建工程、jdk设置、详细设置、新建/导入/删除 普通java模块、修改普通java模块名、同时打开多个工程、常用代码模板:非空判断,遍历,输出语句快捷键)

0、前景摘要 0.1 概览 0.2 套课程适用人群 初学Java语言,熟悉了记事本、EditPlus、NotePad或Sublime Text3等简易开发工具的Java初学者熟练使用其他Java集成开发环境(IDE),需要转向IDEA工具的Java工程师们关注IDEA各方面特性的J…

BPMN2.0 任务-脚本任务

描述 脚本任务(script task)是自动执行的活动。当流程执行到达脚本任务时,会执行相应的脚本。 脚本任务用左上角有一个小“脚本”图标的标准BPMN 2.0任务(圆角矩形)表示。 脚本任务使用script与scriptFormat元素定义。 <scriptTask id="theScriptTask" nam…

Qt中的绘图事件

文章目录 QPainter 绘图绘图设备QPixmap QPainter 绘图 绘图事件 void paintEvent()声明一个画家对象 QPainter painter(this) this指定绘图设备画线、画圆、画矩形、画文字设置画笔 QPen 设置画笔宽度 、风格设置画刷 QBrush 设置画刷 风格 测试 #include "widget.h&quo…

科学计算库Numpy快速入门

目录 Numpy概述array数组数组结构数组类型数值运算排序操作数组形状操作数组生成函数四则运算随机模块文件读写 Numpy概述 NumPy 是 Python 中的一个开源数学库&#xff0c;提供了快速且便捷的数组处理功能&#xff0c;可以用来进行科学计算、数据分析、算法开发等多种任务。N…

InnoDB 磁盘结构及表空间 ( Tablespaces )

InnoDB磁盘主要包含Tablespaces&#xff0c;InnoDB Data Dictionary、Doublewrite Buffer、redo log和Undo Logs Tablespaces: 表空间分为系统表空间&#xff08;ibdata1文件&#xff09;、临时表空间、常规表空间、Undo表空间以及file-per-table表空间。系统表空间又包括双写…

CDH6.3.2-组件安装安全认证

HDFS 1.选择自定义。 2.选择HDFS ZK YARN然后点继续。 3.选择安装的主机。 4.审核更改默认就行&#xff0c;点继续。 5.配置HDFS的HA。 安装好以后点击hdfs进入实例就能够看到启动了高可用。 6.启动YARN的高可用。 KAFKA 更具需求修改资源 一直点继续就行了 FlUME HI…

CTF权威指南 笔记 -第二章二进制文件- 2.3 -静态链接

目录 地址空间分配 两个链接的方式 按序叠加 相似节合并 静态链接的详细过程 虚拟内存 重定位文件 静态链接库 地址空间分配 我们把之前的两函数分为两个文件 main.c extern int shared extern vooid fun(int *a,int *b); int main(){int a100;func(&a,&share…

MySQL监控告警及可视化:Zabbix+Percona PMP实现(Part III)

MySQL监控告警及可视化&#xff1a;ZabbixPercona PMP实现&#xff08;Part III&#xff09; 告警配置配置告警邮箱配置告警消息模板配置告警用户配置告警规则告警测试 告警配置 配置告警邮箱 在Zabbix Web前端的 Administration - Media Types - Email 中配置发送告警信息的…

什么是恺撒密码?如何用Python实现它(36)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 猫妹目前在看的&#xff0c;ycl Python等级考试五级教材&#xff0c;有一章是介绍恺撒密码的。 今天&#xff0c;咱们…

2023-5-2面试题学习

1、内存的可见性你了解吗&#xff0c;讲述一下&#xff1f; 内存可见性是指多个线程访问同一共享变量时&#xff0c;在一个线程修改了该变量值后&#xff0c;下一个线程能立即看到这种变化的能力。 如果一个变量在多个线程间共享&#xff0c;那么为了避免出现数据不一致的情况&…

为什么DDD难落地?

为什么DDD难落地&#xff1f; lorne 2023-04-23 视频地址&#xff1a; 为什么DDD难落地&#xff1f;_哔哩哔哩_bilibili 洋葱架构图&#xff1a; DDD能解决什么问题&#xff1f; 其实DDD的核心是&#xff1a;提升业务的聚合性、提升业务的拓展性。 DDD的错误认知&#xff…

CentOS7安装和部署Jenkins

安装Java环境 检查旧版&#xff1a; rpm -qa | grep java若已经安装了旧版本&#xff0c;则需要先删除&#xff0c;删除方法&#xff1a; rpm -qa nodeps [java package]安装新版&#xff1a; yum install java-11-openjdk yum install java-11-openjdk-devel&#xff08;开…

07 KVM虚拟机引导固件安装

文章目录 07 KVM虚拟机引导固件安装7.1 概述7.2 安装方法7.2.1 安装edk软件包7.2.2 查询edk软件是否安装成功 07 KVM虚拟机引导固件安装 7.1 概述 针对不同的架构&#xff0c;引导的方式有所差异。x86支持UEFI&#xff08;Unified Extensible Firmware Interface&#xff09;…

MySQL示例数据库(MySQL Sample Databases) 之 World数据库

文章目录 MySQL示例数据库(MySQL Sample Databases) 之 World数据库官方示例数据介绍World数据库World 数据库安装world-db/world.sql的脚本内容参考 MySQL示例数据库(MySQL Sample Databases) 之 World数据库 官方示例数据介绍 MySQL 官方提供了多个示例数据库&#xff0c;在…