简介

使用这个插件的最省事的地方在于,调试很方便的调节相关的值,从而影响最后绘制的结果。而dat.GUI实现的东西也很简单,理解起来也很好理解。

案例查看地址:http://www.wjceo.com/blog/threejs/2018-02-12/18.html

我们实例化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 οnlοad="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.PCFShadowMapdocument.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>

16 Three.js使用dat.GUI简化试验流程相关推荐

  1. Three.js中引入dat.gui库实现界面组件控制动画速度变量

    场景 Three.js中使用requestAnimationFrame方法实现立方体转动和小球跳动的动画: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/arti ...

  2. 初见物理引擎库Cannon.js:使用dat.gui修改物体属性

    0 前言 本文是"初见物理引擎库Cannon.js"系列的第二篇文章,在本文中主要讲解dat.gui的使用. 1 dat.gui简介 熟悉Three.js的读者肯定对dat.gui ...

  3. Dat.gui 使用教程

    官方站点:http://workshop.chromeexperiments.com/examples/gui/ Dat.gui 使用教程:Dat.gui 是一个 GUI 组件,他可以为你的 demo ...

  4. mermaid与flowchart.js绘制流程图分支结构试验

    mermaid与flowchart.js绘制流程图分支结构试验 近日绘制流程图时对不断修改调整流程图中节点位置感到很厌烦,想要改用代码方式来写流程图.以下试验均基于CSDN编辑器的的mermaid和f ...

  5. 简化开发流程--UEditor富文本编辑器

    为了减少开发成本,简化开发流程.百度为开发者们提供了一款UEditor文本编辑器,下面我们一起来学习如何使用UEditor进行开发. 这里是UEditor的下载地址:https://ueditor.b ...

  6. js引擎执行代码的基本流程

    js引擎执行代码的基本流程 先执行初始化代码: 包含一些特别的代码 设置定时器 绑定监听 发送ajax请求 后面在某个时刻才会执行回调代码

  7. rdlc报表 矩形高固定_固定资产管理系统_简化资产管理流程

    随着企业经营范围的不断拓展,企业每年都投入大量费用来购置各种资产,但随时间推移,企业在资产管理中往往会出现下列情况: 1.不清楚资产的使用状态.位置.使用人,资产利用效率低,重复购置现象严重. 2.资 ...

  8. 延锋安道拓:简化工作流程 实现研发数据外发安全可控

    客户简介 延锋安道拓座椅有限公司成立于1997年,是由延锋伟世通汽车饰件系统有限公司(隶属于上汽集团华域汽车SH:600741)和美国江森自控国际有限公司(NYSE:JCI)共同投资组建的合资企业,拥 ...

  9. RPA机器人能做什么?自动化办公、简化工作流程……还有很多事情等着你挖掘

    看到这篇文章,首先我要恭喜你,因为我会带领你进入一个全新的领域,这将极大地方便你的日常工作和生活. 你听说过RPA吗?也许你会认为这是一个非常陌生的名词,但它可能会改变你的工作方式,提高你的工作效率! ...

最新文章

  1. struts2获取服务器临时目录
  2. minicom 串口信息过长分行显示
  3. 阿里为什么推荐使用LongAdder,而不是volatile?
  4. (王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归
  5. 滴滴滴,测试工程师简历模板分享一波
  6. python中split的用法-python中的split()函数的用法
  7. CI框架上传csv文件
  8. Bugku CTF 每日一题 想蹭网先解开密码
  9. 【Tensorflow 报错】struct.error: 'i' format requires -2147483648 = number = 2147483647
  10. 2014腾讯校园招聘笔试题
  11. 算法导论第三章思考题
  12. 线性电路中DAC和ADC的校准
  13. 微软官方工具_微软官方小工具,每天让你眼前一新
  14. 【Python基础学习】基本数据结构:列表、元组、栈、字典、集合与队列
  15. 线上配镜新方式:眼镜直通车竞品分析报告
  16. 浙江大学计算机学院保研率,新鲜出炉:浙大、中科大、复旦大学2021届保研率、各专业推免人数...
  17. C++连接MySQL
  18. 《中国制造2025蓝皮书(2017)》重磅发布
  19. linux riot密码,《lol手游》Riot拳头账号密码介绍 Ri...
  20. python在线编程免费课程-少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

热门文章

  1. 基于SSM实现水果商城批发平台
  2. VBA编程_Application
  3. 华为nova2s用哪个型号服务器,华为nova 2s
  4. MySQL(一) -----启动与关闭
  5. flutter Text文本,中英文混合,或则英文单词自动换行处理
  6. ckplayer 网页视频播放
  7. 字节流之文件输入流FileInputStream(上)
  8. python初学 菜鸟
  9. nacos访问显示404
  10. 100000 行级别数据的 Excel 导入优化之路