设计地球和月球公转动画

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计地球和月球公转动画相关的知识,希望对你有一定的参考价值。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <canvas id="canvas" width="300" height="300"></canvas>
        <script>
            var sun = new Image();                      //创建Image对象
            var moon = new Image();
            var earth = new Image();
            sun.src = 'images/Canvas_sun.png';          //设置图像路径
            moon.src = 'images/Canvas_moon.png';
            earth.src = 'images/Canvas_earth.png';
            window.requestAnimationFrame(draw);         //告诉浏览器希望执行动画,并调用draw函数
            
            function draw(){
                var ctx = document.getElementById('canvas').getContext('2d');
                ctx.globalCompositeOperation = 'destination-over';  //原有内容覆盖在新图形之上(图形合成属性)
                ctx.clearRect(0,0,300,300);             //清空画布
                ctx.fillStyle = 'rgba(0,0,0,0.4)';      //设置图形的填充颜色和透明度
                ctx.strokeStyle = 'rgba(0,153,255,0.4)';//设置图形轮廓的颜色
                ctx.save();                             //保存当前画布的状态,将状态送入栈中(栈的特点:现进后出)
                ctx.translate(150,150);                 //移动坐标原点,dx=150,dy=150
                
                // Earth(1分钟公转一圈)
	            var time = new Date();
	            ctx.rotate( ((2*Math.PI)/60)*time.getSeconds() + ((2*Math.PI)/60000)*time.getMilliseconds() );
                //旋转canvas对象的坐标空间,getSeconds()用来获取当前秒数,getMilliseconds()用来获取当前毫秒数(0-999)
	            ctx.translate(105,0);          //移动坐标原点,dx=150,dy=0,始终保持坐标系原点离画布中心(也就是太阳中心)为105
	            ctx.fillRect(0,-12,50,24);     //绘制阴影
	            ctx.drawImage(earth,-12,-12);  //绘制地球
	
	            // Moon(1分钟公转一圈)
	            ctx.save();
	            ctx.rotate( ((2*Math.PI)/6)*time.getSeconds() + ((2*Math.PI)/6000)*time.getMilliseconds() );
	            ctx.translate(0,28.5);
	            ctx.drawImage(moon,-3.5,-3.5); //绘制月球
                ctx.restore();                 //之前save了两次所以要restore两次
                ctx.restore();
                
                ctx.beginPath();                        //开始生成路径
                ctx.arc(150,150,105,0,Math.PI*2,false); //描述地球公转轨道路径,原点(150,150),半径:105,顺时针绘制
                ctx.stroke();                           //开始沿路径绘制
                
                ctx.drawImage(sun,0,0,300,300);         //绘制太阳,图像左上顶点在画布中的位置:(0,0),要使用图像的宽度:300,高度:300
                
                window.requestAnimationFrame(draw);
            }
        </script>
    </body>
</html>

要用到的三张图片:
Canvas_sun.png(宽高都是300px)
在这里插入图片描述
Canvas_earth.png(宽高都是40px)
在这里插入图片描述
Canvas_moon.png(宽高都是7px)
在这里插入图片描述

以上是关于设计地球和月球公转动画的主要内容,如果未能解决你的问题,请参考以下文章

HTML5+CSS3+JavaScript目录

哪位大哥有FLUENT中三维既有自转又有公转的滑移网格或者动网格的例子,跪求!

中秋纯CSS实现日地月的公转

WPF太阳地球月球运动轨迹模拟

WPF太阳地球月球运动轨迹模拟

threejs绕轴转,粒子系统,控制器操作等