WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

news2024/11/26 9:38:44

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理
那么 本文 我们来具体说说它能做的其他事

我们先将基础代码改成这样

import './style.css'
import * as THREE from "three";
//引入lil-gui
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";

//创建场景
const scene = new THREE.Scene();

//创建相机
const camera = new THREE.PerspectiveCamera(
    45, //视角 视角越大  能看到的范围就越大
    window.innerWidth / window.innerHeight,//相机的宽高比  一般和画布一样大最好
    0.1,  //近平面  相机能看到最近的距离
    1000  //远平面  相机能看到最远的距离
);

//c创建一个canvas容器  并追加到 body上
const renderer = new THREE.WebGLRenderer(0);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

//创建一个几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color:0x08ffe });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);


//设置相机位置   这里 我们设置Z轴  大家可以试试  S Y 和 Z  都是可以的
camera.position.z = 5;
camera.position.y = 5;
camera.position.x = 5;
//设置相机默认看向哪里   三个 0  代表 默认看向原点
camera.lookAt(0, 0, 0);


function animate() {
    requestAnimationFrame(animate);
    //cube.rotation.x += 0.01;
    //cube.rotation.y += 0.01;
    renderer.render(scene, camera);
}
animate();
//将内容渲染到元素上
renderer.render(scene, camera);

const Igui = new GUI();

运行效果如下图 就是创建了一个画布 然后中间放了一个立方体
在这里插入图片描述
我们可以通过lil-gui 控制 元素的 x轴单位
我们在代码最后面加上

Igui.add(cube.position,"x",-5,5);

在这里插入图片描述
我们通过new 出来的 GUI对象 调用add函数
第一个参数 我们传入cube.position。cube:是我们的立方体元素对象 position用于控制它的 x y z三个轴 然后第二个参数 设置字符串 x 告诉他们 我们要操作对象的x轴 后面两个参数用来控制范围 我们设置 最小负5 最大正5
运行代码 右上角就会出现这个x轴的操作元素
在这里插入图片描述
我们可以通过拖动下图指向元素 控制数值的大小
在这里插入图片描述
我们可以将这行代码改成

Igui.add(cube.position,"x").min(-5).max(5).step(1).name("设置立方体x轴距离");

在这里插入图片描述
依旧是 通过new出来的 gui对象 调用add函数 第一个参数 cube.position 第二个参数 x
然后 min设置最小值 负5 max设置最大值5 然后 step 设置每次拖动只会改变1 就是 之前 你从4拖到5可能拖到 4.3 4.5类有小数的位置 但是 我们现在每次必定前进1 那么 从4一拖就到 5了
然后 name 就是操作的代理名 不写 他就是x
代码运行后 也是没有任何问题
在这里插入图片描述
这里 像我们元素的 x y z轴都是可以设置的

然后 我们这里 还可以监听数值改变

Igui.add(cube.position,"x").min(-5).max(5).step(1).name("设置立方体x轴距离").onChange((value)=>{
    console.log("数值被改变为",value);
});

这样 我们运行代码 然后拖动x轴
当我们处理的数值发生改变后 onChange 的监听事件 就会触发 里面行参可以拿到当前改变的值是多少
在这里插入图片描述
然后 我们这里 可以将元素材质 设置为线框模式 wireframe字段设置为true即可
在这里插入图片描述
然后 我们在最下面这样邪恶

Igui.add(material,"wireframe").name("控制元素为线框模式");

在这里插入图片描述
我们通过 gui对象 调用add函数 第一个参数 material 这是元素材质对象 第二个 字符串类型的 wireframe 告诉它要操作的字段名
然后 name 设置代理名
我们进来之后 会发现 元素是线框模式的 然后 这里 gui判断到 操作的是布尔值之后 他会成为一个单选框
在这里插入图片描述
我们取消它的勾选wireframe 就成了false 这样 就取消了线框模式
在这里插入图片描述
当然 材质对象都能操作线框了 那么 颜色自然元素可以的
我们可以最下面这样写

let colorParams = {
    cubeColor: 0x08ffe
}
Igui.addColor(colorParams,"cubeColor").name("颜色设置").onChange((value)=>{
    cube.material.color.set(value);
});

在这里插入图片描述
声明一个对象 叫 colorParams 里面有一个字段 cubeColor 这两个名字都是随便取的
然后 里面对应一个颜色代码 0x08ffe
gui操作颜色 不再是add 而是 addColor
第一个参数传我们写的 colorParams颜色对象 第二个蚕食 告诉它操作哪个字段 我们传cubeColor
然后 name设置名称
监听颜色器发生变化 我们将新得到的颜色值 赋值给 material.color 就是我们这个元素材质的颜色
运行代码
在这里插入图片描述
我们点击右上角的颜色设置 选择自己喜欢的颜色
在这里插入图片描述
然后 这么多操作 我们可以分个组
将代码改成这样

const Igui = new GUI();
let folder = Igui.addFolder("第一组");
folder.add(cube.position,"x").min(-5).max(5).step(1).name("设置立方体x轴距离").onChange((value)=>{
    console.log("数值被改变为",value);
});
folder.add(material,"wireframe").name("控制元素为线框模式");

let colorParams = {
    cubeColor: 0x08ffe
}
let folder1 = Igui.addFolder("第二组");
folder1.addColor(colorParams,"cubeColor").name("颜色设置").onChange((value)=>{
    cube.material.color.set(value);
});

在这里插入图片描述
简单说 用gui的 addFolder 函数创建一个组 参数字符串 组名
然后 直接用组对象 代理名 去add操作 运行如下
在这里插入图片描述
然后 我们可以通过点击组 将操作收起来或者放出来
在这里插入图片描述

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

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

