Three.js利用dat.GUI如何简化试验流程详解

发布时间 - 2026-01-11 03:24:58    点击率:

简介

本文主要给大家介绍了关于Three.js利用dat.GUI如何简化试验流程的想内容,其实使用这个插件的最省事的地方在于,调试很方便的调节相关的值,从而影响最后绘制的结果。而dat.GUI实现的东西也很简单,理解起来也很好理解。下面话不多说了,来一起看看详细的介绍吧。

我们实例化dat.GUI对象后,会在右上角显示出一些可以调节的参数,比如:

这就是今天的案例制作出来的五个可以调节的属性。而且实现起来也很简单,而且大部分是需要我们做的,除了上面的这个控制台不是我们写出来的。

引入方式

首先,你需要将库文件引入到页面当中:

<script src="examples/js/libs/dat.gui.min.js"></script> 

然后,你可以声明一个对象,对象内包括所有需要修改的属性,比如:

gui = { 
 lightY:30, //灯光y轴的位置 
 sphereX:0, //球的x轴的位置 
 sphereZ:0, //球的z轴的位置 
 cubeX:25, //立方体的x轴位置 
 cubeZ:-5 //立方体的z轴的位置 
}; 

这是本人书写的案例相关的属性,和上面图片的能够对比起来。

下一步,你就需要实力化dat.GUI对象,然后把相关需要控制的属性调用属性相关的add(对象,属性,最小值,最大值)方法,将属性控制添加进去:

var datGui = new dat.GUI(); 
  //将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值) 
  datGui.add(gui,"lightY",0,100); 
  datGui.add(gui,"sphereX",-30,30); 
  datGui.add(gui,"sphereZ",-30,30); 
  datGui.add(gui,"cubeX",0,60); 
  datGui.add(gui,"cubeZ",-30,30); 

到了这一步,dat.GUI对象,就可以控制这些值了,我们再需要做的就是,在每一次渲染的animate函数里面讲相关的值修改掉,这样就能实现这个效果了。

//更新相关位置 
light.position.y = gui.lightY; 
sphere.position.x = gui.sphereX; 
sphere.position.z = gui.sphereZ; 
cube.position.x = gui.cubeX; 
cube.position.z = gui.cubeZ; 

到这里就实现效果了。

常用方法

gui.addFolder()

此方法是添加一个栏目,返回一个栏目对象,具有下拉菜单的功能,如果在当前栏目下面添加功能按钮,需要按下面的方式书写

var lightFolder = gui.addFolder('Light'); 
 
lightFolder.add(param, 'width', 0.1, 100).onChange(function (val) { 
 
 rectLight.width = val; 
 
}); 

gui.add()

这个方法是常用的添加方法,可以添加一个普通按钮,最小传入两个值,三四个值是设置范围

将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)

如果对象里面的类是一个函数,如果需要触发的点击事件,只传入两个值就好了,点击的时候就可以触发到相关事件。

gui.add(controls, 'addCube'); 
gui.addColor()

这个方法添加的按钮时一个标准的颜色选择器,比如:

gui.addColor(param, 'color') 

.onChange()

这个方法是可以触发的回调函数,在值发生变动的时候会触发当前函数,比如

gui.addColor(param, 'color').onChange(function (val) { 
 
 rectLight.color.setHex(val); 
 
}); 

.listen()

如果当前只是想显示当前的值,而且监听当前的变化,就这么写:

gui.add(obj, 'key').listen(); 

效果案例

 

下面附上我的全部代码:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
 <meta charset="UTF-8"> 
 <title>Title</title> 
 <style type="text/css"> 
  html, body { 
   margin: 0; 
   height: 100%; 
  } 
 
  canvas { 
   display: block; 
  } 
 
 </style> 
</head> 
<body onload="draw();"> 
 
