首页 > 其他分享 >手把手教你使用dat.gui

手把手教你使用dat.gui

时间:2022-09-07 21:58:54浏览次数:97  
标签:控件 手把手 gui dat add testObj 类型 data

最近在git上看见一个炫酷的3D项目,是使用canvas,根据矩阵变换生成3D场景和动画,效果是这样的:

效果图

这样的:

效果图

由于笔者水平有限,炫酷的效果,复杂的矩阵,不属于本次的重点,感兴趣的可以移步到git地址https://github.com/kevinroast/phoria.js 进行了解。

本次手把手教学系列讲解的是dat.gui的使用。先对dat.gui的基本使用进行介绍,由于gui很久没有人维护,有些功能不是很完善,根据我们的需求后续还有对其进行了一定的拓展。从git上拉取项目(git地址https://github.com/dataarts/dat.gui),得到一个git上的Demo。

首先来看这个Demo,有多种类型的控件可以使用,有输入框类型(滑块输入框类型)、checkBox类型、下拉框类型等等,由于没有参数去区分是某一控件是什么类型,是通过add放的参数配置显示,在这里对gui的add方法进行讲解。

![](data:image/svg+xml;utf8,)

Demo效果图

1.gui的基本使用(数字类型Demo)

相对而言,git上给出的Demo涵盖了所有类型的控件,不适合入门级食用,我们自己编写一个比较简单的入门级Demo。

var testObj = {
    x: 10,
    y: "20",
    z: 30,
    color: '#66ccff',
};

var gui = new dat.GUI();
var f = gui.addFolder('入门');
f.add(testObj, "x", 5, 175, 1);
f.add(testObj, "y");
f.add(testObj, "z");
f.addColor(testObj, "color");
f.open();

![](data:image/svg+xml;utf8,)

Demo效果

在使用的时候,先将需要设置的值用键值对的形式存放在一个对象里面。再将我们的dat.GUI实例化,添加一个名称为“入门”的分组,,在分组中使用add方法添加各个控件。

gui.add(object, key, min, max, step);
object: 控件展示对象;key:当前展示控件名称; min:最小值; max:最大值; step:最小单位;
min(),max(),step()也是gui控件的方法

在使用add方法添加数字类型的控件时,若只添加一个数字,此时控件就是一个输入框;若增加最小值和最大值,此时控件为左侧滑块,右侧输入框的控件;若添加的为字符串类型的数字,此时控件会设置为字符串类型控件,从而失去滑块机制。gui还有一套默认的滑动调节的机制,当鼠标点击数字输入框获得焦点不松开上下滑动的时候,可以根据鼠标位置更改输入框内容。

![](data:image/svg+xml;utf8,)

2.颜色控件

在Demo中,最后一个是颜色值控件,在这里单独介绍一下颜色值控件。GUI提供了4种颜色值类型的控件(CSSRGBRGBAHue),四种类型均使用gui.addColor()添加。不过需要在创建展示控件对象时,按不同的形式进行创建,这一块git上给出的Demo比较详细,就不赘述了。

var testObj = {
    color0: "#ffae23", // CSS string
    color1: [ 0, 128, 255 ], // RGB array
    color2: [ 0, 128, 255, 0.3 ], // RGB with alpha
    color3: { h: 350, s: 0.9, v: 0.3 } // Hue, saturation, value
};

var gui = new dat.GUI();
var f1 = gui.addFolder('Colors');
f1.addColor(testObj, 'color0').name('CSS颜色值');
f1.addColor(testObj, 'color1').name('RGB颜色值');
f1.addColor(testObj, 'color2').name('RGBA颜色值');
f1.addColor(testObj, 'color3').name('HUB颜色值');
f1.open();

![](data:image/svg+xml;utf8,)

效果图

颜色值类型,在gui中的默认有一个类似于colorPicker的机制。这样的交互模式更加友好,更加直接。

Tips: 可以通过gui.name()方法,可修改控件名称

![](data:image/svg+xml;utf8,)

3.下拉框控件

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

gui.add(object, key, array/object );
object:控件展示对象;key:当前展示控件名称;array: 字符串类型配置; object:数字类型配置;

数字类型需要传入一个对象,对象中应该是键值对的形式,键名为下拉框中显示的名称,值为返回值。两种类型的配置都需要与控件展示对象中的内容想匹配,否则下拉框中的默认值为空。

var testObj = {
    type: "two",
    speed: 50,
};

var gui = new dat.GUI();
var f = gui.addFolder('下拉框类型');
f.add(testObj, "type", ['one', 'two', '三']);
f.add(testObj, "speed", {slow: 1, '中速': 20, fast: 50});
f.open();

![](data:image/svg+xml;utf8,)

效果图

4.双向控制

gui能够很轻松的实现单向控制(gui控制视图区域的动画,位置等),但是如果调节视图区域中的节点位置,并不会影响gui上的变化。

其实,gui中内置了一个setValue()方法去设置gui中的值,初步思路已经明了了,当视图区域位置信息发生变化时,就调用此方法对gui进行设置即可。在vue框架中,实现数据双向绑定的机制是数据劫持(),我们利用这个方式,来实现gui与视图区的双向控制。

function observe(data) {
    if (!data || typeof data !== 'object') {
        return;
    }
    // 取出所有属性遍历
    Object.keys(data).forEach(function (key) {
        defineReactive(data, key, data[key]);
    });
};

function defineReactive(data, key, val) {
    observe(val); // 监听子属性
    Object.defineProperty(data, key, {
        enumerable: false, // 可枚举
        configurable: false, // 不能再define
        get: function () {
            return val;
        },
        set: function (newVal) {
            console.log('哈哈哈,监听到值变化了 ', val, ' --> ', newVal);
            val = newVal;
        }
    });
}

我们通过上面两个方法,能够监听到数据的变化,我们在set方法中进行操作即可。

本文转自 https://zhuanlan.zhihu.com/p/47752059,如有侵权,请联系删除。

标签:控件,手把手,gui,dat,add,testObj,类型,data
From: https://www.cnblogs.com/hustshu/p/16667389.html

相关文章

  • dataclass装饰器
    简介根据定义dataclass时指"一个带有默认值的可变的namedtuple"简单来说,就是你定义一个很普通的类,@dataclass装饰器可以帮你生成__repr__、__init__等方法,就不用自己写......
  • 15.1sys模块15.2datatime模块15.3logging模块15.4request15.5crm实战15.6参数介绍15.7
    15.1sys模块importsysprint(sys.modules)#描述当前执行代码的位置,解释器中导入的所有模块都会被放在字典中importtimeprint(time.time())print(sys.modules['time'].tim......
  • System.Data.Linq 无法引用的问题
    参考文章 https://www.bbsmax.com/A/1O5EM0G457/已经在工程中引用了system.data.linq,但是在代码中,输入 usingSystem.Data.Linq 就报告不存在这个命名空间.修改一......
  • 手把手教你君正X2000开发板的OpenHarmony环境搭建
    摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况本文分享自华为云社区《君正X2000开发板的OpenHarmony环境搭建》,作者:星辰27。本文......
  • 【AR Engine】集成AR Engine,ARSession.update方法抛出ARFatalException
    ​【问题描述】在App中接入了AREngine,在日志监控中发现个别终端用户在程序调用ARSession.update方法时,AREngine抛出了ARFatalException。通过查看日志发现,这个问题在此......
  • oracle 存储过程 update 更新 不报错 但是没有更新成功
    原因是:定义的入参的参数名称和库表字段名称一样,当入参长度和库表字段长度不一样的入参就变成了'BC_3109814'='BC_3109814'导致不相等,从而更新不成功解决:修改存储过程入......
  • springboot集成hibernate-validator
    一、项目搭建1、使用springboot搭建一个web工程建web工程,不使用骨架创建maven的Java工程即可,不需要创建maven的web工程。2、添加父工程坐标和添加web启动器<parent>......
  • beego的validation表单验证库的使用
    下载beego/validationgogetgithub.com/astaxie/beego/validation直接用途packagemainimport( "fmt" "github.com/astaxie/beego/validation")typeUserstru......
  • DataGridViewImageColumn 图片照片
    PrivateSubBT_PHOTOADDRESS_Click(senderAsObject,eAsEventArgs)HandlesBT_PHOTOADDRESS.ClickDimdvicAsDataGridViewImageColumn=NewDataGridVie......
  • 五分钟了解 Databend 全新 SQL 类型系统
    引言类型系统是数据库的一个重要组成部分,它提供了一种一致的方式来确定SQL中的数据类型。类型系统的设计很大程度影响数据库的易用性和健壮性,一个设计合理且一致的类型......