Three.js试玩

玩什么

前几天我才知道,以前在网上看到的酷炫HTML5制作的3D效果,其实是WebGL的功劳。HTML5的Canvas元素作为DOM接口,就可以利用WebGL做出酷炫效果了。有一个非常著名的Water WebGL Demo,实现了一个球在水中的场景,并可以通过鼠标移动这个球,水波进行实时渲染。
demo

但是我觉得这个对新手来说难度太高了吧,不如找个简单一些的,看能不能上手玩一玩,于是我找到了这个。

demo

这个看起来也很有趣,感兴趣的话可以点开demo看看。

怎么玩

那么问题来了,怎么玩?

作为初级玩家,当然是从简单的开始咯。先稍微看一下WebGL教程…再读一下threejs入门指南…再欣赏一下threejs官网给出的样例。然后就可以做出这个简单的方块动画…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>
<head>
<title>My first cube</title>
<meta charset="utf-8">
</head>
<body>
<script src="http://cdn.bootcss.com/three.js/r71/three.min.js"></script>
<script>
var scene = new THREE.Scene(); //场景
var camera = new THREE.PerspectiveCamera(50, 300/300, 1, 50); //照相机
camera.position.set(0, 0, 5);
scene.add(camera);
var light = new THREE.AmbientLight(0xffffff); //灯光
scene.add(light);

var geometry = new THREE.BoxGeometry(1,2,3); //几何体
var material = new THREE.MeshBasicMaterial({color: 0xff0000}); //材质
var cube = new THREE.Mesh(geometry, material); //Meshify
scene.add(cube);

var renderer = new THREE.WebGLRenderer(); //渲染器
renderer.setSize(300, 300);
document.body.appendChild(renderer.domElement); //添加Canvas到HTML


function draw() {
cube.rotation.x = (cube.rotation.x + 0.1) % (Math.PI * 2); // X方向旋转
cube.rotation.y = (cube.rotation.y + 0.05) % (Math.PI * 2); // Y方向旋转
renderer.render(scene, camera); // rendering
requestAnimationFrame(draw); // callback
}
draw();
</script>

</body>
</html>

注意,如果你要引用本地的js文件,由于chrome的某些安全机制,不支持本地ajax访问,需要在打开目标后加上参数,改为

1
"...\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

见证小cube的诞生~
demo

这个代码比较简单,可以自己来改改参数玩玩看。比如几何体的长宽高,变成立方体:BoxGeometry(2,2,2)

3D建模

就弄个方块,有意思吗,没意思。

自己搞一个得了。threejs提供其他3D建模软件生成json格式数据所需的插件。这里我选择blender来建模,反正我都没用过,这个似乎是比较轻量级的。基础的操作学习可以到b站看一个系列视频:台湾大神的blender教程全集

我就做一个reactjs的图标吧。

限于篇幅,具体步骤我就不详细说了。首先来创建一个circle mesh。

经过一些延拓和删减,可以得到这么一个椭圆环。

在椭圆环上添加一个modifier,对表面进行平滑。

然后给表面添加材料属性,颜色、反光度、硬度等等,再把表面的shading渲染模式由flat改为smooth,基本的一个环就出来啦。

中间的圆在做的时候,为了使模型过渡更平滑,通过loop cut and slide添加一个环边,再push transform进行调整。

最后把环复制两个,分别rotate不同的角度。选中所有part,join起来,就得到最终的model了。必须要join,否则export的时候只能得到其中某一个part了。

动画实现

· 光线使用点光源
· 打开反锯齿和背景透明
· 绑定mouseenter事件,改变模型的scale和rotation实现动画,和上面给出来HTML5图标的例子类似


demo