使用dat.gui更改three.js中的物体变量

2023-11-14

一、dat.gui介绍

gui是一种JavaScript库,用于创建可视化控件和调试工具。它是dat.gui的简称。dat.gui是一个用于在Web应用程序中创建可定制GUIJavaScript库。它可以轻松创建滑块、复选框、颜色选择器等控件,用户可以直接在GUI上进行交互和调整。dat.gui还提供了一些调试工具,例如实时查看变量值等。它是一个轻量级、易于使用且高度可定制的库,可用于构建各种类型的Web应用程序,从游戏到数据可视化。

二、dat.gui使用示例

以下是一个使用dat.gui创建GUI界面的简单例子:

//引入dat.gui库的js文件
<script type="text/javascript" src="dat.gui.min.js"></script>

//创建一个GUI实例
var gui = new dat.GUI();

//添加一个参数
var options = {
  color: '#ff0000'
}

//在GUI界面中添加一个颜色控制器
gui.addColor(options, 'color').onChange(function(value) {
  //动态改变页面元素的颜色
  document.body.style.backgroundColor = value;
});

在以上例子中,我们通过创建一个GUI实例,添加一个颜色参数,并在GUI界面中添加一个颜色控制器。控制器的取值范围为任意颜色值,当控制器的值发生改变时,会触发onChange函数内的代码,通过改变页面的背景色来实现动态更新。

三、使用dat.gui更改three.js物体

先下载

npm i dat.gui

1. 更改物体的x轴
// 导入dat.gui
import * as dat from "dat.gui";
// 创建dat.gui
const gui = new dat.GUI();
gui
  .add(cube.position, "x")
  .min(0)
  .max(5)
  .step(0.01)
  .name("移动x轴")

在这里插入图片描述

2. 修改物体颜色
// 修改物体的颜色
const params = {
  color: "#ffff00",
};
gui.addColor(params, "color").onChange((value) => {
  console.log("值被修改:", value);
  cube.material.color.set(value);
});

在这里插入图片描述

3. 控制显示隐藏
gui.add(cube, "visible").name("是否显示");

在这里插入图片描述
在这里插入图片描述

4. 立方体运动
const params = {
  fn: () => {
    // 让立方体运动起来
    gsap.to(cube.position, { x: 5, duration: 2, yoyo: true, repeat: -1 });
  },
};
gui.add(params, "fn").name("立方体运动");

在这里插入图片描述

5. 设置下拉菜单,控制物体材质
let folder = gui.addFolder("设置立方体");
folder.add(cube.material, "wireframe");

在这里插入图片描述
完整代码如下:

// 导入three
import * as THREE from "three";

// 导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

// 导入动画库
import gsap from "gsap";

// 导入dat.gui
import * as dat from "dat.gui";

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

// 创建相机
// 参数:视野角度,长宽比,近平面,远平面
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

// 设置相机位置
// 参数:x轴,y轴,z轴
camera.position.set(0, 0, 5);

// 将相机添加到场景中
scene.add(camera);

// 创建几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(geometry, material);

// 修改物体的位置
// cube.position.set(1, 1, 1)

// 缩放
// cube.scale.set(1, 2, 3) // x轴缩放1倍,y轴缩放2倍,z轴缩放3倍

// 将物体添加到场景中
scene.add(cube);
console.log("物体", cube);

// 创建dat.gui
const gui = new dat.GUI();
gui
  .add(cube.position, "x")
  .min(0)
  .max(5)
  .step(0.01)
  .name("移动x轴")
  .onChange((value) => {
    console.log("值被修改:", value);
  })
  .onFinishChange((value) => {
    console.log("完全停下来:", value);
  });
// 修改物体的颜色
const params = {
  color: "#ffff00",
  fn: () => {
    // 让立方体运动起来
    gsap.to(cube.position, { x: 5, duration: 2, yoyo: true, repeat: -1 });
  },
};
gui.addColor(params, "color").onChange((value) => {
  console.log("值被修改:", value);
  cube.material.color.set(value);
});
// 设置选项框
gui.add(cube, "visible").name("是否显示");
gui.add(params, "fn").name("立方体运动");
let folder = gui.addFolder("设置立方体");
folder.add(cube.material, "wireframe");


