Threejs_04 gui调试开发

threejs的快捷调试工具就是这玩意,那么如何使用呢??

使用gui调试开发

引入gui实例

//导入lil.gui
// import * as dat from "dat.gui";  // 旧
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";//创建gui实例
const gui = new GUI();

1.全屏按钮

1.写一个事件集

//1.gui控制按钮
let eventObj = {Fullscreen: function () {// 全屏 (画布)// renderer.domElement.requestFullscreen();// 全屏 (document.body)  可以看到写入的按钮document.body.requestFullscreen();},exitFullscreen: function () {// 退出全屏document.exitFullscreen();},
};

 2.将事件集中的方法当作参数传入gui中 第一个参数为事件集,第二个参数为事件集中的函数名字。

//添加按钮  第一个参数为对象实例  第二个参数为对象中属性名称
gui.add(eventObj, "Fullscreen").name("全屏");
//退出按钮
gui.add(eventObj, "exitFullscreen").name("退出全屏");

 这样 一个gui控制的全屏 退出全屏就做好了

 2.控制位置按钮

直接上强度

//2.gui控制立方体的位置
gui.add(cube.position, "x", -5, 5).name("立方体x轴位置");

第一个参数为要控制的属性,第二个参数为控制的轴,第三个参数和第四个参数为幅度,这是一种直接的写法。

 

//2.gui控制立方体的位置
// gui.add(cube.position, "x", -5, 5).name("立方体x轴位置");
let folder = gui.addFolder("立方体位置");
folder.add(cube.position, "x").min(-10).max(10).step(1).name("立方体x轴位置").onChange((val) => {console.log(val, "x轴位置");});
folder.add(cube.position, "y").min(-10).max(10).step(1).name("立方体y轴位置").onFinishChange((val) => {console.log(val, "y轴位置");});
folder.add(cube.position, "z").min(-10).max(10).step(1).name("立方体z轴位置");

使用addFloder 属性创建一个控制位置的实例也可以很轻松的解决这个问题min和max对应最大值最小值。name为做出来的按钮名字,同时可以使用回调函数来监听变化,使用step属性可以控制每次改变的步幅(一次改变多少) 这样可以很轻松的控制各种参数的变化

3.控制物料材质

我们也可以使用工具来控制物料的材质 

//3.gui控制材质
gui.add(parentMaterial, "wireframe").name("父元素线框模式");

4.控制物料颜色

//4.gui控制方块颜色
let colorParams = {cubeColor: "#00ff00",
};
gui.addColor(colorParams, "cubeColor").name("立方体颜色").onChange((val) => {// console.log(val,'立方体颜色');cube.material.color.set(val);});

 

全部代码 

//导入 threejs
import * as THREE from "three";
//导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
//导入lil.gui
// import * as dat from "dat.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 // 远平面   相机最远能看到的物体
);
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染器的大小  (窗口大小)
renderer.setSize(window.innerWidth, window.innerHeight);
// 将渲染器的dom元素添加到body中
document.body.appendChild(renderer.domElement);// 创建一个集合体  (立方体)
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建材质 (16进制颜色)
const material = new THREE.MeshBasicMaterial({color: 0x00ff00,
});const parentMaterial = new THREE.MeshBasicMaterial({color: 0xff0000,
});
//设置父元素材质为线框
parentMaterial.wireframe = true;
let parentCube = new THREE.Mesh(geometry, parentMaterial);
// 调用参数 创建物体 (网格体)
const cube = new THREE.Mesh(geometry, material);
//父元素中添加子元素
parentCube.add(cube);
parentCube.position.set(-3, 0, 0);
parentCube.rotation.x = Math.PI / 4;
// parentCube.scale.set(2, 2, 2);
// cube.position.x = 2;
cube.position.set(3, 0, 0);// 设置立方体的放大 相对于父元素 父元素放大了 也会放大  同旋转 会叠加父元素的改变
// cube.scale.set(2, 2, 2);// 设置立方体的旋转 绕着x旋转
cube.rotation.x = Math.PI / 4;//将网格体添加到场景中
scene.add(parentCube);// 设置相机的位置
camera.position.z = 5;
// 为了看到z轴
camera.position.y = 2;
// 设置x轴
camera.position.x = 2;
//设置相机的焦点 (相机看向哪个点)
camera.lookAt(0, 0, 0);//添加世界坐标辅助器  (红色x轴,绿色y轴,蓝色z轴)一个线段 参数为 线段长度
const axesHelper = new THREE.AxesHelper(5);
//添加到场景之中
scene.add(axesHelper);// 添加轨道控制器 (修改侦听位置)  一般监听画布的事件  不监听document.body
const controls = new OrbitControls(camera, renderer.domElement);
// 这里传递阻塞掉了 会导致无法点击
// const controls = new OrbitControls(camera, document.body);// 设置带阻尼的旋转
controls.enableDamping = true;
// 设置阻尼系数
controls.dampingFactor = 0.01;
// 自动旋转
controls.autoRotate = false;//渲染函数
function animate() {controls.update();//请求动画帧requestAnimationFrame(animate);//旋转网格体// cube.rotation.x += 0.01;// cube.rotation.y += 0.01;//渲染renderer.render(scene, camera);
}
animate();
//渲染// 监听窗口的变化 重新设置渲染器的大小 画布自适应窗口
window.addEventListener("resize", () => {// 重新设置渲染器的大小renderer.setSize(window.innerWidth, window.innerHeight);// 重新设置相机的宽高比camera.aspect = window.innerWidth / window.innerHeight;// 重新计算相机的投影矩阵camera.updateProjectionMatrix();
});// var btn = document.createElement("button");
// btn.innerHTML = "点击全屏";
// btn.style.position = "absolute";
// btn.style.top = "10px";
// btn.style.left = "10px";
// btn.style.zIndex = "999";
// btn.onclick = function () {
//   // 全屏 (画布)
//   // renderer.domElement.requestFullscreen();
//   // 全屏 (document.body)  可以看到写入的按钮
//   document.body.requestFullscreen();
// };
// // 将按钮追加
// document.body.appendChild(btn);// //退出全屏按钮
// var exitBtn = document.createElement("button");
// exitBtn.innerHTML = "点击退出全屏";
// exitBtn.style.position = "absolute";
// exitBtn.style.top = "10px";
// exitBtn.style.left = "100px";
// exitBtn.style.zIndex = "999";
// exitBtn.onclick = function () {
//   // 退出全屏
//   document.exitFullscreen();
// };
// // 将按钮追加
// document.body.appendChild(exitBtn);//使用gui控制器
//1.gui控制按钮
let eventObj = {Fullscreen: function () {// 全屏 (画布)// renderer.domElement.requestFullscreen();// 全屏 (document.body)  可以看到写入的按钮document.body.requestFullscreen();},exitFullscreen: function () {// 退出全屏document.exitFullscreen();},
};//创建gui实例
const gui = new GUI();
//添加按钮  第一个参数为对象实例  第二个参数为对象中属性名称
gui.add(eventObj, "Fullscreen").name("全屏");
//退出按钮
gui.add(eventObj, "exitFullscreen").name("退出全屏");//2.gui控制立方体的位置
// gui.add(cube.position, "x", -5, 5).name("立方体x轴位置");
let folder = gui.addFolder("立方体位置");
folder.add(cube.position, "x").min(-10).max(10).step(1).name("立方体x轴位置").onChange((val) => {console.log(val, "x轴位置");});
folder.add(cube.position, "y").min(-10).max(10).step(1).name("立方体y轴位置").onFinishChange((val) => {console.log(val, "y轴位置");});
folder.add(cube.position, "z").min(-10).max(10).step(1).name("立方体z轴位置");//3.gui控制材质
gui.add(parentMaterial, "wireframe").name("父元素线框模式");//4.gui控制方块颜色
let colorParams = {cubeColor: "#00ff00",
};
gui.addColor(colorParams, "cubeColor").name("立方体颜色").onChange((val) => {// console.log(val,'立方体颜色');cube.material.color.set(val);});

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

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

相关文章

Java面试:全面掌握Java知识的捷径!

亲爱的读者们,你是否正在为Java面试而苦恼,不知道该如何准备?你是否想要提升自己的Java知识水平,成为面试中的佼佼者?这篇文章将为你提供最全面的Java面试知识和技巧,让你在面试中游刃有余。 问题&#xf…

解决Python requests库中的重定向问题

目录 一、默认情况下,requests库如何处理重定向 二、手动处理重定向 三、处理多个重定向 四、注意事项 总结 在Python requests库中,处理重定向是一个常见的问题。默认情况下,requests库会自动处理重定向,并将最终的响应返回…

leetcode算法之分治-快排

目录 1.颜色分类2.排序数组3.数组中的第k个最大元素4.最小的k个数 1.颜色分类 颜色分类 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,rightn,i0;while(i<right){if(nums[i] 0) swap(nums[left],nums[i]);e…

(四)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (基本功能介绍)

⭐ 使用大语言模型构建一个能够回答关于给定文档和文档集合的问答系统是一种非常实用和有效的应用场景。与仅依赖模型预训练知识不同&#xff0c;这种方法可以进一步整合用户自有数据&#xff0c;实现更加个性化和专业的问答服务。 例如,我们可以收集某公司的内部文档、产品说明…

Java JSON字符串替换其中对应的值

代码&#xff1a; public static void main(String[] args) { // String theData crmScene.getData();String theData "[{\"type\":1,\"values\":[\"审批中\",\"未交付\"],\"name\":\"status\"}]"…

在 Streamlit 中使用自定义 CSS 创建加密仪表板

一、说明 仪表板是表示任何类型数据的好方法,它是一种可以很好地理解我们正在处理的数据的形式。使用 HTML、CSS 和 JavaScript 框架构建令人惊叹的仪表板可能是一项非常棘手的工作,尤其是当您想要向仪表板添加复杂的功能和复杂的设计时。但不用担心,Python 会来拯救…

实战项目:VB龟兔赛跑游戏+猜数字游戏

文章目录&#xff1a; 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 form1 效果图 代码 form2 效果图 代码 form3 效果图 代码 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ 代码下载 二&#xff1a;实现思路 窗口1&#xff1a;龟兔赛…

AddressSanitizer(ASan)

ASAN功能介绍 AddressSanitizer&#xff08;ASan&#xff09;工具是用于用户空间程序的内存错误检测工具&#xff0c;无法直接用于内核空间。 ASAN早先是LLVM中的特性&#xff0c;后被加入gcc4.8&#xff0c;成为 gcc 的一部分&#xff0c;但不支持符号信息&#xff0c;无法显…

Mybatis-Plus 自定义SQL注入器,实现真正的批量插入![MyBatis-Plus系列]

导读 Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。 在使用MyBatis-Plus时,dao层都会去继承BaseMapper接口,这样就可以用BaseMapper接口所有的方法CRUD。 在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。

使用契约的链上限价订单

我们开发了链上限价订单。 它基于一种称为契约的智能合约&#xff0c;只有在花费输出的交易满足特定条件时才可以花费输出。 为了演示其工作原理&#xff0c;我们实施了以比特币支付的 Ordinals 代币买卖限价订单&#xff0c;无需托管人。 它可以运行在任何比特币协议链上&…

【Python入门教程】Python中函数的用法和意义

在Python中&#xff0c;函数是一种可重用的代码块&#xff0c;它可以被多次调用以执行特定的任务。函数可以帮助我们组织代码&#xff0c;使其更易于阅读和调试&#xff0c;同时还可以提高代码的可重用性和可维护性。 一、函数的定义 在Python中&#xff0c;函数使用def关键字…

C++标准模板库(STL)-map介绍

C标准库中的map是一种关联容器&#xff0c;它提供了键值对的映射关系。每个键值对中的键都是唯一的&#xff0c;通过键可以访问对应的值。 map基本操作 插入元素&#xff1a; 使用insert函数插入元素&#xff0c;该函数有两种形式&#xff1a; // 插入一个pair<const Ke…

网络层——IP协议

文章目录 一.IP协议二.基本概念三.IP协议格式四.分片与组装五.网段划分六.特殊的IP地址七.IP地址的数量限制八.私网IP地址和公网IP地址九.路由十.路由表生成算法 一.IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP…

[uni-app]记录APP端跳转页面自动滚动到底部的bug

文章目录 bug描述原因分析: 处理方案 bug描述 1.点击的A页面, 跳转到了B页面, 第一次页面正常显示 2.从B页面返回A页面 3.A页面不进行任何操作,再次点击A页面进入B页面 4.B页面自动滚动到底部. 原因 看一段A页面代码 let that thisthis.defaultScrollTop uni.getStorageSy…

Zookeeper中的Watch机制的原理?

前言 Zookeeper是一个分布式协调组件&#xff0c;为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构&#xff0c;以节点的方式来管理存储在Zookeeper上的数据 Zookeeper提供了一个Watch机制&#xff0c;可以让客户端感知到Zook…

第12周 E-R图

偏系统化的ER图例子还是不够&#xff0c;需要寻找 汇报时很多人的er图都有问题&#xff0c;重点是作为e的实体&#xff08;方框表示&#xff09;含义并没有搞懂

启动dubbo消费端过程提示No provider available for the service的问题定位与解决

文/朱季谦 某次在启动dubbo消费端时&#xff0c;发现无法从zookeeper注册中心获取到所依赖的消费者API&#xff0c;启动日志一直出现这样的异常提示 Failed to check the status of the service com.fte.zhu.api.testService. No provider available for the service com.fte…

【Vue】Vue3 超简单拖拽条动态修改容器宽度

demo 代码 const leftBoxWidth ref(200); // 默认宽度 const leftResize (e: MouseEvent) > {const startX e.clientX;const startWidth leftBoxWidth.value;const mouseMove (documentE: MouseEvent) > {// 80 是左侧菜单宽度leftBoxWidth.value startWidth docu…

卷积神经网络(VGG-16)海贼王人物识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集5. 归一化 三、构建VGG-16网络1. 官方模型&#xff08;已打包好&#xff…

笔记56:深度循环神经网络

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a