Three.js学习7:dat.GUI 参数控制

 -----------------------------华丽的分割线---------------------

相关代码均已上传到 gitee 中:myThree: 学习 Three.js ,努力加油~!

Gitee 静态演示地址:Three JS 演示页面

 -----------------------------华丽的分割线---------------------

每个学 Three.js 的都被安利了 dat.GUI 吧?

我也不例外!

今天就来了学习下 dat.GUI,并记录下来自己的学习成果。

一、什么是 dat.GUI?

dat.GUI 是一个轻量级的图形用户界面库(GUI 组件),使用这个库可以很容易地创建出能够改变代码变量的界面组件。

官网:https://github.com/dataarts/dat.gui

国内地址:GitCode - 开发者的代码家园

Three.js 每个官方的案例都有这个面板,用于参数调试。

二、引入方式

从官网下载 dat.gui-master.zip,解压后,在 build 目录看到相关文件,用的就是它们。

1. script 标签方式

<script src="js/gui/dat.gui.min.js"></script>
<script>const gui = new dat.GUI();
</script>

2. npm 安装

$ npm install --save dat.gui
// CommonJS:
const dat = require('dat.gui');// ES6:
import * as dat from 'dat.gui';

三、创建 GUI 对象

const gui = new dat.GUI();

此时,我们在页面就有了一个 GUI 面板,不过此刻面板里什么都没有。

四、参数控制

主要用到的方法是:

  • gui.add()

  • gui.addColor()

它们都会返回一个参数控制对象。

1. 数值参数控制

gui.add(object, attr, min, max, step);

添加某个参数的控制块。其参数含义:

  • object必须。要控制的对象。

  • attr必须。控制对象的某个参数。

  • min,max:数值的最小值和最大值。它们必须同时存在。可选。

  • step:步进。即拖动下,数据改变多少。可选。

let ctrl = gui.add(obj, attr);   // input 型,有一个输入框
let ctrl = gui.add(obj, attr, 1, 100);  // 拖动滑块型。最小,最大值
let ctrl = gui.add(obj, attr, 1, 100, 1);  // 拖动滑块型。最小,最大值,步进或者
let ctrl = gui.add(obj, attr).min(1).max(100).step(1);

2. 颜色参数控制

gui.addColor( object, attr);

针对颜色的参数设置。

  • object必须。要控制的对象。

  • attr必须。控制对象的某个颜色型属性。

GUI提供了4种颜色值类型的控件(CSSRGBRGBAHue),四种类型均使用 gui.addColor()添加。

var palette = {color1: '#FF0000', // CSS stringcolor2: [ 0, 128, 255 ], // RGB arraycolor3: [ 0, 128, 255, 0.3 ], // RGB with alphacolor4: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value
};
gui.addColor(palette, 'color1');
gui.addColor(palette, 'color2');
gui.addColor(palette, 'color3');
gui.addColor(palette, 'color4');

 

3.下拉框参数控制

下拉框控件既可以是数字类型,也可以是字符串类型,它们都是通过 gui.add() 方法进行配置。

gui.add(object, attr, array/object );
  • object必须。要控制的对象。

  • attr必须。控制对象的某个属性。

  • array: 字符串类型配置; object:数字类型配置。

 gui.add( obj, "addr", ["北京","上海","天津"] );

gui.add( obj, "speed", {"fast":1,"normal":2,"slow":3
} );

4. 单选框参数控制

首先,要保证对应的属性值为 true/false 布尔值。利用 gui.add() 方法,自然会形成单选框。

gui.add(object, attr)
  • object必须。要控制的对象。

  • attr必须。控制对象的某个属性。其值必须为布尔值

gui.add(obj, "isCenter");

 

5. 添加/删除菜单文件夹

// 添加文件夹
let f = gui.addFolder( folderName )
// 给文件夹添加参数控制
f.addColor( obj, attr )
// 删除文件夹
gui.removeFolder(f)

 例如:

