Threejs学习02——使用dat.gui实现主动控制立方体相关操作

news2025/1/17 8:45:32

使用dat.gui实现主动控制立方体相关操作

这是一个非常简单基础的threejs的学习应用!在上一章学习threesj中我们实现立方体在坐标轴中来回移动,那都是通过我们的代码写死的效果,然后立方体的颜色都是通过代码写死的,这一章我们来给大家使用dat.gui工具实现页面主动控制立方体颜色位置以及其他属性的控制效果!

实现效果

在这里插入图片描述

准备工作

我们还是使用上一章用的代码,稍微的改动一些,创建一个没有动的立方体效果
在这里插入图片描述
代码如下:

import * as THREE from 'three'
import gsap from 'gsap'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
//了解thres最基本用法

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

/**
 * 2.创建一个相机(透视相机)
 * fov — 摄像机视锥体垂直视野角度
    aspect — 摄像机视锥体长宽比
    near — 摄像机视锥体近端面
    far — 摄像机视锥体远端面
 */
const camera = new THREE.PerspectiveCamera(90,window.innerWidth/window.innerHeight,1,1000);

//设置相机对象 x y z
camera.position.set(0,0,10); 
//相机加入场景中
scene.add(camera);


//3.添加物体 
//几何体  长宽高
const geo = new THREE.BoxGeometry(1,1,1);
//创建材质
const mater = new THREE.MeshBasicMaterial({color:0xfff00})
//根据几何体和材质创建物体
const cube = new THREE.Mesh(geo,mater);
//将几何体添加到场景中
scene.add(cube);
//初始化渲染器
const render = new THREE.WebGLRenderer();
//设置渲染尺寸大小
render.setSize(window.innerWidth,window.innerHeight);

//将webgl渲染的canvas内容添加到body
document.body.appendChild(render.domElement)

//创建坐标轴辅助器
const axes = new THREE.AxesHelper(5);
scene.add(axes);


//添加控制器
const control = new OrbitControls(camera,render.domElement)
control.update();

//设置时钟
render.render(scene,camera);
function animate(){
    requestAnimationFrame(animate)
    //使用渲染器  通过相机将场景渲染
    render.render(scene,camera);
}
animate()

接下来我们创建dat.gui页面来控制操作!

设计效果

引入dat.gui插件

yarn add dat.gui
or
npm install dat.gui

页面引入dat.gui

import * as dat from 'dat.gui'

创建gui对象

//创建dat.gui
const gui = new dat.GUI();

这里我们首先设置立方体沿着x轴移动的功能

//这里的cube就是立方体对象
//代码解读
//gui页面加入cube的x轴移动最小值为0 最大值为5 间隔为0.01设置的属性名称为‘移动X轴’
gui.add(cube.position,"x").min(0).max(5).step(0.01).name("移动x轴");

然后设置立方体物体的颜色

//代码解读
//gui页面加入颜色对象,当颜色设置改变时修改cube的材质material的颜色为改变后的颜色的值
let params = {
    color:'#ffff00',
    
}
//gui的addColor参数为二个,params为一个对象   后一个参数是调用对象中的哪一个属性为默认值
gui.addColor(params,'color').onChange((value)=>{
    cube.material.color.set(value)
})

添加点击事件,加入立方体来回移动的事件

let params = {
    color:'#ffff00',
    fn:()=>{
        //立方体运动起来 
        //代码解读  使其cube的position参数改动,x改为5 过渡时长为1秒  来回移动  一直重复
        gsap.to(cube.position,{x:5,duration:1,yoyo:true,repeat:-1})
    }
}
//点击触发事件
gui.add(params,'fn').name("点击运动")

添加gui的下拉菜单 下拉菜单中加入立方体是否显示以及改变材质

//设置一个下拉  下拉的名称为‘设置立方体’
var folder = gui.addFolder("设置立方体")
//加入材质设置
folder.add(cube.material,'wireframe')
//加入是否显示设置
folder.add(cube,"visible").name("是否显示")

完整代码如下:

import * as THREE from 'three'
import * as dat from 'dat.gui'
import gsap from 'gsap'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
//了解thres最基本用法

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