// 创建渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染器大小
renderer.setSize(window.innerWidth, window.innerHeight);
// console.log(renderer)
// 将渲染器添加到页面中
document.body.appendChild(renderer.domElement);

// 创建轨道控制器
// 参数:相机,渲染器dom元素
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 开启阻尼效果
controls.rotateSpeed = 0.5; // 旋转速度
controls.target.set(0, 0, 0); // 查看物体时的中心点

// 添加坐标轴辅助器
// 参数:坐标轴长度
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

// 设置时钟
const clock = new THREE.Clock();


// 监听鼠标双击击事件
window.addEventListener("dblclick", () => {
  const fullScreenElement = document.fullscreenElement;
  if (!fullScreenElement) {
    //   双击控制屏幕进入全屏,退出全屏
    // 让画布对象全屏
    renderer.domElement.requestFullscreen();
  } else {
    //   退出全屏,使用document对象
    document.exitFullscreen();
  }
});

// 使用渲染器,通过相机渲染场景
function animate() {
  requestAnimationFrame(animate); //帧动画
  controls.update(); //更新控制器
  renderer.render(scene, camera); //渲染
}
animate();

// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {
  //   console.log("画面变化了");
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  //   更新摄像机的投影矩阵
  camera.updateProjectionMatrix();

  //   更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  //   设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
});

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用dat.gui更改three.js中的物体变量 的相关文章

