canvas画布模拟生成3D舰队飞行效果
HTML5画布模拟生成3D的舰队飞行效果
这个代码将使用2D的绘制来模拟3D的飞行效果,使用3D坐标转换2D坐标,并且定时清除图形并且绘制非常图片生成最后效果
<!-- 画布元素 --> <canvas id="gbcanvas" width="600" height="300">不支持HTML5画布</canvas>
/*CSS样式*/ body { overflow: hidden; } canvas { width: 100%; height: 100%; }
/*画布JS*/ var fov = 100, //定义3D坐标转2D坐标比率 SCREEN_WIDTH = 600, SCREEN_HEIGHT = 300, HALF_WIDTH = SCREEN_WIDTH/2, HALF_HEIGHT = SCREEN_HEIGHT/2, numSpaceship = 100; //飞船图片 var anim_img = new Image(); anim_img.src = '03.png'; //获取画布上下文 var canvas = document.getElementById('gbcanvas'); var c = canvas.getContext('2d'); /* 绘制画布飞船图形方法,参数为3D坐标:数据格式为一个数组 */ function draw3Din2D(point3d){ x3d = point3d[0], y3d = point3d[1], z3d = point3d[2]; //定义缩放比率 var scale = fov/(fov+z3d); //获取对应2d画布中坐标 var x2d = (x3d*scale) + HALF_WIDTH; var y2d = (y3d * scale) + HALF_HEIGHT; //绘制图片 c.drawImage(anim_img, x2d, y2d, 5*scale, 5*scale); } var points = []; //生成随机的飞船 function generateSpaceship(){ for (i=0; i<numSpaceship; i++){ var point = [(Math.random()*400)-200, (Math.random()*400)-200 , (Math.random()*400)-200 ]; points.push(point); } } //清除并且绘制飞船 function render(){ //清除画布上所有的图形 c.fillStyle="rgb(0,0,0)"; c.fillRect(0,0, SCREEN_WIDTH, SCREEN_HEIGHT); for (var i=0;i<numSpaceship;i++){ point3d = points[i]; z3d = point3d[2]; z3d -=2 ; //每次缩减,生成新的z轴坐标位置 if(z3d<-fov) z3d += 200; //超过一定数量,则生成反向坐标 point3d[2] = z3d; //调用绘制方法 draw3Din2D(point3d); } } //生成飞船 generateSpaceship(); //隔一定时间生成页面图形 setInterval(function(){render();}, 15);
.