let obj = {"fontSize": 30,"color" : "#ff0000","isCenter": true,"addr":"北京","speed": 1
}
// 创建 GUI 面板。
const gui = new dat.GUI();
// 创建文件夹
let f = gui.addFolder("文字设置");
f.add(obj, "fontSize", 1, 100, 1);
f.addColor(obj, "color");
f.open();
let f2 = gui.addFolder("其他");
f2.add(obj, "addr", ["北京","上海","天津"]);
f2.add(obj, "isCenter");

6. 事件

修改参数后,能执行什么操作?

对于面板中的每一个控制项,可以设置 onChangeonFinishChange 监听事件。

  • onChange:控制项值改变时响应,比如拖动滑块过程中。

  • onFinishChange:控制项值改变完毕后相应。

注意:这两个事件本质是 gui 定义的对象方法,不能通过 addEventListener 添加。

f.add(obj, "fontSize", 1, 100, 1);
f.onChange(function(value){     // value 就是改变后的值console.log("onChange:" + value)
});
f.onFinishChange(function(value){     // value 就是改变后的值console.log("onFinishChange:" + value)
});// 也可以直接链式操作。
f.add(obj, "fontSize", 1, 100, 1).onChange(function(value){     // value 就是改变后的值console.log("onChange:" + value)
});

五、其他功能

1. 折叠,展开,隐藏,显示

gui.close();  // gui折叠
f.close();    // 文件夹折叠gui.open();  // gui展开
f.open();    // 文件夹展开gui.hide();  // 隐藏
f.hide();gui.show();  // 显示
f.show();

2. 获取设置值

ctrl.getValue() 
ctrl.setValue(newValue)
const one=gui.add(options, 'color5');
one.setValue('333')
console.log(one.getValue());//333

3. 刷新控制器

刷新此控制器的视图显示,以便与对象的当前值保持同步。

const options = {color5: 'xxxx',speed: 40,types: 'two'
};
const gui = new dat.GUI();
let num = gui.add(options, 'speed', 10, 20, .1);
options.speed=12
// 比如直接修改对象,然后更新
gui.updateDisplay()

六、示例:用 GUI 控制某个标签的样式

要利用 GUI 控制某个标签的样式。

<h1 id="box">你好,这是 GUI 测试示例。</h1><script src="js/gui/dat.gui.js"></script>
<script>
let box = document.getElementById("box");
// 要修改参数的对象。
let obj = {"fontSize": 30,"color" : "#ff0000","isCenter": true
}
// 修改 h1 样式
box.style.cssText = `font-size:30px;color:#ff0000;text-align:center;
`;
</script>

添加 GUI 代码:

// 创建 GUI 面板。利用 GUI 修改 h1 样式。
const gui = new dat.GUI();
// 创建文件夹
let f = gui.addFolder("文字设置");
let ctrl1 = f.add(obj, "fontSize", 1, 100, 1);
ctrl1.onChange(function(value){box.style.fontSize = value +"px"
});
f.addColor(obj, "color").onFinishChange(function(value){box.style.color = value ;
});
f.open();  // 默认第一个文件夹打开
// 创建文件夹2
let f2 = gui.addFolder("其他");
f2.add(obj, "addr", ["北京","上海","天津"]);
f2.add(obj, "isCenter").onFinishChange(function(value){if(value){box.style.textAlign = "center";}else{box.style.textAlign = "left";}
});

七、示例:跟 Three.js 结合

构建一个立方体,利用 dat.gui 控制网格的大小和格子数量;控制立方体的颜色和缩放。

html:

<script type="importmap">{"imports":{"three":"./js/three.module.min.js","three/addons/":"./js/jsm/","dat":"./js/gui/dat.gui.module.js"}}
</script>
<script type="module" src="./js/myjs6.js"></script>

 JS:

import * as THREE from "three";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
import * as dat from 'dat';// 场景
const scene = new THREE.Scene();
scene.background = new THREE.Color("#cccccc");// 网格辅助器
let gridSize = 10;
let gridDivs = 10;
let gridHelper = new THREE.GridHelper(gridSize,gridDivs);
scene.add( gridHelper ); // 相机
let winH = window.innerHeight;
let winW = window.innerWidth;
const camera = new THREE.PerspectiveCamera(50, winW/winH, 1, 1000 );
camera.position.set(5,5,5);
camera.lookAt( scene.position );
scene.add(camera);// 物体
const geometry = new THREE.BoxGeometry(1,1,1);
const material = new THREE.MeshBasicMaterial({color:"#ff3300"
});
const box = new THREE.Mesh( geometry, material );
scene.add( box );// 渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(winW, winH);
renderer.render( scene, camera );
document.body.appendChild( renderer.domElement );// 4. 渲染:不停的渲染
function animation() {renderer.render(scene, camera)requestAnimationFrame(animation)}
animation()

