WebGL4---让场景动起来

          1、场景如何动起来?

                 有两种实现方式:1)让物体在坐标系里面移动,摄像机不动;2)让摄像机在坐标系里面移动,物体不动;

      

           2、循环渲染

                 如果我们改变了物体的位置或者颜色之类的属性,就必须重新调用render()函数,才能将新的场景绘制到

            浏览器中。否则浏览器不会自动刷新场景的;

                             renderer.render(scene,camera);

             关于循环渲染代码:

                            function animate(){

                                  render();

                                  requestAnimationFrame(animate);//调用requestAnimationFrame函数,传递一个callback函数,则在

                                                                                                下一个动画帧时,会调用callback;

                             }

           

              3、改变相机的位置,让物体移动

                   关键代码如下:

                           function animation(){

                                   camera.position.x = camera.position.x +1; //不断将相机的位置沿X轴移动1个单位。相机向右移动;

                                   renderer.render(scene,camera);

                                   requestAnimationFrame(animation);

                           }

 

                4、改变物体自身的位置

                 关键点: mesh.position.x - =1;//其中mesh是指物体

 

                 5、物体运动后,如何评估性能?

                 在3D的世界中,经常使用帧数的概念来评估性能;

                 帧数:图形处理器每秒钟能够刷新几次,通常使用fps(Frames Per Second)来表示;

                 5.1)性能监视器Stats

                          在Three.js中,性能由一个性能监视器来管理;其中,FPS表示上一秒的帧数,这个值越大越好,一般在60左右;

                 当点击图片后就显示另一个衡量指标:MS(渲染一帧需要的毫秒数,这个值越小越好);

                 5.2)性能监视器Stats的使用

                          在Three.js中,性能监视器被封装在一个类中,这个类叫做Stats,如下代码:

                  var stats = new Stats();

                  stats.setMode(1); //参数为0表示显示FPS界面,参数为1表示MS界面;

                   stats.domElement.style.position = "absolute";

                  stats.domElement.style.left = "0px";

                  stats.domElement.style.top = "0px";

                  document.body.appendChild(stats.domElement);//stats的domElement表示绘制的目的地(DOM)

                  setInterval(function(){

                        stats.start(); 

                        //你的每一帧代码

                        stats.end();

                  },1000/60);//关于Stats的begin和end函数本质上是在统计代码执行的时间和帧数,fps = 帧数/时间;该功能被封装在函数update

                                          只要在渲染循环中调用即可;

 

                 代码实例如下:

                 ① 在initThree函数中声明stats

                 stats = new Stats();

                 stats.domElement.style.position = "absolute";

                 stats.domElement.style.x = "0px";

                 stats.domElement.style.y = "0px";

                 document.getElementById('canvas-frame').appendChild(stats.domElement);

                 ② 在animation函数中加入update函数

                   stats.update();

 

                  6、使用动画引擎Tween.js来创建动画;

                        ①引入引擎文件  <script src="Tween.js"></script>

                        ② 构建一个Tween对象,对Tween进行初始化,

                            function initTween(){

                                  new TWEEN.Tween(mesh.position)//TWEEN.Tween的构造函数接受的是改变属性的对象;注意:Tween的任何一个函数返回都是自身;

                                                       .to({ x: -400},3000)//to函数,接受两个参数,第一个参数是集合,表示动画结束后需要移动到的位置;第二个参数,是完成动画需要的时间,这里是3000ms

                                                       .repeat(Infinity)//表示重复无穷次,也可以接受一个整数;

                                                       .start();//表示动画开始,默认情况下是匀速的将mesh.position.x移动到-400位置

                            }

                          ③ 在渲染函数中去不断更新Tween;(TWEEN.update())

posted @ 2019-02-20 16:14  倩妞驾到  阅读(242)  评论(0编辑  收藏  举报