今天我们利用 canvas
和 threejs
基础知识来做一个可以旋转的 3D 时钟动效。效果如下:
threejs
基础概念大家需要提前了解一下。
一、制作时钟
1、基础变量定义
1 | var requestAnimationFrame = requestAnimationFrame || webkitRequestAnimationFrame || oRequestAnimationFrame || msRequestAnimationFrame |
2、画时钟边框
1 | // 定义一个从上到下的漂亮颜色渐变 |
3、画分针刻度
1 | ctx.beginPath() |
4、画时针刻度
1 | ctx.beginPath() |
5、画时间点
1 | ctx.beginPath() |
6、画时针
1 | ctx.beginPath() |
7、画分针
1 | ctx.beginPath() |
8、画秒针
1 | ctx.beginPath() |
9、画时钟圆心
1 | ctx.beginPath() |
二、添加动画
这里需要大家提前查阅资料了解 渲染器
场景
相机
模型
几何体
材料
纹理
几个名词的概念。
附上我简单鄙陋的理解:渲染器可以将场景渲染出来。场景由模型构建。相机有透视相机和正交相机之分,在不同角度不同相机的照射下场景会展示出不同的效果。模型由几何体组成。几何体由材料填充。材料由纹理修饰,纹理可以是图片,也可以是画布。
js 代码如下: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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53// 定义变量:渲染器 场景 相机 模型 几何体 材料 纹理
var renderer, scene, camera, mesh, geometry, material, texture
// 页面入口函数
function start () {
// 定义时钟
clock()
// 定义 3D 场景
init()
// 定义动画
animate()
}
function init () {
// 创建渲染对象
renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
// 创建透视相机
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000)
camera.position.z = 600
// 创建场景对象
scene = new THREE.Scene()
// 创建几何体对象
var geometry = new THREE.CubeGeometry(200, 200, 200)
// 创建纹理(即时钟)
texture = new THREE.Texture(canvas)
// 将纹理传递给材质
material = new THREE.MeshBasicMaterial({ map: texture })
texture.needsUpdate = true
// 创建模型
mesh = new THREE.Mesh(geometry, material)
// 将模型添加到场景
scene.add(mesh)
renderer.clear()
// 场景渲染
renderer.render(scene, camera)
}
function animate () {
texture.needsUpdate = true
mesh.rotation.y -= 0.01
mesh.rotation.x -= 0.01
requestAnimationFrame(animate)
renderer.clear()
renderer.render(scene, camera)
}
// 起始函数调用
start()
function resize () {
camera.aspect = window.innerWidth / window.innerHeight
camera.updateProjectionMatrix()
renderer.setSize(window.innerWidth, window.innerHeight)
}
window.addEventListener('resize', resize)
终于大功告成!