three中界面交互gui.js库的使用

gui.js库(可视化改变三维场景)

dat.gui.js说白了就是一个前端js库,对HTML、CSS和JavaScript进行了封装,学习开发的时候,借助dat.gui.js可以快速创建控制三维场景的UI交互界面,你打开课件中案例源码体验一下就能感受到。

学习dat.gui.js也是建立一种思想,就是threejs三维空间的很多参数,不是心算出来的,往往需要可视化的方式调试出来。

引入dat.gui.js

gihtub地址:https://github.com/dataarts/dat.gui

npm地址:https://www.npmjs.com/package/dat.gui

// 引入dat.gui.js的一个类GUI
import { GUI } from 'three/addons/libs/lil-gui.module.min.js';

创建一个GUI对象

创建一个GUI对象,你可以看到浏览器右上角多了一个交互界面,GUI本质上就是一个前端js库。

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

.domElement:改变GUI界面默认的style属性

通过.domElement属性可以获取gui界面的HTML元素,那就意味着你可以改变默认的style样式,比如位置、宽度等。

//改变交互界面style属性
gui.domElement.style.right = '100px';
gui.domElement.style.left = '100px';
gui.domElement.style.width = '300px';

.add()方法

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

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

其他参数,可以一个或多个,数据类型也可以不同,gui会自动根据参数形式,自动生成对应的交互界面。

参数3和参数4,分别是一个数字,交互界面是一个鼠标可以拖动的拖动条,可以在一个区间改变属性的值

gui.add(camera.position, 'x', 1, 100).name('相机的位置x轴的位移')
gui.add(camera.position, 'y', 1, 150).name('相机的位置y轴的位移')
gui.add(camera.position, 'z', 1, 150).name('相机的位置z轴的位移')

gui改变threejs光照强度测试

three.js在调试场景渲染效果的时候,比如光照的强度,人大脑的CPU是没有能力通过光照参数算出来模型渲染效果的,一般来说你先大概给一个经验值,然后通过gui在这个大概值的基础上下浮动可视化调试。

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

// 光照强度属性.intensity
const ambient = new THREE.AmbientLight(0xffffff, 1);
gui.add(ambient, 'intensity', 0, 2.0);

gui改变threejs模型位置测试

mesh.position是JavaScript对象,具有xyz属性,这三个属性分别表示模型的xyz坐标,这就是说,gui改变mesh.positionxyz属性,就可以可视化改变mesh的位置。

// 通过GUI改变mesh.position对象的xyz属性
gui.add(mesh.position,'x',0,100).name('网格x');
gui.add(mesh.position,'y',0,100).name('网格y');
gui.add(mesh.position,'z',0,100).name('网格z');

.name()方法

.add()创建的交互界面,会默认显示所改变属性的名字,为了通过交互界面更好理解你改变的某个对象属性,你可以通过.name()方法改变gui生成交互界面显示的内容。

const gui = new GUI();//创建GUI对象 
gui.add(ambient, 'intensity', 0, 2.0).name('环境光强度');
gui.add(directionalLight, 'intensity', 0, 2.0).name('平行光强度');

步长.step()方法

步长.step()方法可以设置交互界面每次改变属性值间隔是多少。

gui.add(ambient, 'intensity', 0, 2.0).name('环境光强度').step(0.1);

.onChange()方法

当gui界面某个值的时候,.onChange()方法就会执行,这时候你可以根据需要通过.onChange()执行某些代码。

gui.add(camera.position, 'x', 1, 100).onChange((val)=>{console.log(val)
}).name('相机的位置x轴的位移')

.addColor()颜色值改变

.addColor()生成颜色值改变的交互界面

let obj = { color: 0x0000ff }
gui.addColor(obj,'color').onChange((val)=>{mesh.material.color.set(val)
})

gui调试3-下拉菜单、单选框 

.add()方法参数3数据类型:数组

参数3是一个数组,生成交互界面是下拉菜单

const obj = {scale: 0,
};
// 参数3数据类型:数组(下拉菜单)
gui.add(obj, 'scale', [-100, 0, 100]).name('y坐标').onChange(function (value) {mesh.position.y = value;
});
.add()方法参数3数据类型:对象

参数3是一个对象,生成交互界面是下拉菜单

const obj = {scale: 0,
};
// 参数3数据类型:对象(下拉菜单)
gui.add(obj, 'scale', {left: -100,center: 0,right: 100// 左: -100,//可以用中文// 中: 0,// 右: 100
}).name('位置选择').onChange(function (value) {mesh.position.x = value;
});
.add()方法对应属性的数据类型:布尔值