/**
 * 2.创建一个相机(透视相机)
 * fov — 摄像机视锥体垂直视野角度
    aspect — 摄像机视锥体长宽比
    near — 摄像机视锥体近端面
    far — 摄像机视锥体远端面
 */
const camera = new THREE.PerspectiveCamera(90,window.innerWidth/window.innerHeight,1,1000);

//设置相机对象 x y z
camera.position.set(0,0,10); 
//相机加入场景中
scene.add(camera);


//3.添加物体 
//几何体  长宽高
const geo = new THREE.BoxGeometry(1,1,1);
//创建材质
const mater = new THREE.MeshBasicMaterial({color:0xfff00})
//根据几何体和材质创建物体
const cube = new THREE.Mesh(geo,mater);
//将几何体添加到场景中
scene.add(cube);
//初始化渲染器
const render = new THREE.WebGLRenderer();
//设置渲染尺寸大小
render.setSize(window.innerWidth,window.innerHeight);

//将webgl渲染的canvas内容添加到body
document.body.appendChild(render.domElement)

//创建坐标轴辅助器
const axes = new THREE.AxesHelper(5);
scene.add(axes);


//添加控制器
const control = new OrbitControls(camera,render.domElement)
control.update();

//设置时钟
render.render(scene,camera);
function animate(){
    requestAnimationFrame(animate)
    //使用渲染器  通过相机将场景渲染
    render.render(scene,camera);
}
animate()



//创建dat.gui
const gui = new dat.GUI();
gui.add(cube.position,"x").min(0).max(5).step(0.01).name("移动x轴");
let params = {
    color:'#ffff00',
    fn:()=>{
        //立方体运动起来
        gsap.to(cube.position,{x:5,duration:1,yoyo:true,repeat:-1})
    }
}
gui.addColor(params,'color').onChange((value)=>{
    cube.material.color.set(value)
})


//点击触发事件
gui.add(params,'fn').name("点击运动")

var folder = gui.addFolder("设置立方体")
folder.add(cube.material,'wireframe')
folder.add(cube,"visible").name("是否显示")

目前还在学习threejs,有写错误的地方请指出!!现在只是一个菜鸟,不喜勿喷!!

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

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

相关文章

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)

常见API,MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips:了解内容 查看API文档,我们可以看到API文档中关于Math类的定义如下: Math类…

大数据大数据架构发展史

