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

上文 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.mzph.cn/news/241894.shtml

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

相关文章

安装Kubernetes1.23、kubesphere3.4、若依项目自动打包部署到K8S记录

1.安装kubernetes1.23详细教程 kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎 2.安装rancher动态存储 kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml3.安装kubesphere3.4 准备工作 您…

UE和Android互相调用

ue和android互调 这两种方式都是在UE打包的Android工程之上进行的。 一、首先是UE打包Android,勾选下面这项 如果有多个场景需要添加场景 工程文件在这个路径下 然后可以通过Android Studio打开,选择gradle打开 先运行一下,看看是否可以发布…

360勒索病毒:了解最新变种.360,以及如何保护您的数据

导言: 随着科技的飞速发展,网络安全威胁也在不断演变,.360 勒索病毒成为近期备受关注的一种恶意软件。本文91数据恢复将介绍如何恢复被.360 勒索病毒加密的数据文件,并提供一些建议,帮助你预防这种威胁。 如果您在面对…

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器(一) - 基本定时器知识 这节开始学习一下TIM定时器功能,从字面意思上理解,定时器的基本功能就是用来定时,与定时器相结合,可以实现一些周期性的数据发送、采集等功能&#…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比,这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是,DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

阿里云公有云平台

1. 请简要介绍一下公有云平台的基本概念和特点。 公有云是一种云计算模型,其中服务器、网络和存储资源等IT基础架构以虚拟资源的形式提供,并且可以通过互联网进行访问。这些资源是由第三方提供商共享并提供给用户的,包括计算、存储、网络等。…

并发和并行的区别

并发(Concurrency)和并行(Parallelism)是计算机领域中两个重要的概念,它们描述了任务执行的不同方式。以下是它们的区别: 并发:并发是指多个任务在同一时间段内交替执行。虽然这些任务可能同时存…

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】:小杨的幸运数 【问题描述】 小杨认为,所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。 对于一个…

MongoDB安装部署

二、安装部署 2.1 下载 下载地址:MongoDB Enterprise Server Download | MongoDB 当前最新版本6.0.9,5.0.9对Mac m1需要centos 8.2版本。选择docker安装。 2.2 docker-ce安装 # 安装docker # 默认repo源没有docker-ce安装包,需要新的rep…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义,这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的,以及如何关联起来的。(我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

Spring框架@RequestMapping完整指南

Spring Boot 提供了一组新的 REST 请求注释,可以简化构建 RESTful Web 服务的过程。 在Spring 4.3之前,我们使用RequestMapping注解来实现RESTful的URL映射: RequestMapping(value "/hello", method RequestMethod.GET) public…

ObjectMapper的常用方法 (对象和JSON数据之间的转换)

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> <!-- 请根据实际情况选择合适的版本 --> </dependency> ObjectMapper类是Ja…

免费更新UltraNews v2.8.0 已注册 – Laravel报纸,博客多语言系统,支持AI作家,内容生成器脚本

UltraNews v2.8.0 已注册 – Laravel报纸&#xff0c;博客多语言系统&#xff0c;支持AI作家&#xff0c;内容生成器脚本 一、概述 在网络内容创作与管理领域&#xff0c;UltraNews v2.8.0以其高度现代化和多功能性而独树一帜。这是一个基于Laravel框架构建的报纸、博客多语言…

实习课知识整理4:点击某个商品如何跳转到并展示出商品详情页

项目情景&#xff1a;当我们点击某个商品时&#xff0c;我们需要查看商品的具体的信息并进行购买的操作 简单理解以下就是&#xff0c;当我们点击一个url链接时&#xff0c;该链接需要携带一个参数到后端&#xff0c;一般设为商品的Id&#xff0c;然后后端通过Id从数据库中查找…

怎么卸载macOS上的爱思助手如何卸载macOS上的logitech g hub,如何卸载顽固macOS应用

1.在App Store里下载Cleaner One Pro &#xff08;注意&#xff0c;不需要订阅付费&#xff01;&#xff01;&#xff01;白嫖基础功能就完全够了&#xff01;&#xff01;&#xff01;&#xff09; 2.运行软件&#xff0c;在左侧目录中选择“应用程序管理”&#xff0c;然后点…

C++初阶——类和对象

呀哈喽&#xff0c;我是结衣 C入门之后&#xff0c;我们就进入了C的初阶的学习了&#xff0c;在了解类和对象之前&#xff0c;我们还是先了解&#xff0c;面向过程和面向对象的初步认识。 在本篇博客中&#xff0c;我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目&#xff0c;当超出 Rasa 现有意图(out_of_scope)的时候&#xff0c;就会执行 ActionGPTFallback&#xff0c;本质上就是利用 Langchain 做了一个 RAG&#xff0c;调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…

Navicat2023最新安装教程

dddd&#xff0c;请自行编排以下文本再进行访问。 cloud .fynote. com/share /d/ XLHgWhYA Java中的封装、继承和多态&#xff1a;面向对象编程的基石 在Java这门面向对象的编程语言中&#xff0c;封装、继承和多态是构建代码的基本概念&#xff0c;它们共同组成了面向对象编程…

面试官:看你简历了解过并发,我们简单聊一聊

前言&#xff1a; 今天和大家探讨最近的面试题&#xff0c;好久没有面试了&#xff0c;所以在此记录一下。本篇文章主要讲解CyclicBarrier和CountDownLatch的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xf…

羊了个羊抓包速通,让第二关变成和第一关一样难度

目录 一.前言 二.前期准备 2.1抓包环境 2.2安装电脑版微信环境 2.3配置bp与浏览器VPN 2.4配置proxifier 三.开始抓包 3.1前期准备 3.2抓包ing 一.前言 羊了个羊是一款经典微信小程序游戏&#xff0c;号称“第一关谁都能过&#xff0c;第二关谁能过&#xff1f;“。那…