添加 dat.gui 控制:

// gui 控制
const params = {gridParam:{size: 10,divsitions:10},boxParam:{color:"#ff3300"}
}
const gui = new dat.GUI();
// 网格控制
const folderGrid = gui.addFolder("网格控制");
folderGrid.add( params.gridParam, "size",10,100 ).onChange(function(value){scene.remove( gridHelper );  // 删除原有的网格// 添加新的网格gridSize = value;gridHelper = new THREE.GridHelper(gridSize,gridDivs);scene.add( gridHelper ); renderer.render( scene, camera );
});
folderGrid.add( params.gridParam, "divsitions",5,100 ).onChange(function(value){scene.remove( gridHelper );  // 删除原有的网格// 添加新的网格gridDivs = value;gridHelper = new THREE.GridHelper(gridSize,gridDivs);scene.add( gridHelper ); renderer.render( scene, camera );
});
folderGrid.open();
// box控制
const folderBox = gui.addFolder("立方体控制");
folderBox.add( box.scale,"x",1,10);
folderBox.add( box.scale,"y",1,10);
folderBox.add( box.scale,"z",1,10);
folderBox.addColor( params.boxParam,"color").onChange(function(value){material.color.set(value);
});
folderBox.open();

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

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

相关文章

TCP_IP(6)

网络层 在复杂的网络环境中确定一个合适的路径. IP协议 与TCP协议并列,都是网络体系中最核心的协议. 基本概念 主机:配有IP地址,但是不进行路由控制的设备; 路由器:即配有IP地址,又能进行路由控制; 节点:主机和路由器的统称; 协议头格式 4位版本号(version):指定IP协议的版…

【面试】盘点10个高频的前端算法题,你全都会了吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 现在前端的面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂更是必考算…

字符输入/输出和输入验证 DAY19

文章目录 前言一、单字符I/O二、缓冲区为什么要引入缓冲区&#xff1f;文件结尾补充**注意几点** 重定向和文件重定向输入cmd是什么&#xff1f;重定向输出组合重定向小试牛刀&#xff1a;文件输出 创建更友好的用户界面使用缓冲输入 如果您发现文章有错误请与我留言&#xff0…

STM32,嵌入式系统中的I2C协议

I2C协议——读写EEPROM 关注我&#xff0c;共同交流&#xff0c;一起成长 前言一、协议简介二、I2C特性及架构三、通信过程 前言 这是一种主要用于集成电路和集成电路&#xff08;IC&#xff09;通信&#xff0c;计算机中复杂的问题大多数就是用分层来进行解决&#xff0c;这个…

OpenAI 文生视频大模型Sora,看完别说WC啊

OpenAI&#xff0c;发布了他们的文生视频大模型Sora&#xff08;Sora 是一个 AI 模型&#xff0c;可以根据文本指令创建现实且富有想象力的场景&#xff09; 来感受下震撼视觉冲击&#xff0c;看看你有没有说WC… 地址&#xff1a;sora 提示&#xff1a;一位时尚女性走在充满…

51单片机项目(30)——基于51单片机的心率血氧脉搏检测的proteus仿真

1.功能设计 可以测量脉搏、心率、血氧浓度、体温&#xff0c;并且实时显示在LCD1602屏幕上&#xff0c;&#xff08;第一行是体温血氧&#xff0c;第二行是心率脉搏&#xff09;。 &#xff08;需要完整源文件的&#xff0c;直接看最后一节&#xff09; 另外&#xff0c;还…

开源软件的影响力:塑造数字世界的无形之手