1.背景 随着数据量的暴增和数据实时性要求越来越高,以及大数据技术的发展驱动企业不断升级迭代,传统数仓经历了以下发展过程:传统数仓架构 -> 离线大数据架构 -> Lambda架构 -> Kappa架构 -> 新一代实时数仓。(大部分…

Vitis高层次综合学习——FPGA

高层次综合 什么是高层次综合?就是使用高级语言(如C/C)来编写FPGA算法程序。 在高层次综合上并不需要制定微架构决策,如创建状态机、数据路径、寄存器流水线等。这些细节可以留给 HLS 工具,通过提供输入约束&#xff…

ATX

导航 (返回顶部) 1. ATX (Advanced Technology Extended)2. 主板3. 电源 3.1 主要版本简表3.2 更换电源需要考虑的问题3.3 电源效率3.4 80 Plus 4. 退役的电源 4.1 24pin主供电接口4.2 12v的CPU供电接口4.3 12v的PCI-E供电接口4.4 SATA电源接口4.5 D型大4pin接口 1. ATX (Adv…

Android Studio Giraffe控制台乱码

这几天在使用Android Studio Giraffe进行一个App的开发,在项目构建的时候,控制台输出中文都是乱码,看着很不爽,进行了两项配置,中文就可以正常输出了,看起来就爽多了。 第一个配置:点击Help菜单…

冠达管理:A股利好!国家队最新出手!拜登紧急发声

号称“国家队”的大基金二期最新出手。 8月15日晚间,华润微公告,子公司润鹏半导体拟增资扩股并引进大基金二期等外部出资者,本次买卖完成后,润鹏半导体注册资本将由24亿元添加至150亿元。其间,大基金二期持股份额将达2…

uni-app根据经纬度逆解析详细地址

uni-app中的getLocation()方法可以获取到用户当前的地理位置(经纬度)、速度。 但是返回参数中的address在app中才会显示,小程序中不会显示,所以我们需要进行逆解析其地址,解析出它的地址信息。 1.首先要在腾讯位置服务…

解决多模块内核心模块有接口打包成jar后被依赖并调用遇到的问题(springcloud集成ruoyi.quartz)

项目准备开发个新功能,刚好很喜欢ruoyi写的任务调度,因此想到了集成ruoyi.quartz模块 ,遇到了很多问题: 首先因为ruoyi.quartz模块依赖了ruoyi.common模块,因此第一步我需要把common模块一部分依赖项复制到了quartz模块内&#xf…

查看端口号被应用程序占用

打开资源监视器 找到被占用的端口,记住她的PID 打开任务管理器 把占用端口的程序关掉

SAP LTMC 批导创建物料

LTMC这个事务代码是HANA 版本的LSMW。其实就是一个批导工具 我们来用LTMC 来做一下物料的期初批导 1.首先在GUI中输入T-CODE : LTMC 2.输入你的账号密码和客户端之后会进入这个界面 3.点击CREATE 4.在下图框中的位置选择我们要进行的任务 5.download template 6.…

第六章:用FATE从零实现纵向线性回归

第六章 用FATE从零实现纵向线性回归 6.1 数据集的获取与描述6.2纵向数据集切分6.3 纵向联邦训练6.3.1 数据输入6.3.2 样本对齐6.3.3 模型训练 6.4 模型评估 代码 本章利用FATE从零开始实现一个简单的纵向线性回归模型,本章以实验为主。 与第5章一样,本章…

GEWE框架 ipad协议

GEWE框架 是一套完整的的第三方服务平台,包含微信API服务、企微API服务、SCRM系统定制、企微系统定制、服务类软件定制等模块,本文档主要讲述个微API服务相关,以下简称API,它能处理用户微信中的各种事件,提供了开发者…

使用VSCode的 Dev Containers 插件搭配Docker 容器进行开发环境的搭建

需要安装插件 https://marketplace.visualstudio.com/items?itemNamems-vscode-remote.remote-containers 安装Docker 这样做的好处 每一个项目可以运行一个容器,在容器内开发,相关之间node环境隔离,彻底解决本地包版本依赖关错乱问题共用…

日精注塑机联网

不改造程序的话,日精支持输出CSV和txt数据作为其他软件的接口。 改造后可以支持63协议。 在软件层面日精也有专用的软件,可以看到其实设备厂家提供的软件功能已经非常丰富了,但这类软件最大的缺点是只能自己家的机器使用,要想其他…

基于Pytorch构建AlexNet网络对cifar-10进行分类

AlexNet网络是CV领域最经典的网络结构之一了,在2012年横空出世,并在当年夺下了不少比赛的冠军。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。AlexNet和LeNet的设计非常类似,但AlexNet的结构比…

获取通达信股票代码接口--通达信逐笔接口(一)

通达信逐笔接口也是能获取股票的逐笔交易数据,但需要提前通达信逐笔接口提前安装通达信软件系统,打开相关的数据权限或者接口使用权限才能执行。一般执行步骤: 1. 初始化接口:在代码中引入相关的库文件并初始化获取通达信股票代码…

每日一题 24两两交换链表中的节点

题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出&#xff1a…

数据暴涨时代,该如何数据治理?_光点科技

随着信息技术的迅猛发展,数据已经成为现代社会的核心资源。在这个被称为"数据暴涨时代"的时代里,大量的数据源源不断地被产生和积累,但如何有效地管理、分析和利用这些数据成为了一个迫切需要解决的问题。数据治理,作为…

【JVM】如何判定一个对象已死以及“标记-清除”、“标记-复制”、“标记-整理”三种垃圾收集算法

文章目录 0、如何判定一个对象的生死?1、上文提到的引用又是什么1、强引用:2、软引用:3、弱引用:4、虚引用: 2、垃圾收集算法1、标记-清除2、标记-复制优化:👇 3、标记-整理 0、如何判定一个对象…

2023雷军年度演讲听后感

(点击即可收听) 2023雷军年度演讲-文字完整版 2023年8月14号晚,雷军的第四次演讲,热些沸腾 相比前三次演讲,第一次在2020 年 8 月 11 日,以“相信自己,一往无前”为主题进行了分享,第二次,第三次分别是在2021 年和 202…