three.js中文文档学习之创建场景
什么是Three.js?
如果你正在读这篇文章,你可能对Three.js有一定的了解,那我们来简单地介绍下Three.js是什么.
Three.js是一个库,使得WebGL的3D效果在浏览器中运用很容易。而在原始的WebGL中一个简单的立方体会变成数百Javascript和着色器代码的行,而一个Three.js只需要一点点代码.
本节目标是为three.js做简介。我们从使用旋转立方体来搭建场景开始。如果遇到困难需要帮助,页面底部有可参考的源码。
一个场景至少需要的三种类型组件
- 相机/决定哪些东西将在屏幕上渲染
- 光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响
- 物体/他们是在相机透视图里主要的渲染队形:方块、球体等
开始前
在计算机中保存如下HTML代码,并在js目录下包含three.js,然后在浏览器中打开
Myfirstthree.jsapp
接下来的代码都会下载script标签中
创建示例场景
为了利用three.js来进行展示,我们需要三种元素:场景,摄像机,渲染器,以便来渲染摄像机中的场景。
varscene=newTHREE.Scene(); varcamera=newTHREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000); varrenderer=newTHREE.WebGLRenderer(); renderer.setSize(window.innerWidth,window.innerHeight); document.body.appendChild(renderer.domElement);
让我们花点时间来解释发生了什么。我们现在创建了场景,摄像机和渲染器。
在three.js中有几种摄像机。我们暂时用的是PerspectiveCamera(透视摄像机)
它的第一个属性是视图角(FOV),它是能看见的视图范围,其值表示角度大小。
第二个属性是宽高比。大多数情况你想要使用被高除过之后的宽度,不然会发生像在宽屏电视上放旧电影的情况——图像看起来被压扁了。
后面两个属性是近景面和远景面。只会渲染这两个面之间的区域。目前你不必关心这些,使用这些参数能提高性能。
接下来谈谈渲染器。这便是神奇之处。除了我们这里用的WebGLRenderer外,three.js还提供一些渲染器用在不支持WebGL的老旧浏览器上。
除了创建渲染器实例,我们也需要设置应用渲染的尺寸。推荐使用填充整个应用的宽高——本例中是浏览器窗口的宽高。对于性能优先的应用,你能使用setSize来设置更小的值,比如window.innerHeight/2,window.innerWidth/2,会渲染一半的尺寸。
如果你想低分辨率地渲染整个尺寸,你可以设置setSize的第三个参数—uodateStyle为
再尔,我们需要在HTML中添加被渲染的元素。渲染器通过canvas来给我们展示场景。
“都很好,但之前说的立方体呢”让我们现在添加。
vargeometry=newTHREE.BoxGeometry(1,1,1); varmaterial=newTHREE.MeshBasicMaterial({color:0x00ff00}); varcube=newTHREE.Mesh(geometry,material); scene.add(cube); camera.position.z=5;
我们需要BoxGeometry来创建立方体。这个对象包含立方体所有的点(顶点)和填充(面)。我们以后会讨论。
除了几何体外,我们还需要材质为其上色。three.js提供了一些材质,但我们暂且使用MeshBasicMaterial。所有材质接受并应用一个包含所有属性的对象。为简单起见,我们仅仅提供一个颜色属性:绿色——
我们需要的第三个要素是Mesh。mesh是一个将材质应用到几何体上的对象,然后我们能将其放入场景中,并自由移动。
当我们调用scene.add(),我们添加的会默认显示在坐标(0,0,0,)处。这会导致摄像机和立方体内部重叠。为了避免这点,我们简单地把摄像机往外移一点。
渲染场景
如果你在HTML文件中复制了如上代码,屏幕不会显示东西。因为我们还没渲染场景。所以我们需要调用渲染器或者动画循环。
functionanimate(){ requestAnimationFrame(animate); renderer.render(scene,camera); } animate();
这会创建一个让渲染器每秒绘制一帧的循环。如果你对网页游戏编程不了解,你可能会说“为什么不写setInterval函数呢?”事实上,我们可以,但是requestAnimationFrame好处更多。最重要的好处是当浏览器切换到另一个标签页时,requestAnimationFrame会暂停渲染,因此不会浪费宝贵的处理能力和电池寿命。
让立方体动起来
如果你插入了我们刚刚创建的代码,你应该会看见一个绿色的立方体。让它旋转起来不至于单调。
在animate函数中的renderer.render上添加如下代码:
cube.rotation.x+=0.01; cube.rotation.y+=0.01;
它会按帧运行(每秒60帧),并赋予立方体优雅的动画。基本上,应用运行时,你想移动或改变任何元素,必须通过动画循环。你当然在此处能调用其他函数,以免animate函数上百行代码结尾。
结果
恭喜!你现在创建好了第一个three.js应用。很简单,但总得突破。
完整代码参考如下。琢磨一下并深刻理解其工作机理
Myfirstthree.jsapp
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。