Three.JS学习 7:使用Canvas画一个时钟

本章节不是Three.JS内容,而是Canvas内容
本文学习资源来自:
http://www.dhtmlgoodies.com/tutorials/canvas-clock/

在canvas上画时钟

准备工作

取一张钟表的背景图过来,放在images/ 文件夹下
这里写图片描述

准备canvas

<html>
<head>
   <title>Canvas Clock</title>
</head>
<body> 
   <canvas id="myCanvas" width="400" height="400">
    Your browser does not support canvas
  </canvas> 
<script>
</script>
</body>
</html>

注意这里的canvas的宽、高定义没有使用css的内联属性定义,因为css属性工作不是太好,可能会导致变形。

画钟表面

<html>
<head>
<title>Canvas Clock</title>
</head>
<body>
<canvas id="myCanvas" width="400" height="400">
  Your browser does not support canvas
</canvas>
<script>
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    var clockImage = new Image();
    var clockImageLoaded = false;
    clockImage.onload = function () {
        clockImageLoaded = true;
    }
    clockImage.src = 'images/clock.jpg';

    function addBackgroundImage() {
        context.drawImage(clockImage, 0, 0, canvas.width, canvas.height);
    }

    function drawHourHand() {

    }

    function drawMinuteHand() {

    }

    function drawSecondHand() {

    }

    function writeBrandName() {

    }

    function createClock() {
        addBackgroundImage();
    }

    function clockApp() {
        if (!clockImageLoaded) {
            setTimeout('clockApp()', 100);
            return;
        }
        createClock();
    }

    clockApp();

</script>
</body>
</html>  

移动中心点

<html>
<head>
<title>Canvas Clock</title>
</head>
<body>
<canvas id="myCanvas" width="400" height="400">
  Your browser does not support canvas
</canvas>
<script>
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    var clockImage = new Image();
    var clockImageLoaded = false;
    clockImage.onload = function () {
        clockImageLoaded = true;
    }
    clockImage.src = 'images/clock.jpg';

    function addBackgroundImage() {
        //画图,中心点移到了canvas当中,所以画图开始位置变成了-200、-200
        context.drawImage(clockImage, canvas.width/2* -1, canvas.height/2 * -1, canvas.width, canvas.height);
    }

    function drawHourHand() {

    }

    function drawMinuteHand() {

    }

    function drawSecondHand() {

    }

    function writeBrandName() {

    }

    function createClock() {
        addBackgroundImage();
    }

    function clockApp() {
        if (!clockImageLoaded) {
            setTimeout('clockApp()', 100);
            return;
        }
        //把旋转中心放到canvas的当中
        context.translate(canvas.width / 2, canvas.height / 2);
        createClock();
    }

    clockApp();

</script>
</body>
</html>  

画表针

    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    var clockImage = new Image();
    var clockImageLoaded = false;
    clockImage.onload = function () {
        clockImageLoaded = true;
    }
    clockImage.src = 'images/clock.jpg';

    function addBackgroundImage() {
        //画图,中心点移到了canvas当中,所以画图开始位置变成了-200、-200
        context.drawImage(clockImage, canvas.width/2* -1, canvas.height/2 * -1, canvas.width, canvas.height);
    }

    function drawHourHand(theDate) {

    }

    function drawMinuteHand(theDate) {

    }

    function drawSecondHand(theDate) {
        var seconds = theDate.getSeconds();

        context.fillStyle = 'red';

        drawHand(150);
    }
    //size是表针的长度
    function drawHand(size) {
        context.beginPath();
        context.moveTo(0, 0); // center
        context.lineTo(-4, -10);
        context.lineTo(0, size * -1);
        context.lineTo(4, -10);
        context.lineTo(0, 0);
        context.fill();
    }
    function writeBrandName() {

    }

    function createClock() {
        addBackgroundImage();

        var theDate = new Date();

        drawHourHand(theDate);
        drawMinuteHand(theDate);
        drawSecondHand(theDate);
    }

    function clockApp() {
        if (!clockImageLoaded) {
            setTimeout('clockApp()', 100);
            return;
        }
        //把旋转中心放到canvas的当中
        context.translate(canvas.width / 2, canvas.height / 2);
        createClock();
    }

    clockApp();

旋转

秒针目前是向上的。现在需要旋转canvas以和得到正确的角度。一会会使用context.rotate()函数,它的参数是弧度。公式是:

function degreesToRadians(degrees){
     return (Math.PI/180)*degrees;
}

一周是360度,所以秒针转到的角度值是seconds*6,修改drawSecondHand:

function drawSecondHand(theDate){
   context.save();

   context.fillStyle = 'red';

   var seconds = theDate.getSeconds();
   context.rotate( degreesToRadians(seconds * 6));

   drawHand(150);

   context.restore(); //旋转后再恢复context状态
}

现在的代码如下:

<html>
<head>
<title>Canvas Clock</title>
</head>
<body>
<canvas id="myCanvas" width="400" height="400">
  Your browser does not support canvas
