three.js 是一款WebGL框架,WebGL可让咱们在canvas上实现3D效果。
实现3D效果在国内来讲还算是比较新的东西,可供查阅的资料也很少。
这篇文章仅是一个入门篇,介绍如何绘制一个3D正方体。
介绍完毕,首先奉上实现的效果图:javascript
这就是实现的效果图,仍是挺有立体感的吧?html
写代码前,要先下载最新的three.js框架包,引入本身的页面。java
这个画布是咱们展示整个3D正方形的画布,也就是上图那个黑色的方框。canvas
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Camera 相机</title> <style> #canvas { width: 400px; height: 300px; border: 1px solid red; margin: 50px auto; display:block; } </style> </head> <body> <canvas id="canvas"></canvas> <script src="./libs/three.min.js"></script> </body> </html>
接下来的绘制过程会涉及到多个概念:canvas、scene、camera、renderer。
为了能更好理解绘制过程的代码和有助于记忆,咱们先来理解这几个概念:
假设咱们如今正在旅游的途中,看到了一个很惟美的画面,想把这个3D世界记录下来框架
这个惟美的场景就是scene,咱们用相机camera拍摄下来造成照片优化
为了能看清楚这个照片,咱们把这个照片放置在一个画布canvas上ui
最后,咱们再用renderer修饰渲染一下spa
这样,咱们就能成功展示这个3D世界了。
【程序仍是很贴近生活哒?】
经过现实世界的理解,咱们接下来开始代码啦o( ̄▽ ̄)ブcode
<script> var camera, scene, renderer, canvas; init(); function init () { canvas = document.getElementById('canvas'); }
接下来咱们要作的就是完善这个init()方法啦。
建立一个3D场景scene
场景最简单了,只须要用Scene声明一个scene对象。htm
scene = new THREE.Scene();
准备好camera
咱们这里设置的相机是一个透视的相机PerspectiveCamera
camera有四个参数
第一个参数是视线辐射的角度,这个参数越大,咱们能看到的视觉越广,这个物体看上去会更小。
第二个参数是图像内容展现的比例:width/height。咱们通常把这个比例设置为和画布的比例同样,这样看到的图片才不会变形。
第三四个参数分别是相机离展现内容(正方体)最近的距离和最远的距离。
camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);
接下来给camera设置摆放的位置,并把camera放到场景scene中
因为咱们的世界是3D的,camera的摆放位置也是三维的,涉及三个参数:X轴、Y轴、Z轴。(0, 0, 0)是相机的原点,(1, 1, 5)就是把咱们的相机往右和往上移动了1个单位,日后移动了5个单位。
ps: 这个时候画布canvas的大小正好是正方体的5倍。
camera.position.set(1, 1, 5); scene.add(camera);
在场景中添加一个立方体
每一个形状都是一个mesh,geometry能够理解为物体的骨骼, material能够理解为物体的皮囊
再建立一个可填充的形状cube
这样就构成了完整的实物
咱们再将这个形状放入场景scene中
CubeGeometry参数设置为1:1:1表示这是一个正方体,固然能够自行修改比例,变成不同的立方体
var geometry = new THREE.CubeGeometry(1, 1, 1); // 添加three自带的最简单的一种材质 var material = new THREE.MeshBasicMaterial({ color: 0xff0000, }); var cube = new THREE.Mesh(geometry, material); var cube = new THREE.Mesh(geometry, material);
最后,建立renderer对图像进行渲染
将canvas交给renderer,也就是一个渲染的容器
antialias: true 平滑,抗锯齿,输出的画面会进行优化,不会带毛边
renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: true }); // 设置renderer的样式 renderer.setSize(canvas.width, canvas.height); renderer.render(scene, camera);
通过以上步骤,咱们的的正方体就成功建立好了。
如下是本例完整代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Camera 相机</title> <style> #canvas { width: 400px; height: 300px; border: 1px solid red; margin: 50px auto; display:block; } </style> </head> <body> <canvas id="canvas"></canvas> <script src="./libs/three.min.js"></script> <script> var camera, scene, renderer, canvas; init(); function init () { canvas = document.getElementById('canvas'); scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10); camera.position.set(1, 1, 5); scene.add(camera); var geometry = new THREE.CubeGeometry(1, 1, 1); var material = new THREE.MeshBasicMaterial({ color: 0xff0000, }); // cube 是一个能够填充的形状 var cube = new THREE.Mesh(geometry, material); scene.add(cube); renderer = new THREE.WebGLRenderer({ // 将canvas交给renderer 一个渲染的容器 canvas: canvas, // 平滑, 抗锯齿 输出的画面会进行优化,不会带毛边 antialias: true }); // 设置renderer的样子 renderer.setSize(canvas.width, canvas.height); renderer.render(scene, camera); } </script> </body> </html>