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://www.hqwc.cn/news/492102.html

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

相关文章

Flask基础学习4

19-【实战】问答平台项目结构搭建_剪_哔哩哔哩_bilibili 参考如上大佬的视频教程&#xff0c;本博客仅当学习笔记&#xff0c;侵权请联系删除 问答发布的web前端页面实现 register.html {% extends base.html %}{% block head %}<link rel"stylesheet" href&q…

【Antv-G6成长之路一】初识antv G6之什么是G6,G6能做哪些事情?(附实例图文)

G6详解目录 写在前面涉及知识&#xff1a;效果图1、G6是什么&#xff1f;1.1、g6的概念1.2、g6的应用 2、G6基础示例demo2.1、引入组件包&#xff08;js&#xff09;2.2、创建画布div2.3、创建G6节点2.4 常用节点属性说明2.5、设置数据节点和连线2.6、代码最终实现 3、G6官网4、…

嵌入式学习day25 Linux

进程基本概念: 1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&a…

【笔记】【电子科大 离散数学】 2.命题

文章目录 数理逻辑定义 命题定义不是命题的例子 原子命题和复合命题定义约定 命题联结词否定联结词定义例子真值表 合取联结词定义例子真值表 析取联结词定义例子 蕴含联结词定义例子真值表 等价联结词定义例子真值表 命题符号化及其应用速查表格优先级复合命题符号化布尔检索演…

数据安全之路:深入了解MySQL的行锁与表锁机制

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数据安全之路&#xff1a;深入了解MySQL的行锁与表锁机制 前言基础innodb中锁与索引的关系如何避免表锁 前言 在当今数据密集的应用中&#xff0c;数据库锁成为了确保数据一致性和并发操作的关键工具…

芯品荟 | 电动牙刷应用介绍

PART ONE 市场简介 - Market Profile - 电动牙刷个护是小家电最炙手可热的细分赛道之一。 随着居民的消费水平不断提升&#xff0c;口腔保健意识也逐步增强&#xff0c;中国电动牙刷市场迎来高速发展阶段。目前电动牙刷全球年用量在1亿只左右。 PART TWO 产品应用框图 - Bl…

C++数据库连接池

功能实现设计 &#xff1a; ConnectionPool.cpp 和 ConnectionPool.h &#xff1a;连接池代码实现 Connection.cpp 和 Connection.h &#xff1a;数据库操作代码、增删改查代码实现 连接池主要包含了以下功能点 &#xff1a; 1.连接池只需要一个实例&#xff0c;所以 Connec…

Uniswap团队逢高出货100万刀之后……

原创 | 刘教链 24日文章说到&#xff0c;《Uniswap(UNI)骤升超50%》&#xff0c;皆因Uniswap基金会发了一篇帖子&#xff0c;看似是要开启分红赋能&#xff0c;网上一片兴奋。但正如文中指出&#xff0c;“市场短期逻辑根本不是基本面逻辑&#xff0c;而是资金面逻辑”&#xf…

5.2 Ajax 数据爬取实战

目录 1. 实战内容 2、Ajax 分析 3、爬取内容 4、存入MySQL 数据库 4.1 创建相关表 4.2 数据插入表中 5、总代码与结果 1. 实战内容 爬取Scrape | Movie的所有电影详情页的电影名、类别、时长、上映地及时间、简介、评分&#xff0c;并将这些内容存入MySQL数据库中。 2、…

开源工具和框架

目录 开源工具和框架 一、 开源工具和框架 二、开源工具和框架在现代软件开发中的角色 1、基础设施建设&#xff1a; 2、开发效率提升&#xff1a; 3、代码质量保障&#xff1a; 4、技术创新&#xff1a; 三、广泛使用的开源项目分析 3.1、Linux 3.2、Git 3.3、Docke…

数据结构--双向链表专题

目录 1. 双向链表的结构2. 实现双向链表预先的准备初始化尾插、头插尾删、头删查找在pos位置之后插⼊数据删除pos位置的数据 3. 顺序表和双向链表的分析 1. 双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头结点”是两个概念&#xff0c;为了更好的理解直接称…

软考43-上午题-【数据库】-关系代数转SQL语言

一、投影转SQL语言-select 示例&#xff1a; 二、选择转SQL语言-where 示例&#xff1a; 【注意】&#xff1a; 关系代数公式的写法&#xff0c;可以写属性名&#xff0c;也可以写列的序号&#xff0c;如&#xff1a; 但是&#xff0c;SQL语言不支持&#xff01;&#xff01;&a…