</body> 
<script src="build/three.js"></script> 
<script src="examples/js/controls/OrbitControls.js"></script> 
<script src="examples/js/libs/stats.min.js"></script> 
<script src="examples/js/libs/dat.gui.min.js"></script> 
<script> 
 var renderer; 
 function initRender() { 
  renderer = new THREE.WebGLRenderer({antialias:true}); 
  renderer.setSize(window.innerWidth, window.innerHeight); 
  //告诉渲染器需要阴影效果 
  renderer.shadowMap.enabled = true; 
  renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默认的是,没有设置的这个清晰 THREE.PCFShadowMap 
  document.body.appendChild(renderer.domElement); 
 } 
 
 var camera; 
 function initCamera() { 
  camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000); 
  camera.position.set(0, 40, 100); 
  camera.lookAt(new THREE.Vector3(0,0,0)); 
 } 
 
 var scene; 
 function initScene() { 
  scene = new THREE.Scene(); 
 } 
 
 //初始化dat.GUI简化试验流程 
 var gui; 
 function initGui() { 
  //声明一个保存需求修改的相关数据的对象 
  gui = { 
   lightY:30, //灯光y轴的位置 
   sphereX:0, //球的x轴的位置 
   sphereZ:0, //球的z轴的位置 
   cubeX:25, //立方体的x轴位置 
   cubeZ:-5 //立方体的z轴的位置 
  }; 
  var datGui = new dat.GUI(); 
  //将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值) 
  datGui.add(gui,"lightY",0,100); 
  datGui.add(gui,"sphereX",-30,30); 
  datGui.add(gui,"sphereZ",-30,30); 
  datGui.add(gui,"cubeX",0,60); 
  datGui.add(gui,"cubeZ",-30,30); 
 } 
 
 var light; 
 function initLight() { 
  scene.add(new THREE.AmbientLight(0x444444)); 
 
  light = new THREE.PointLight(0xffffff); 
  light.position.set(15,30,10); 
 
  //告诉平行光需要开启阴影投射 
  light.castShadow = true; 
 
  scene.add(light); 
 } 
 
 var sphere,cube; 
 function initModel() { 
  //上面的球 
  var sphereGeometry = new THREE.SphereGeometry(5,200,200); 
  var sphereMaterial = new THREE.MeshLambertMaterial({color:0xaaaaaa}); 
 
  sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); 
  sphere.position.y = 5; 
 
  //告诉球需要投射阴影 
  sphere.castShadow = true; 
 
  scene.add(sphere); 
 
 
  //光源的球 
  var spGeometry = new THREE.SphereGeometry(0.5,20,20); 
  var spMaterial = new THREE.MeshPhysicalMaterial({color:0xffffff}); 
 
  var sp = new THREE.Mesh(spGeometry,spMaterial); 
 
  sp.position.set(15,30,10); 
 
  scene.add(sp); 
 
  //辅助工具 
  var helper = new THREE.AxisHelper(10); 
  scene.add(helper); 
 
  //立方体 
  var cubeGeometry = new THREE.CubeGeometry(10,10,8); 
  var cubeMaterial = new THREE.MeshLambertMaterial({color:0x00ffff}); 
 
  cube = new THREE.Mesh(cubeGeometry, cubeMaterial); 
  cube.position.x = 25; 
  cube.position.y = 5; 
  cube.position.z = -5; 
 
  //告诉立方体需要投射阴影 
  cube.castShadow = true; 
 
  scene.add(cube); 
 
  //底部平面 
  var planeGeometry = new THREE.PlaneGeometry(100,100); 
  var planeMaterial = new THREE.MeshStandardMaterial({color:0xaaaaaa}); 
 
  var plane = new THREE.Mesh(planeGeometry, planeMaterial); 
  plane.rotation.x = - 0.5 * Math.PI; 
  plane.position.y = -0; 
 
  //告诉底部平面需要接收阴影 
  plane.receiveShadow = true; 
 
  scene.add(plane); 
 
 } 
 
 //初始化性能插件 
 var stats; 
 function initStats() { 
  stats = new Stats(); 
  document.body.appendChild(stats.dom); 
 } 
 
 //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 
 var controls; 
 function initControls() { 
 
  controls = new THREE.OrbitControls( camera, renderer.domElement ); 
 
  // 如果使用animate方法时,将此函数删除 
  //controls.addEventListener( 'change', render ); 
  // 使动画循环使用时阻尼或自转 意思是否有惯性 
  controls.enableDamping = true; 
  //动态阻尼系数 就是鼠标拖拽旋转灵敏度 
  //controls.dampingFactor = 0.25; 
  //是否可以缩放 
  controls.enableZoom = true; 
  //是否自动旋转 
  controls.autoRotate = false; 
  //设置相机距离原点的最远距离 
  controls.minDistance = 100; 
  //设置相机距离原点的最远距离 
  controls.maxDistance = 200; 
  //是否开启右键拖拽 
  controls.enablePan = true; 
 } 
 
 function render() { 
  renderer.render( scene, camera ); 
 } 
 
 //窗口变动触发的函数 
 function onWindowResize() { 
 
  camera.aspect = window.innerWidth / window.innerHeight; 
  camera.updateProjectionMatrix(); 
  render(); 
  renderer.setSize( window.innerWidth, window.innerHeight ); 
 
 } 
 
 function animate() { 
  //更新控制器 
  render(); 
 
  //更新性能插件 
  stats.update(); 
 
  //更新相关位置 
  light.position.y = gui.lightY; 
  sphere.position.x = gui.sphereX; 
  sphere.position.z = gui.sphereZ; 
  cube.position.x = gui.cubeX; 
  cube.position.z = gui.cubeZ; 
 
  controls.update(); 
 
  requestAnimationFrame(animate); 
 } 
 
 function draw() { 
  initGui(); 
  initRender(); 
  initScene(); 
  initCamera(); 
  initLight(); 
  initModel(); 
  initControls(); 
  initStats(); 
 
  animate(); 
  window.onresize = onWindowResize; 
 } 
