🏂抢不到冰墩墩?快用canvas画一个谁也抢不走的冰墩墩吧!
冬奥会正在如火如荼的进行,从第一天的冰壶到👦短道速滑队惊心动魄的金牌再到前几天看到🏂谷爱凌做出第一个偏轴1620我直接激动地跳起来,今年冬奥看点十足!不得不提的就是今年冬奥的吉祥物冰墩墩也是成了新网红,网络上全是他的身影,前两天开启的购买我也是一个都没抢到…真是要气死了。
于是我决定自己画一个,作为一个前端人,曾经也是学生会宣传部骨干成员,怎么说也是有点美术功底在的(自我感觉良好)。
本篇文章会通过画冰墩墩的方式帮助大家复习一下canvas基本的使用及相关方法。
实现效果
绘制步骤
身体
身体部分我们利用canvas的椭圆和canvas填充未闭合路径的特点来绘制。我们需要两个半椭圆来生成如下图所示的形状
1 |
|
椭圆方法:ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise)
对应参数:起点x.起点y,半径x,半径y,旋转的角度,起始角,结果角,顺时针或逆时针
耳朵
耳朵很简单,这里用一个半圆和一个矩形组成:
1 |
|
绘圆方法:arc(x,y,r,sAngle,eAngle,counterclockwise)
对应参数:圆心x,圆心y,半径,起始角,结束角,顺时针或逆时针
耳朵要先于身体绘制,这样身体就会将耳朵多余部分覆盖
手与脚
手脚为了做的生动形象,这里使用贝塞尔曲线来构造对应的形状,首先先来简单了解一下canvas中二阶、三阶贝塞尔曲线的生成方式和对应方法。
- quadraticCurveTo(二阶贝塞尔曲线)
quadraticCurveTo(cpx,cpy,x,y)
参数:控制点的x,控制点的y,结束点x,结束点y
- bezierCurveTo(三阶贝塞尔曲线)
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)
参数:控制点1的x,控制点1的y,控制点2的x,控制点2的y,结束点x,结束点y
贝塞尔曲线原理在动图中已经体现的很明显了,控制点能够使两点之间的折线变得圆滑。接下来我们利用它画手脚,每画完一部分记得closePath()关闭当前路径。
1 |
|
爱心及肚肚上的冬奥会logo
爱心我利用掘友已经实现了的代码添加,而logo则利用canvas导入图片的方法实现。logo网上一搜就有。
drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
参数:要使用的图像,裁剪x,裁剪y,图像宽度,图像高度,放置点x,放置点y,使用图像宽度,使用图像高度
1 |
|
面部
面部相对就比较简单了,都是规则图形或曲线,新知识点就是canvas的渐变填充方法。
线性渐变:createLinearGradient(x0,y0,x1,y1)
参数:渐变开始点x,渐变开始点y,渐变结束点x,渐变结束点y
径向渐变:createRadialGradient(x0,y0,r0,x1,y1,r1)
参数:渐变开始圆心x,渐变开始圆心y,半径,渐变结束圆心x,渐变结束圆心y,半径
1 |
|
眼鼻嘴
btw:眼鼻嘴这个标题一写出来我就没忍住开始唱
미안해 미안해 하지마
내가 초라해지잖아
好了收!
1 |
|
最后
我本来想要给整个冰墩墩描个黑边,画出透明外套的感觉,因为觉得透明外套是冰墩墩的灵魂,但是我一直没找到一个好的方式来绘,如果有大神能够指导或提点一下老弟的话我实在是感激不尽!