标签: three.jshtml
本节目标是为 three.js 作简介。咱们从使用旋转立方体来搭建场景开始。若是遇到困难须要帮助,页面底部有可参考的源码。编程
在计算机中保存以下 HTML 代码,并在 js 目录下包含 three.js,而后在浏览器中打开canvas
<html> <head> <meta charset=utf-8> <title>My first three.js app</title> <style> body { margin: 0; } canvas { width: 100%; height: 100% } </style> </head> <body> <script src="js/three.js"></script> <script> // Our Javascript will go here. </script> </body> </html>
接下来的代码都会下载 script 标签中浏览器
为了利用three.js来进行展现,咱们须要三种元素:场景,摄像机,渲染器,以便来渲染摄像机中的场景。app
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement );
让咱们花点时间来解释发生了什么。咱们如今建立了场景,摄像机和渲染器。dom
在 three.js 中有几种摄像机。咱们暂时用的是 PerspectiveCamera (透视摄像机)函数
它的第一个属性是视图角(FOV),它 是能看见的视图范围,其值表示角度大小。性能
第二个属性是宽高比。大多数状况你想要使用被高除过以后的宽度,否则会发生像在宽屏电视上放旧电影的状况 —— 图像看起来被压扁了。动画
后面两个属性是近景面和远景面。只会渲染这两个面之间的区域。目前你没必要关心这些,使用这些参数能提升性能。code
接下来谈谈渲染器。这即是神奇之处。除了咱们这里用的 WebGLRenderer 外, three.js 还提供一些渲染器用在不支持 WebGL 的老旧浏览器上。
除了建立渲染器实例,咱们也须要设置应用渲染的尺寸。推荐使用填充整个应用的宽高 —— 本例中是浏览器窗口的宽高。对于性能优先的应用,你能使用 setSize 来设置更小的值,好比 window.innerHeight/2, window.innerWidth/2,会渲染一半的尺寸。
若是你想低分辨率地渲染整个尺寸,你能够设置 setSize 的第三个参数 — uodateStyle
为 <font color="#FF1493">false</font>,若是 canvas 元素宽高都为 100%,则会以 1/2 分辨率渲染应用。
再尔,咱们须要在 HTML 中添加被渲染的元素。渲染器经过 canvas 来给咱们展现场景。
“都很好,但以前说的立方体呢” 让咱们如今添加。
var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5;
咱们须要 BoxGeometry
来建立立方体。这个对象包含立方体全部的点(顶点)和填充(面)。咱们之后会讨论。
除了几何体外,咱们还须要材质为其上色。three.js 提供了一些材质,但咱们暂且使用 MeshBasicMaterial
。全部材质接受并应用一个包含全部属性的对象。为简单起见,咱们仅仅提供一个颜色属性: 绿色 —— <font color="#00ff00">0x00ff00</font>。和 CSS 和 PS 里的同样采用十六进制的颜色。
咱们须要的第三个要素是 Mesh。 mesh 是一个将材质应用到几何体上的对象,而后咱们能将其放入场景中,并自由移动。
当咱们调用 scene.add()
,咱们添加的会默认显示在坐标(0,0,0,)处。这会致使摄像机和立方体内部重叠。为了不这点,咱们简单地把摄像机往外移一点。
若是你在 HTML 文件中复制了如上代码,屏幕不会显示东西。由于咱们还没渲染场景。因此咱们须要调用渲染器或者动画循环。
function animate() { 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 应用。很简单,但总得突破。
完整代码参考以下。琢磨一下并深入理解其工做机理
<html> <head> <title>My first three.js app</title> <style> body { margin: 0; } canvas { width: 100%; height: 100% } </style> </head> <body> <script src="js/three.js"></script> <script> var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; var animate = function () { requestAnimationFrame( animate ); cube.rotation.x += 0.1; cube.rotation.y += 0.1; renderer.render(scene, camera); }; animate(); </script> </body> </html>