随着科技的飞速发展&#xff0c;开源软件已经成为了推动数字世界发展的重要力量。它不仅改变了软件开发的传统模式&#xff0c;还对整个科技行业乃至社会产生了深远的影响。在这篇文章中&#xff0c;我们将探讨开源软件的影响力以及它如何塑造我们的数字世界。 一、开源软件的…

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…

Peter算法小课堂—哈希与哈希表

额……字符串我们是第一次学&#xff0c;给大家铺一些基础的不能再基础的基础&#xff0c; 字符串比较大小 字符串大小的比较&#xff0c;不是以字符串的长度直接决定&#xff0c;而是从最左边第一个字符开始比较&#xff0c;大者为大&#xff0c;小者为小&#xff0c;若相等…

[01] Vue2学习准备

目录 vue理解创建实例插值表达式 {{}}响应式特性 vue理解 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 创建实例 准备容器 <div id…

嵌入式中I2C 相关的硬件问题汇总及死锁解决办法

本文主要介绍如何解决I2C设备硬件设计上的各种问题&#xff0c;希望对大家有所帮助&#xff01; 关于I2C协议详细的讲解&#xff0c;可以参考之前的推文&#xff1a;全面解析 I2C 通信协议 一般情况下&#xff0c; i2c 设备焊接没什么问题&#xff0c;按照设备手册一步步来&a…

Github 2024-02-15 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-15统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目4Python项目2Solidity项目2Rust项目1JavaScript项目1Go项目1C项目1 Terraform: 以安全和可预测…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…

[职场] 优质简历怎么做 #学习方法#笔记

优质简历怎么做 简历是求职的“敲门砖”&#xff0c;直接影响着求职成败。然而&#xff0c;不少求职者对简历不太重视&#xff0c;认为简历就是写自己的经历。因此&#xff0c;在招聘现场&#xff0c;常会看到这样的简历&#xff1a;有的是从某招聘网站直接下载而来&#xff0c…

kali无线渗透之用wps加密模式破解出wpa模式的密码12

WPS(Wi-Fi Protected Setup&#xff0c;Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病&#xff0c;使用者往往会因为步骤太过麻烦&#xff0c;以致干脆不做任何加密安全设定&…

基于FPGA的OFDM基带发射机的设计与实现

文章目录 前言一、OFDM描述二、本系统的实现参照 1.IEEE 802.11a协议主要参数2.不同调制方式与速率 3. IFFT映射关系4. IEEE 802.11a物理层规范5. PPDU帧格式三、设计与实现 1.扰码2.卷积编码与删余3.数据交织4.符号调制5.导频插入6.IFFT变换 7.循环前缀&加窗8.训练序列生成…

LocaSpace Viewer图新地球 4.4.9工程版授权

LocaSpace Viewer图新地球是一个独特的三维数字地球软件&#xff0c;它不用安装&#xff0c;且是一个轻量级的软件&#xff0c;永久授权激活&#xff0c;没有功能方面的限制&#xff0c;在这里&#xff0c;你可以根据需要进行各种操作&#xff0c;如获取多种在线地图资源&#…

Kubernetes安装部署 2

Kubeadm创建集群 如上所示&#xff0c;在阿里云的香港地域的ECS服务器上拉取下载Kubernetes官方提供的容器镜像 如上所示&#xff0c;在阿里云的香港地域的ECS服务器保存镜像到本地 Node A服务器的IP地址&#xff1a;192.168.0.130 端口号6443开放、部署Docker容器引擎、支持cr…

linux系统zabbix监控分布式监控的部署

分布式监控 服务器安装分布式监控安装工具安装mysql导入数据结构配置proxy端浏览器配置 zabbix server端监控到大量zabbix agent端&#xff0c;这样会使zabbix server端压力过大&#xff0c;使用zabbix proxy进行分布式监控 服务器安装分布式监控 安装工具 rpm -Uvh https://…

【C语言】简单贪吃蛇实现保姆级教学!!!

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 新年快乐呀小伙伴 引言&#xff1a; 小伙伴们应该都有一个做游戏的梦吧&#xff1f;今天让小庄来用C语言简单实现一下我们的童年邪典贪吃蛇&#xff0c;顺便巩固我们的C语言知识&#xff0c;请安心食用~ 文章目录 贪吃蛇效果一.游戏前工作…