如果.add()改变属性的对应的数据类型如果是布尔值,那么交互界面就是一个单选框。

const obj = {bool: false,
};gui.add(obj, 'bool').onChange(function (value) {// 点击单选框,控制台打印obj.bool变化console.log('obj.bool',value);
});// 渲染循环
function render() {// 当gui界面设置obj.bool为true,mesh执行旋转动画if (obj.bool) mesh.rotateY(0.01);renderer.render(scene, camera);requestAnimationFrame(render);
}
render();

.addFolder()分组 

new GUI()实例化一个gui对象,默认创建一个总的菜单,通过gui对象的.addFolder()方法可以创建一个子菜单,当你通过GUI控制的属性比较多的时候,可以使用.addFolder()进行分组。

// 创建一个GUI实例const gui = new GUI();// 创建相机的位置的子菜单const matFolder = gui.addFolder('相机的位置');matFolder.close()matFolder.add(camera.position, 'x', 1, 100).onChange((val)=>{console.log(val)}).name('相机的位置x轴的位移')matFolder.add(camera.position, 'y', 1, 150).name('相机的位置y轴的位移')matFolder.add(camera.position, 'z', 1, 150).name('相机的位置z轴的位移')// 创建环境光的子菜单const matFolder2 = gui.addFolder('关照强度');matFolder2.close()//步长.step()方法可以设置交互界面每次改变属性值间隔是多少。matFolder2.add(ambient,'intensity',0,2.0).name('关照强度').step(0.1);// 创建网格位置的子菜单const matFolder3= gui.addFolder('网格位置');matFolder3.close()matFolder3.add(mesh.position,'x',0,100).name('网格x');matFolder3.add(mesh.position,'y',0,100).name('网格y');matFolder3.add(mesh.position,'z',0,100).name('网格z');// 创建颜色值改变的子菜单const matFolder4= gui.addFolder('颜色值');let obj = { color: 0x0000ff }matFolder4.addColor(obj,'color').onChange((val)=>{mesh.material.color.set(val)})

 

关闭.close()和展开.open()交互界面 

gui对象创建的总菜单或gui.addFolder()创建的子菜单都可以用代码控制交互界面关闭或开展状态。

const gui = new GUI(); //创建GUI对象 
gui.close();//关闭菜单
gui.open();//打开菜单

.addFolder()——子菜单嵌套子菜单

.addFolder()创建的对象,同样也具有.addFolder()属性,可以继续嵌套子菜单。

// 平行光子菜单
const dirFolder = gui.addFolder('平行光');
dirFolder.close();//关闭菜单
// 平行光强度
dirFolder.add(directionalLight, 'intensity',0,2);
const dirFolder2 = dirFolder.addFolder('位置');//子菜单的子菜单
dirFolder2.close();//关闭菜单
// 平行光位置
dirFolder2.add(directionalLight.position, 'x',-400,400);
dirFolder2.add(directionalLight.position, 'y',-400,400);
dirFolder2.add(directionalLight.position, 'z',-400,400);

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

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

相关文章

C++笔记(二)--- 继承和组合