</script> 
</html> 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用Three.js具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


# three.js  # dat.gui  # dat.gui.js教程  # dat.gui.js  # Three.js Interpolant实现动画插值  # three.js简单实现类似七圣召唤的掷骰子  # Three.js 粗糙度贴图与金属度贴图使用介绍  # Three.js引入Cannon.js及使用示例详解  # three.js创造时空裂缝特效实现示例  # vue three.js创建地面并设置阴影实现示例  # three.js镜头追踪的移动效果实例  # vue+three.js实现炫酷的3D登陆页面示例详解  # three.js-结合dat.gui实现界面可视化修改及调试详解  # 最小值  # 右键  # 也很  # 就可以  # 的是  # 拖拽  # 是一个  # 这是  # 很好  # 你可以  # 你就  # 鼠标  # 就能  # 说了  # 这就是  # 不多  # 会在  # 有一定  # 给大家  # 按下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  使用spring连接及操作mongodb3.0实例  免费视频制作网站,更新又快又好的免费电影网站?  如何在阿里云虚拟主机上快速搭建个人网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  C#如何调用原生C++ COM对象详解  PythonWeb开发入门教程_Flask快速构建Web应用  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel如何创建自定义Artisan命令?(代码示例)  在线制作视频的网站有哪些,电脑如何制作视频短片?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何确保西部建站助手FTP传输的安全性?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  网站制作报价单模板图片,小松挖机官方网站报价?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Laravel storage目录权限问题_Laravel文件写入权限设置  如何用JavaScript实现文本编辑器_光标和选区怎么处理  BootStrap整体框架之基础布局组件  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  java ZXing生成二维码及条码实例分享  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  微信推文制作网站有哪些,怎么做微信推文,急?  Python高阶函数应用_函数作为参数说明【指导】  HTML 中动态设置元素 name 属性的正确语法详解  浅述节点的创建及常见功能的实现  Laravel怎么实现验证码(Captcha)功能  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  EditPlus 正则表达式 实战(3)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  如何快速搭建自助建站会员专属系统?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何在建站之星网店版论坛获取技术支持?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  昵图网官方站入口 昵图网素材图库官网入口  在线制作视频网站免费,都有哪些好的动漫网站?