</canvas>
<script>
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    var clockImage = new Image();
    var clockImageLoaded = false;
    clockImage.onload = function () {
        clockImageLoaded = true;
    }
    clockImage.src = 'images/clock.jpg';

    function addBackgroundImage() {
        //画图,中心点移到了canvas当中,所以画图开始位置变成了-200、-200
        context.drawImage(clockImage, canvas.width/2* -1, canvas.height/2 * -1, canvas.width, canvas.height);
    }

    function drawHourHand(theDate) {

    }

    function drawMinuteHand(theDate) {

    }

    function drawSecondHand(theDate) {
        context.save();

        context.fillStyle = 'red';

        var seconds = theDate.getSeconds();
        context.rotate(degreesToRadians(seconds * 6));

        drawHand(150);

        context.restore();
    }
    function drawHand(size) {
        context.beginPath();
        context.moveTo(0, 0); // center
        context.lineTo(-4, -10);
        context.lineTo(0, size * -1);
        context.lineTo(4, -10);
        context.lineTo(0, 0);
        context.fill();
    }
    function writeBrandName() {

    }

    function createClock() {
        addBackgroundImage();

        var theDate = new Date();

        drawHourHand(theDate);
        drawMinuteHand(theDate);
        drawSecondHand(theDate);
    }

    function clockApp() {
        if (!clockImageLoaded) {
            setTimeout('clockApp()', 100);
            return;
        }
        //把旋转中心放到canvas的当中
        context.translate(canvas.width / 2, canvas.height / 2);
        setInterval('createClock()', 1000);
    }
    function degreesToRadians(degrees) {
        return (Math.PI / 180) * degrees;
    }

    clockApp();

</script>
</body>
</html>  

可以看到秒针已经动起来了。

加上分针与时针

<html>
<head>
<title>Canvas Clock</title>
</head>
<body>
<canvas id="myCanvas" width="400" height="400">
  Your browser does not support canvas
</canvas>
<script>
    var canvas = document.getElementById('myCanvas');
    var context = canvas.getContext('2d');

    var clockImage = new Image();
    var clockImageLoaded = false;
    clockImage.onload = function () {
        clockImageLoaded = true;
    }
    clockImage.src = 'images/clock.jpg';

    function addBackgroundImage() {
        //画图,中心点移到了canvas当中,所以画图开始位置变成了-200、-200
        context.drawImage(clockImage, canvas.width/2* -1, canvas.height/2 * -1, canvas.width, canvas.height);
    }

    function drawHourHand(theDate) {
        var hours = theDate.getHours() + theDate.getMinutes() / 60;
        var degrees = (hours * 360 / 12) % 360;

        context.save();
        context.fillStyle = 'black';

        context.rotate(degreesToRadians(degrees));

        drawHand(110, 7);

        context.restore();
    }

    function drawMinuteHand(theDate) {
        var minutes = theDate.getMinutes() + theDate.getSeconds() / 60;

        context.save();
        context.fillStyle = 'black';

        context.rotate(degreesToRadians(minutes * 6));

        drawHand(130);

        context.restore();
    }

    function drawSecondHand(theDate) {
        context.save();

        context.fillStyle = 'red';

        var seconds = theDate.getSeconds();
        context.rotate(degreesToRadians(seconds * 6));

        drawHand(150);

        context.restore();
    }
    function drawHand(size, thickness) {
        thickness = thickness || 4;

        context.beginPath();
        context.moveTo(0, 0); // center
        context.lineTo(thickness * -1, -10);
        context.lineTo(0, size * -1);
        context.lineTo(thickness, -10);
        context.lineTo(0, 0);
        context.fill();
    }
    function writeBrandName() {

    }

    function createClock() {
        addBackgroundImage();

        var theDate = new Date();

        drawHourHand(theDate);
        drawMinuteHand(theDate);
        drawSecondHand(theDate);
    }

    function clockApp() {
        if (!clockImageLoaded) {
            setTimeout('clockApp()', 100);
            return;
        }
        //把旋转中心放到canvas的当中
        context.translate(canvas.width / 2, canvas.height / 2);
        setInterval('createClock()', 1000);
    }
    function degreesToRadians(degrees) {
        return (Math.PI / 180) * degrees;
    }

    clockApp();

</script>
</body>
</html>  

效果:
这里写图片描述

下面还有一些画品牌等代码暂略…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了增加three.js加载进度条,我们需要进行以下步骤: 1. 创建一个HTML元素来显示加载进度条。可以使用HTML5的canvas元素来制作进度条,也可以使用其他的库,如ProgressBar.js等。 2. 使用THREE.LoadingManager来加载模型文件。这个类可以用来跟踪加载的资源的进度,并在所有资源加载完成后调用回调函数。 3. 给THREE.ObjectLoader添加一个onProgress回调函数,在加载每个文件时更新进度条。 下面是修改后的代码示例: ``` const scene = new THREE.Scene(); const sceneData1 = new THREE.Object3D(); // 创建一个LoadingManager对象 const loadingManager = new THREE.LoadingManager(); // 创建一个HTML元素来显示进度条 const progressBar = document.createElement('canvas'); progressBar.width = 200; progressBar.height = 20; document.body.appendChild(progressBar); // 使用ObjectLoader加载模型 const loader = new THREE.ObjectLoader(loadingManager); loader.load('model.json', function (obj) { scene.add(obj); }); // 添加一个onProgress回调函数来更新进度条 loadingManager.onProgress = function (url, itemsLoaded, itemsTotal) { const ctx = progressBar.getContext('2d'); const progress = itemsLoaded / itemsTotal; ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, progressBar.width * progress, progressBar.height); }; ``` 在上面的代码中,我们首先创建了一个THREE.LoadingManager对象和一个HTML canvas元素来显示进度条。然后,我们使用THREE.ObjectLoader加载模型文件,并添加一个onProgress回调函数来更新进度条。最后,我们将模型添加到场景中。 注意:上面的示例中使用的是THREE.ObjectLoader来加载模型文件,如果需要加载其他类型的资源文件,如纹理、音频等,可以使用相应的加载器,并在THREE.LoadingManager对象中注册相应的加载器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值