随机推荐

  • [React]为什么写React组件的时候,需要先引入React?

    React相信各位伙伴都不陌生 那么你的React技术还好吗 来跟我一起重学一遍React 看看有什么知识是你没有记住的呢 一起来查漏补缺下 目录 为什么有的React页面及组件在写的时候需要引入 React 为什么会出现这个问题 Reac
  • Android多屏幕适配-平板

    http blog csdn net qq 27570955 article details 53207600 1 常用单位及其关系 px 像素 inch 英寸 pt 1 72 英寸 dpi 一英寸长的直线上的像素点的数量 即像素密度 不同
  • 软件测试人员分工详情

    最近看了点敏捷测试的东西 看得比较模糊 一方面是因为没有见真实的环境与流程 也许它跟本就没有固定的模式与流程 它就像告诉人们要 勇敢 努力 有的人在勇敢的面对生活 有些人在勇敢的挑战自我 有些人在勇敢的面对失败与挫折 好吧 他们都实现了 勇
  • Vue报错之$nextTick

    今天在生产上面出现了一个问题 我们作为一个整个的项目 我们制作的报账系统是其中一个的子系统 但是现在出现了一个问题 因为我们是共同使用一个前段 而且我们是最先上线的 就导致其他的系统在模仿我们的代码情况 然后他们修改了我们的代码中的公共部分
  • ESP32-土壤湿度传感器

    ESP32 土壤湿度传感器使用 土壤湿度传感器介绍 一 连接传感器引脚 二 使用步骤 1 创建代码 2 保存运行 总结 土壤湿度传感器介绍 提示 土壤湿度传感器 有很多种 我这里用的是电阻式土壤湿度传感器 其原理是 把传感器插入土壤中 不同
  • OpenGL--光源

    OpenGL至少支持8个光源 要查询OpenGL实现支持的光源数 可调用glGetIntegerv 要启用或者禁用光源 分别使用glEnable GL LIGHTi 和glDisable GL LIGHTi 其中i的可能取值为0到GL MA
  • mysql查询所有分类前三的数据

    设计思路 当mysql查询有很多分类时 可能只需要每种分类的前三或者前十的数据 不需要返回所有的结果 所以我们可以给不同种类的数据添加序号 然后通过序号来筛选结果 例 建一张工人工作质量表 用年份和质量来分类 CREATE TABLE wo
  • kali如何使用中文语言包的方法

    kali linux2020 06版如何使用中文语言包 原来kali还需要使用独立的汉化包 现在中文语言包是集成在系统中的 但安装上去默认的还是英文 对于我这种英文欠佳的不太友好 于是 打开终端 输入 sudo dpkg reconfigu
  • angular2 对于DOM元素的获取与操作

    为了能够支持跨平台 angular通过抽象层封装了不同平台的差异 正确操作DOM的方式 用ElementRef和Renderer2 这篇文章将讲述如何使用Renderer2来操作DOM元素 我们可以使用Renderer2对元素的class和
  • 基于改进多目标粒子群算法的配电网储能选址定容——附Matlab代码

    目录 摘要 主要内容 程序思路 储能选址定容优化模型 1 节点电压波动 2 负荷波动 3 储能系统容量 改进的多目标粒子群算法 1 自适应权重 2 交叉变异 3 种群全局最优解的选取 算例分析及结果 本文Matlab代码分享 摘要 以系统节
  • 人工智能:分类算法——朴素贝叶斯、决策树的简单理解与代码实现,SVM、人工神经网络的简单理解

    下文使用代码 链接 pan baidu com s 1sR2bt Iu89M3h 8XMPjEuQ 提取ey3q 分类算法朴素贝叶斯 决策树 SVM 人工神经网络 汽车分类实战 一 实验目的 二 实验的硬件 软件平台 三 实验算法原理 一
  • Linux查看应用的CPU、内存使用情况

    目录 一 jps命令 二 ps命令 三 top命令 四 free命令 五 df命令 查看应用的CPU 内存使用情况 使用jps ps top free df命令查看 一 jps命令 可以列出本机所有java应用程序的进程pid jps op
  • c++11 chrono全面解析(高精度时钟,可达纳秒级别)

    1 精度 时钟节拍 时间精度 template
  • 进程池

    进程池 进程池的使用场景 当我们需要并行的处理大规模任务的时候 需要使用到多进程 多线程技术 比如说服务器处理大量客户端的任务 我在大一的时候写过一个C S mysql架构的聊天室 大概是这样处理的 每当有客户端发出连接请求时 服务器acc
  • 如何获取美团的热门商品和服务

    导语 美团是中国最大的生活服务平台之一 提供了各种各样的商品和服务 如美食 酒店 旅游 电影 娱乐等 如果你想了解美团的热门商品和服务 你可以使用爬虫技术来获取它们 本文将介绍如何使用Python和BeautifulSoup库来编写一个简单
  • 【React】Hooks入门教程(二、React最常用的四种钩子)

    这个 API 是 React 的未来 有必要深入理解 本文谈谈我的理解 简单介绍它的用法 帮助大家快速上手 阅读本文需要有 React 基础 如果你还没学会 React 可以先看一下它的教程 更新 我后来又写了一篇 轻松学会 React 钩
  • 计算机网络——7层OSI网络模型

    文章目录 OSI模型 1 应用层 2 表示层 3 会话层 4 传输层 5 网络层 6 网络链路层 7 物理层 TCP IP分层模型 1 第一层 网络接口层 和物理层 2 第二层 网间 络 层 3 第三层 传输层 4 第四层 应用层 TCP
  • xxj-job容器部署

    一 admin端命令 docker run e PARAMS spring datasource url jdbc mysql 127 0 0 1 3306 xxl job useUnicode true characterEncoding
  • ReentrantLock学习总结

    ReentrantLock锁和synchronized锁相比具有以下特点 可被中断 即可以设置 可中断锁 当t1线程获取不到锁对象处于Blocked状态时 可由另一个线程调用t1的interrupt方法将其中断 此时t1会抛出被打断异常 可
  • 使用dat.gui更改three.js中的物体变量

    一 dat gui介绍 gui是一种JavaScript库 用于创建可视化控件和调试工具 它是dat gui的简称 dat gui是一个用于在Web应用程序中创建可定制GUI的JavaScript库 它可以轻松创建滑块 复选框 颜色选择器等