vlambda博客
学习文章列表

threejs指南1:一个旋转的立方体

创建场景


threejs展示的三要素:场景(scene),相机(camera)和呈现器(renderer)。最终通过相机来呈现场景。

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>My first three.js app</title> <style> body { margin: 0; } </style> </head> <body> <script src="js/three.js"></script> <script> // Our Javascript will go here. </script> </body></html>


然后我们在脚本区域加入如下代码:

const scene = new THREE.Scene();const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );const renderer = new THREE.WebGLRenderer();renderer.setSize( window.innerWidth, window.innerHeight );document.body.appendChild( renderer.domElement );

threejs提供了多种camera,我们先使用PerspectiveCamera,第一个参数是视图区域(field of view,FOV),表明展示的景宽。

第二个参数是纵横比(aspect ratio)展示区域的宽高比。

第三个和第四个参数分别是最小和最大可视距离,表面展示物体与相机的距离在此范围才是可视的。

神奇将在renderer发生。目前我们使用WebGLRenderer。

使用呈现区域的宽和高来设定呈现器尺寸比较好。此例中呈现区域占满整个浏览器窗口。可以使用setSize设定尺寸。

然后把呈现器元素(canvas)添加到网页元素。


场景有了,我们可以向场景中添加物体。先添加一个立方体:

const geometry = new THREE.BoxGeometry();const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );const cube = new THREE.Mesh( geometry, material );scene.add( cube );camera.position.z = 5;

为了添加一个立方体, 我们需要一个 BoxGeometry对象. 此对象包含了立方体所有的点 (vertices) 和面 (faces) 的信息。

再给立方体涂上颜色,Three.js提供了很多种材质(Material),我们先使用MeshBasicMaterial。我们先简单用一种颜色。

The third thing we need is a Mesh. A mesh is an object that takes a geometry, and applies a material to it, which we then can insert to our scene, and move freely around.

第三步,我们需要一个网格(Mesh)对象。此对象将材质附着到物体。

scene.add()默认将物体添加到 (0,0,0)坐标. 这会导致目前相机和立方体重叠。我们将相机移动一点,避免重叠。

呈现场景


创建好的场景还需要呈现才能展示出来。

function animate() { requestAnimationFrame( animate ); renderer.render( scene, camera );}animate();

requestAnimationFrame 创建一个循环,以展示当前场景。

让立方体动起来

上面的代码运行之后会展示一个静态的场景和物体,我们让立方体旋转起来。

在上面的animate函数中添加下面的语句:

cube.rotation.x += 0.01;cube.rotation.y += 0.01;

随着循环调用,立方体的坐标在变化,实现了立方体的旋转。

总结

很简单,我们完成了第一个程序,完整代码如下:


<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>My first three.js app</title> <style> body { margin: 0; } </style> </head> <body> <script src="js/three.js"></script> <script> const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); const renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); const cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5; function animate() { requestAnimationFrame( animate ); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render( scene, camera ); }; animate(); </script> </body></html>