目录 C三种继承方式 构造函数 析构 继承 public继承 protected继承 private继承 组合 访问权限 构造/析构函数调用顺序 初始化 总结 C三种继承方式 C有三种继承方式:public protected private 属性方式为 class [派生类名称] : [继承方式] [继…

嵌入式驱动学习第一周——git的使用

前言 本文主要介绍git的使用,包括介绍git,gitee,以及使用gitee创建仓库并托管代码 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏&#xf…

StarRocks实战——多维分析场景与落地实践

目录 一、OLAP 系统历史背景 1.1 历史背景与痛点 1.2 组件诉求 二、StarRocks 的特点和优势 2.1 极致的查询性能 2.2 丰富的导入方式 2.3 StarRocks 的优势特点 三、多维分析的运用场景 3.1 实时计算场景 / 家长监控中心 3.2 实时更新模型选择 3.2.1 更新模型UNIQU…

一般情况下,硬件中使用Repeating Sequence出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的

一般情况下,出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的 把timer values 修改为0 1就好了,如果是0,0.1就不行,不会有下面的波形

15:00面试,15:06就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司,期待着新的工作环境和机会。然而,新公司的加班文化让我有些始料未及。虽然薪资相对较高,但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时,公司突然宣布了一则令人…

新加坡大带宽服务器概览

随着全球互联网的迅猛发展,服务器作为支撑网络应用的重要基础设施,扮演着越来越重要的角色。新加坡,作为亚洲四小龙之一,其服务器市场也备受关注。特别是新加坡的大带宽服务器,更是受到了众多企业和个人的青睐。那么&a…

Python 实现Excel自动化办公(上)

在Python 中你要针对某个对象进行操作,是需要安装与其对应的第三方库的,这里对于Excel 也不例外,它也有对应的第三方库,即xlrd 库。 什么是xlrd库 Python 操作Excel 主要用到xlrd和xlwt这两个库,即xlrd是读Excel &am…

水印相机小程序源码

水印相机前端源码,本程序无需后端,前端直接导入即可,没有添加流量主功能,大家开通后自行添加 源码搜索:源码软件库 注意小程序后台的隐私权限设置,前端需要授权才可使用 真实时间地址拍照记录&#xff0c…

无铅/低ESR 32.768 kHz晶体单元 FC3215AN

概述 FC3215AN是一款低ESR和紧凑的32.768 kHz晶体单元,具有坚固的无铅金属盖接缝密封封装。它配备了基于我们几十年来音叉晶体器件的内部设计和生产技术专业知识而重新设计的晶体元件。它非常适合需要低电流消耗的应用,例如电池供电的物联网设备。它还支…

Python分支和循环结构及其应用(文末送书)

一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…

[算法沉淀记录] 排序算法 —— 选择排序

排序算法 —— 选择排序 基本概念 选择排序是一种简单的排序算法,它的工作原理是每次从待排序的列表中选择最小(或最大)的元素,将其与列表中的第一个位置交换,然后继续对剩余的元素进行排序,直到整个列表…

Vue3 toRaw 与 markRaw

1、toRaw 作用:返回将reactive,readonly, shallowReactive 或者 shallowReadonly 这个四个方法包裹的原始数据。如下图 toRaw返回的数据与包裹之前的数据一个地址值数据,也就是两个数据是相等。 注意:toRaw不能乱用…

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南 安装Anaconda或Miniconda: 首先,您需要从官方网站下载适用于ARM架构的Anaconda或Miniconda安装包。下载完成后,在终端中使用bash Anaconda3-2019.10-Linux-armv8.sh(文件…

Android java基础_异常

一.异常的概念 在Java中,异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,它会干扰程序的正常执行流程,并可能导致程序出现错误或崩溃。 异常在Java中是以对象的形式表示的,…

数据加密规范的重要性

数据加密规范是为了保护数据的机密性、完整性和可用性而制定的一系列标准和操作流程。随着信息技术的快速发展,数据已成为企业和组织的核心资产,因此,数据加密变得至关重要。下面将详细介绍数据加密规范的重要性和实施要点。 一、数据加密规范…

MWC 2024丨美格智能发布全新5G-A模组及FWA解决方案,将5.5G带入现实

2月26日,在MWC 2024世界移动通信大会上,美格智能正式宣布推出5G-A模组SRM817WE以及全新的5G-A FWA解决方案,包含5G-A CPE解决方案SRT858M、5G-A MiFi解决方案SRT878H和5G-A ODU解决方案SRT853MX,旨在进一步提升网络性能&#xff0…

CUDA编程 - 用向量化访存优化 - Cuda elementwise - Add(逐点相加)- 学习记录

Cuda elementwise - Add 一、简介1.1、ElementWise Add1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.1、简单的逐点相加核函数2.2、ElementWise Add float4(向量化访存)2.3、完整代码 一、简介 1.1、ElementWise Add Element-wise 操作…

ref()和reactive()

setup(){} ref() 声明响应式状态,ref() 接收参数,并将其包裹在一个带有 .value 属性的 ref 对象中返回,要在组件模板中访问 ref,从组件的 setup() 函数中声明并返回它们。 ref 的好处是,与普通变量不同&#xff0c…

画板CHECK-检测

一, 检查组件是否会压住板上的组件. LBXR20会压住板上的组件. 会压住431管子.431的5V上下电阻要在.用三极管降压到5V时, 记得记得431的输出要放在电容的前面才可以增加反馈的时间.插件的丝印方面或贴片的丝印方面要注意正确,一般都是向外的,今天换那个new-609时,昨天晚上发出的…

【Web】CTFSHOW XXE刷题记录(全)

目录 web373 web374 web375 web376 web377 web378 前置知识先看这篇文章&#xff1a;XXE漏洞学习 用的多的就是外部实体声明和参数实体声明 web373 有回显的xxe <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///flag"> ]> <z3r4y> <ct…