Three.js利用dat.GUI简化试验流程的方法

2021-02-22 07:36:09 180 0
tangjin

这篇文章给大家分享的是有关Three.js利用dat.GUI简化试验流程的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

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

Three.js利用dat.GUI简化试验流程的方法

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

引入方式

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

<scriptsrc="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(对象,属性,最小值,最大值)方法,将属性控制添加进去:

vardatGui=newdat.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()

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

varlightFolder=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();

效果案例

Three.js利用dat.GUI简化试验流程的方法

下面附上我的全部代码:

<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Title</title>
<styletype="text/css">
html,body{
margin:0;
height:100%;
}

canvas{
display:block;
}

</style>
</head>
<bodyonload="draw();">

</body>
<scriptsrc="build/three.js"></script>
<scriptsrc="examples/js/controls/OrbitControls.js"></script>
<scriptsrc="examples/js/libs/stats.min.js"></script>
<scriptsrc="examples/js/libs/dat.gui.min.js"></script>
<script>
varrenderer;
functioninitRender(){
renderer=newTHREE.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);
}

varcamera;
functioninitCamera(){
camera=newTHREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);
camera.position.set(0,40,100);
camera.lookAt(newTHREE.Vector3(0,0,0));
}

varscene;
functioninitScene(){
scene=newTHREE.Scene();
}

//初始化dat.GUI简化试验流程
vargui;
functioninitGui(){
//声明一个保存需求修改的相关数据的对象
gui={
lightY:30,//灯光y轴的位置
sphereX:0,//球的x轴的位置
sphereZ:0,//球的z轴的位置
cubeX:25,//立方体的x轴位置
cubeZ:-5//立方体的z轴的位置
};
vardatGui=newdat.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);
}

varlight;
functioninitLight(){
scene.add(newTHREE.AmbientLight(0x444444));

light=newTHREE.PointLight(0xffffff);
light.position.set(15,30,10);

//告诉平行光需要开启阴影投射
light.castShadow=true;

scene.add(light);
}

varsphere,cube;
functioninitModel(){
//上面的球
varsphereGeometry=newTHREE.SphereGeometry(5,200,200);
varsphereMaterial=newTHREE.MeshLambertMaterial({color:0xaaaaaa});

sphere=newTHREE.Mesh(sphereGeometry,sphereMaterial);
sphere.position.y=5;

//告诉球需要投射阴影
sphere.castShadow=true;

scene.add(sphere);


//光源的球
varspGeometry=newTHREE.SphereGeometry(0.5,20,20);
varspMaterial=newTHREE.MeshPhysicalMaterial({color:0xffffff});

varsp=newTHREE.Mesh(spGeometry,spMaterial);

sp.position.set(15,30,10);

scene.add(sp);

//辅助工具
varhelper=newTHREE.AxisHelper(10);
scene.add(helper);

//立方体
varcubeGeometry=newTHREE.CubeGeometry(10,10,8);
varcubeMaterial=newTHREE.MeshLambertMaterial({color:0x00ffff});

cube=newTHREE.Mesh(cubeGeometry,cubeMaterial);
cube.position.x=25;
cube.position.y=5;
cube.position.z=-5;

//告诉立方体需要投射阴影
cube.castShadow=true;

scene.add(cube);

//底部平面
varplaneGeometry=newTHREE.PlaneGeometry(100,100);
varplaneMaterial=newTHREE.MeshStandardMaterial({color:0xaaaaaa});

varplane=newTHREE.Mesh(planeGeometry,planeMaterial);
plane.rotation.x=-0.5*Math.PI;
plane.position.y=-0;

//告诉底部平面需要接收阴影
plane.receiveShadow=true;

scene.add(plane);

}

//初始化性能插件
varstats;
functioninitStats(){
stats=newStats();
document.body.appendChild(stats.dom);
}

//用户交互插件鼠标左键按住旋转,右键按住平移,滚轮缩放
varcontrols;
functioninitControls(){

controls=newTHREE.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;
}

functionrender(){
renderer.render(scene,camera);
}

//窗口变动触发的函数
functiononWindowResize(){

camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectionMatrix();
render();
renderer.setSize(window.innerWidth,window.innerHeight);

}

functionanimate(){
//更新控制器
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);
}

functiondraw(){
initGui();
initRender();
initScene();
initCamera();
initLight();
initModel();
initControls();
initStats();

animate();
window.onresize=onWindowResize;
}
</script>
</html>

感谢各位的阅读!关于“Three.js利用dat.GUI简化试验流程的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

收藏
分享
海报
0 条评论
180
上一篇:html除br外怎么换行 下一篇:jquery uploadify怎么取消已上传成功文件

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码