相关文章

题解:CF1914E-Game with Marbles

题解:CF1914E-Game with Marbles 事先说明一下,本题解不讲解简单数据范围的算法,因为复杂数据范围的就很简单。 这道题的大体意思是这样的:小A有颜色为i(i1~n)的小球a[i]个,小B有颜色为i(i1~n)的小球b[i]个。现在他们…

有关List的线程安全、高效读取:不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue

有关List的线程安全 队列、链表之类的数据结构也是极常用的,几乎所有的应用程序都会与之相关。在java中, ArrayList和Vector都使用数组作为其内部实现。两者最大的不同在与Vector是线程安全的。 而ArrayList不是。此外LinkedList使用链表的数据结构实现…

ubuntu 22.04 安装mysql服务

完整内容: https://developer.aliyun.com/article/1260321 # 安装服务 sudo apt install mysql-server# 按向导设置root密码 sudo mysql_secure_installation# 使用设置的密码登录 sudo mysql -u root -p也可以使用工具登录,例如: navicat for mysql

掌握iText:轻松实现固定pdf模板的动态数据填充

推荐语 如果你在工作中需要处理大量的PDF表单,那么使用iText5实现固定PDF模板的动态数据填充,将是一种非常有效的方法。这篇技术文章详细介绍了如何使用iText5库来读取已有的PDF模板,并动态地填充表单数据,生成最终的表单文件。通…

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation(收费的虚拟机) 下载vbox 网址:Oracle VM VirtualBox(免费的虚拟机) 以下选择一个下载即可,建议下载vbox,因为是免费的。安装的时候默认下一步即可(路径最好…

Vue2从源码角度来回答一些常见的问题

1.请说一下Vue2响应式数据的理解(先知道基本的问题在哪里,源码的角度来回答,用的时候会有哪些问题) 可以监控一个数据的修改和获取操作。针对对象格式会给每个对象的属性进行劫持 Object.defineProperty 源码层面 initData ->…

卷积神经网络基础与补充

参考自 up主的b站链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 https://blog.csdn.net/m0_37867091?typeblog CNN的历史发展: 这一点老师上课的时候也有讲到,BP的出现对CNN的发展至关重要 卷积的特性&#x…

nodejs+vue+ElementUi大学新生入学系统的设计与实现1hme0

采用B/S模式架构系统,开发简单,只需要连接网络即可登录本系统,不需要安装任何客户端。开发工具采用VSCode,前端采用VueElementUI,后端采用Node.js,数据库采用MySQL。 涉及的技术栈 1) 前台页面…

kubelet源码学习(二):kubelet创建Pod流程

本文基于Kubernetes v1.22.4版本进行源码学习 4、kubelet创建Pod流程 syncLoop()的主要逻辑是在syncLoopIteration()方法中实现,Pod创建相关代码只需要看处理configCh部分的代码 // pkg/kubelet/kubelet.go // 该方法会监听多个channel,当发现任何一个channel有数…

Springboot+vue的交通管理在线服务系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的交通管理在线服务系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的交通管理在线服务系统,采用M(m…

hyper-v ubuntu 3节点 k8s集群搭建

前奏 搭建一主二从的k8s集群,如图所示,准备3台虚拟机。 不会创建的同学,可以看我上上篇博客:https://blog.csdn.net/dawnto/article/details/135086252 和上篇博客:https://blog.csdn.net/dawnto/article/details/135…

借势API,电商如何进行电商平台数据采集汇总分析?

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取,网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电…

基于SpringBoot的瑜伽馆管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

JavaScript系列——原型、原型链、继承

文章目录 前置话题原型定义作用例子说明获取对象原型 原型链定义例子说明原型链演示图 JavaScript 继承通过构造函数继承代码示例 自有属性小结更多内容 前置话题 JavaScript 是一门面向对象的编程语言,其中有一个特征就是可继承性,和java编程语言不同&…

史上最全,资深测试老鸟-接口测试总结,看这篇就足够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、什么是接口 接…

R语言基础 | 安徽某高校《统计建模与R软件》期末复习

第一节 数字、字符与向量 1.1 向量的赋值 c<-(1,2,3,4,5) 1.2 向量的运算 对于向量&#xff0c;我们可以直接对其作加&#xff08;&#xff09;&#xff0c;减&#xff08;-&#xff09;&#xff0c;乘&#xff08;*&#xff09;&#xff0c;除&#xff08;/&#xff09…

Python数据科学视频讲解:特征决策树分箱

5.3 特征决策树分箱 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解5.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应…

网络安全行业证书【含金量排名】

文章目录 一、前言二、CISP三、CISAW四、NISP五、为什么很多人考不下来 一、前言 现在想找网络安全之类的工作&#xff0c;光有技术是不够的&#xff0c;还得有东西证明自己&#xff0c;网安三大敲门砖&#xff1a;CTF、漏洞证明和专业证书。 对于CTF的话只是少数人能参加的…

Lambda表达式超详解

目录 背景 Lambda表达式的用法 函数式接口 Lambda表达式的基本使用 语法精简 变量捕获 匿名内部类 匿名内部类中的变量捕获 Lambda的变量捕获 Lambda表达式在类集中的使用 Collection接口 List接口 Map接口 总结 背景 Lambda表达式是Java SE 8中的一个重要的新特性.…

swing快速入门(二十七)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.为按钮指定图标 2. 列表框的并列 3.菜单项绑定快捷键 4.控件悬浮提示信息 5.菜单项设置小图标 6.五种布局风格右键选择切换 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.…