初学Three.js,从方块开始

我们每个人都生活在3D的世界中,一个人,一张桌子,或者是一本书,他们都是三维空间中的对象,因为我们看得见,摸得着,所以我们能感受到到它们的存在。在three.js中,三维世界的表示方法跟我们所见到非常类似。它的核心概念只有几个:Scene、Camera、Mesh、Material、Light。这些概念跟我们现实世界是出奇的相似。Scene对应我们所处的场景、Camera对应我们的眼睛、Mesh对应物体的形状、Material对应物体表面的颜色或者材质、Light则对应我们现实世界的光源。

随着H5的普及,浏览器性能的提升,电脑硬件配置的提升,以及大火的VR、AR,了解threejs对于一个前端程序员来说是很有必要的,因为,指不准哪天2D的网页就退出历史舞台了。接下来,我就以官网的入门实例开始,从一个方块开始学习。

一、创建html文件,引入three.js

随便找个文件夹,创建一个index.html,在文件中引入three.js库即可。我这里是通过npm安装的three.js,所以路径在node_modules下。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Getting Started</title>
    <style>
        body { margin: 0; }
        canvas { width: 100%; height: 100% }
    </style>
</head>
<body>
<script src="../node_modules/three/build/three.js"></script>
<script>
// our code 
</script>
</body>
</html>

二、创建一个场景Scene

在threejs中,场景的创建只有一个方法,如下:

var scene = new THREE.Scene();

三、创建一个相机Camera

var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
camera.position.z = 100;

threejs中的相机有好几个,这里选择透视相机PerspectiveCamera,参数请参看文档。

创建完成之后还需要调整相机的位置,这里是将相机的z轴设置为100。

四、创建渲染器renderer

var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

渲染器的作用是将相机捕捉到的画面绘制到指定的dom元素上,实质都是canvas元素,只是有WebGL和Canvas绘图环境的差别。

五、创建图形,并添加至场景

var geometry = new THREE.BoxGeometry( 10, 10, 20 );
//wireframe表示带网格的方块
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00,wireframe:true} );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

上面这段代码初始化了网格Mesh以及材质Material,使得我们的方块有颜色。

六、循环渲染

var animate = function () {
    requestAnimationFrame( animate );
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
    renderer.render(scene, camera);
};
animate();

上面代码使用requestAnimationFrame函数形成了一个循环渲染。渲染间隔是根据浏览器的刷新频率决定的,一般都是1/60秒,即帧率60,每次渲染都会将方块进行旋转。

所以最后渲染出来的效果就是这样的啦。

three.gif

最后,附上完整代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Getting Started</title>
    <style>
        body { margin: 0; }
        canvas { width: 100%; height: 100% }
    </style>
</head>
<body>


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

<script>
    // 初始化场景、相机、渲染器
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
    // 调整相机的位置
    camera.position.z = 100;

    var renderer = new THREE.WebGLRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );
    document.body.appendChild( renderer.domElement );

    // 初始化方块
    var geometry = new THREE.BoxGeometry( 10, 10, 20 );
    var material = new THREE.MeshBasicMaterial( { color: 0x00ff00,wireframe:true} );
    var cube = new THREE.Mesh( geometry, material );
    scene.add( cube );

    var animate = function () {
        requestAnimationFrame( animate );
        cube.rotation.x += 0.01;
        cube.rotation.y += 0.01;
        renderer.render(scene, camera);
    };

    animate();
</script>
</body>
</html>


打赏作者

发表评论

电子邮件地址不会被公开。 必填项已用*标注