美文网首页
落地成盒?前端必收藏的干货:threeeJs插件Gui添加盒子功

落地成盒?前端必收藏的干货:threeeJs插件Gui添加盒子功

作者: 源码时代官方 | 来源:发表于2020-12-15 17:10 被阅读0次

各位宝宝们, 时隔这么久, 终于又要继续我们的threeJs教程啦! 我们这次还是学习我们threejs插件Gui。 在之前教程中, 我们学习了Gui 的基本使用, 这节课我们学习使用Gui插件添加盒子功能。

在之前的课程里,我们通过Gui插件控制了我们threeJs盒子元素的旋转速度以及球体元素的跳跃速度。主要是通过Gui设置运动的速度变值,在渲染的时候将Gui控制的速度值添加给我们的元素。在本节课我们要用一个新的界面添加我们的Gui插件功能。

首先, 我们还是把基本的内容渲染出来,大家可以跟着我的节奏把基本内容先书写出来,

  • 引入我们需要的threeJs文件

<script src="./js/three.js"></script>

<!-- 浏览器控制台插件 -->

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

<!-- 检测性能插件 -->

<script src="./js/stats.min.js"></script>
  • 设置界面样式

<style>

    body{

        margin: 0;

        padding: 0;

        overflow: hidden;

    }

</style>
  • 设置控制台容器和插件容器
<div id="Stats-output"></div>

<!-- 场景画面 -->

<div id="WebGL-output">
  • 设置我们threeJs的基本内容:场景、摄像头、渲染器、平面, 并添加到容器中

//场景

  var scene = new THREE.Scene();

  //摄像头

  var camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);

  scene.add(camera)

  camera.position.x = -30;

  camera.position.y = 40;

  camera.position.z = 30;

  camera.lookAt(scene.position);

  //渲染器

  var renderer = new THREE.WebGLRenderer();

      renderer.setClearColor(0xeeeeee);

      renderer.setSize(window.innerWidth,window.innerHeight);

      renderer.shadowMap.enabled = true;

  //设置平面

  var planeGeometry = new THREE.PlaneGeometry(60,40,1,1);

  var planeMaterial = new THREE.MeshLambertMaterial({color:0xffffff});

  var plane = new THREE.Mesh(planeGeometry,planeMaterial);

      plane.receiveShadow = true;

  plane.rotation.x = -0.5 * Math.PI;

      plane.position.x = 0;

      plane.position.y = 0;

      plane.position.z = 0;

scene.add(plane);

//增加光源

   var spotLight = new THREE.SpotLight(0xffffff);

       spotLight.position.set(-40, 60, -10);

       spotLight.castShadow = true;

       //设置阴影分辨率

       spotLight.shadow.mapSize.width = 3000;

       spotLight.shadow.mapSize.height = 3000;  

       scene.add(spotLight);

//增加渲染器到html容器中

document.getElementById("WebGL-output").appendChild(renderer.domElement);

//渲染器渲染场景和摄像头

renderer.render(scene,camera)

实现的效果是这样的

image

然后我们可以来通过Gui来设置一些功能,首先是在视图中插入Gui插件

//在视图中插入Gui插件

var gui = new dat.GUI();

设置Gui插件的控制器

//设置Gui的控制器

var controls = new function(){

}

在这个controls中我们可以设置一些自己想要的功能, 我们以添加盒子和删除盒子为例,

添加盒子

我们要先在Gui 的controls中设置某一个功能

//设置Gui的控制器

var controls = new function(){

      //添加元素

       this.addCube = function(){

        //设置盒子随机尺寸

         var cubeSize = Math.ceil((Math.random()*3));

           //设置盒子模型

           var cubeGeometry = new THREE.BoxGeometry(cubeSize,cubeSize,cubeSize);

           //设置盒子随机颜色

           var cubeMaterial = new THREE.MeshLambertMaterial({color:Math.random()* 0xffffff});

           //创建盒子模型以及颜色

           var cube = new THREE.Mesh(cubeGeometry,cubeMaterial);

           // 盒子接收阴影

           cube.castShadow = true;

           // 盒子名称

           cube.name = "cube" + scene.children.length;

           //生成盒子模型的随机位置

           cube.position.x = -30 + Math.round((Math.random()* planeGeometry.parameters.width));

           cube.position.y = Math.round((Math.random()* 5));

            cube.position.z = -20 + Math.round((Math.random()* planeGeometry.parameters.height));

//视图中添加cube

            scene.add(cube);

        }

    }

然后我们需要在Gui插件中插入这个controls

gui.add(controls,'addCube');

然后需要我们渲染在页面中, 这里需要注意一下, 渲染是使用的我们的renderer.render(scene, camera), 但是这个并不能实现我们的效果, 我们在添加新的元素之后, 需要重新渲染我们的界面, 所有需要使用到requestAnimationFrame( )函数

大家还记得这个函数是做什么用的吗??? 这个函数可以启动我们的渲染循环, 无论是元素添加还是删除, 还是元素运动都要用到requestAnimationFrame( )函数

所以最后, 我们要把之前写的渲染进行一个修改

//渲染器渲染场景和摄像头

renderer.render(scene,camera)

改为

function render(){

       requestAnimationFrame(render)

       renderer.render(scene,camera)

}

render()

就可以实现我们点击addCube添加元素的效果了

image

相关文章

  • 落地成盒?前端必收藏的干货:threeeJs插件Gui添加盒子功

    各位宝宝们, 时隔这么久, 终于又要继续我们的threeJs教程啦! 我们这次还是学习我们threejs插件Gui...

  • 落地成盒

    大吉大利,晚上吃鸡。 想多了… 又是落地成盒 而且 还是两把 我也算是落地成盒 一个人在异国他乡,因为一些原因来到...

  • 落地成盒

    7月20 我们天各一方 各奔东西 如烟火般绽放 光芒四射 在这片大地

  • 落地成盒

    蟹蟹大家,我会努力写作的。

  • 落地成盒

    刚从飞机降落到海面上,就看见一群萌萌的小伙。不知道怎么的,他们好像在挤墙(๑• . •๑),观察了一会...

  • 落地成盒

    这两天看了这么一个新闻,有个加拿大的顶级狙击手瓦力去乌克兰参加战斗去了,没想到去了阵地20分钟就被俄罗斯部队给...

  • 刺激战场新手注意这五个细节吃鸡就是这么简单

    1、落地捡枪 落地先找到枪 好多新手玩家都告诉我,“自从上了黄金之后就很难吃到鸡了,基本上落地成盒”,相必好多玩家...

  • 刺激战场令玩家最无语的瞬间外挂只是其中之一

    刺激战场令人崩溃的四个瞬间,1.落地成盒:这就让人很苦恼了,一落地就变成盒子了,简直让人崩溃啊,一万句MMP不知道...

  • 评《风雨欲来》1

    落地被俘这个词语让我想到了落地成盒。开个玩笑,哪有主角一落地就成盒的。 开头主角王明和女友去玩攀岩,意外发生坠落遭...

  • 前端问题总结(二)

    前端知识汇总 盒子模型 2种:IE盒子模型 W3C标准盒子模型 盒模型:内容、内边距、外边距、边框 为什么要初始化...

网友评论

      本文标题:落地成盒?前端必收藏的干货:threeeJs插件Gui添加盒子功

      本文链接:https://www.haomeiwen.com/subject/xpvwgktx.html