当初在掘金看到那个小熊的登录页面,很多人都很喜欢,于是恬不知耻的说了一句要用canvas来实现一遍,真的是给自己立了个flag,还好结果很糟糕。

各位观众大老爷,这可能是你见过最惨淡的demo了,希望不要嫌弃

首先看看别人的效果图

进行思考

  1. 为什么小熊会跟着输入框的输入而移动。
  2. 为什么小熊的耳朵会移动到前面
  3. 小熊的移动规律是什么

做出一些逻辑上的思索与排除

  1. 2d
  2. 3d
  3. 判断文本框的焦点坐标,从而给小熊旋转等动作的数据支持

实现3d的向量类

var eyeLength = 250, centerX = 200/ 2, centerY = 200 / 2;
//设定视距,中心点的坐标function Vector3(x, y, z) {this.x = x;this.y = y;this.z = z;this._get2d = function() {//将空间左边进行缩放后生成平面视图中的坐标var scale = eyeLength / (eyeLength + this.z);var x = centerX + this.x * scale;var y = centerY + this.y * scale;return { x: x, y: y };}}
复制代码

对物体进行空间的旋转

function rotateX(vec3,angleX) {var cos = Math.cos(angleX);var sin = Math.sin(angleX);var y1 = vec3.y * cos - vec3.z * sin;var z1 = vec3.z * cos + vec3.y * sin;vec3.y = y1;vec3.z = z1;}function rotateY(vec3,angleY) {var cos = Math.cos(angleY);var sin = Math.sin(angleY);var x1 = vec3.x * cos - vec3.z * sin;var z1 = vec3.z * cos + vec3.x * sin;vec3.x = x1;vec3.z = z1;}
复制代码

通过输入向量与角度值,来进行计算,生成坐标在空间旋转后的坐标,此处使用的计算公式为旋转矩阵,矩阵并未单独抽离为单独类。

形状类

看过上一篇2d向量讲解的会知道,我们在使用向量来处理时,是要对每一个向量点进行处理,所以我们没法直接使用如fillRect等的方法,这里我使用了贝兹曲线来绘制图形。

function shape(option) {this.points=[];this.site=new Vector3(0,0,0);this.create(option);this.face=[];this.ctx={};
}
shape.prototype.render = function(ctx) {this.ctx=ctx;for(let f =0;f<this.paths.length;f++){this.face[f]=new Face(this.ctx,this.color,...this.paths[f]);}this.face.sort(function(a,b){return a-b;})this.face.forEach( function(face, index) {face.draw(ctx);});}
复制代码

我们通过捕获paths中的向量,生成一个面,然后由面去构成物体,并且在同一形状中进行面重排,是为了使面在绘制的时候依据z(深度)来进行渲染,产生遮挡的效果。

这样我们将可以通过如下方式来创建形状

var face=new shape({paths:[[new Vector3(-50,0,4),new Vector3(-50,-70,4),new Vector3(50,-70,4),new Vector3(50,0,4)]],color:"#3366C"})var eyes=new shape({paths:[[new Vector3(-54,0,6),new Vector3(-54,-8,6),new Vector3(-46,-4,6),new Vector3(-46,0,6)],[new Vector3(-54,0,6),new Vector3(-54,8,6),new Vector3(-46,4,6),new Vector3(-46,0,6)]],color:"white"})
复制代码

对于这种绘制的最快方法,就是先在纸面上进行坐标绘制,再用代码实现。

实现了绘制与变换之后,下一步就是进行交互,这里我使用vue来写的页面,通过监听输入框的文本长度来计算,(文本的长度*字体的大小)+左边距=焦点坐标。

var vm=new Vue({el:'#bod',data:{username:"",//记录输入框left:0,//距离左边的长度,用于判断旋转何时结束len:0,//焦点坐标pos:0,//是否开始选择dir:'left'//旋转的方向},computed:{//计算文本长度roate:function (argument) {this.len=this.username.length;}},watch:{//监听len的值,判断是增还是减len:function(o,n){this.pos=1;if(n<o){this.dir='right';}else {this.dir='left'}}}})
复制代码

然后我们就可以把所有的东西交给浏览器了

function anima(){if(vm.pos===1){//如果可以旋转if(vm.left<r){//如果长度不够,继续旋转ctx.clearRect(0,0,200,200);switch (vm.dir) {//判断方向case 'right':face.rotate(0,r);eyes.rotate(0,r);face.render(ctx);eyes.render(ctx);vm.left+=r/5;break;case 'left':face.rotate(0,-r);eyes.rotate(0,-r);face.render(ctx);eyes.render(ctx);vm.left+=r/5;break;}}else{//长度达到后则重置数据vm.left=0;vm.pos=0;}}requestAnimationFrame(anima)}anima();
复制代码

不足

  1. 画的有点丑,不太可以很清晰的有那种感觉
  2. 只对单个物体进行了深度渲染,未实现空间深度的渲染
  3. 向量与形状的功能不完善,使得效果局限性很大

这是未输入时的样子,为了对比明显,我讲旋转的角度调大了 源码在此: 源码

总结

其实这东西挺不好做的,以前用PS或者AE做动效的时候,只想着如何来美化效果,动手实现之后才感觉图形引擎那群人真的牛逼,从开始打算做到简单实现,花了接近半天,中间推倒了很多想法,然后再去整理,虽然最后的效果不怎么样,但是吧,我还是恬不知耻希望可以诱惑到一些大佬们加入canvas的队伍中,一起来写有趣的东西。

不定期更新canvas与svg的相关技术教程,有实战型,也会有主原理型的,2d 2.5d 3d都会包含到,同时涉及的有 线性代数 物理 图形学等相关的基础知识。

欢迎各位客官收藏关注 投硬币包养

vue+canvas如何实现b站萌系登录界面相关推荐

  1. 转:vue+canvas如何实现b站萌系登录界面

    https://juejin.im/post/5ae802a46fb9a07ac55fec04 转载于:https://www.cnblogs.com/zhaobao1830/p/9199230.ht ...

  2. HTML5+CSS3小实例:不偷看密码的超萌猫头鹰登录界面

    实例:不偷看密码的超萌猫头鹰登录界面 技术栈:HTML.CSS.jQuery jQuery下载地址:https://www.jb51.net/zt/jquerydown.htm 效果: 源码: < ...

  3. 数据挖掘:实用案例分析 下载_萌低龄,超实用“萌系”呈现技巧及设计案例分析...

    关于讲师:钟文博 ,腾讯互动娱乐创意设计部高级设计师,擅长萌系产品的设计表达. 导语:不同的美术风格有着不同的受众偏好,游戏美术的风格对受众的吸引力和游戏玩法本身同样重要.在当下社会,萌系风格文化对社 ...

  4. 数据挖掘:实用案例分析 下载_真经阁丨萌低龄,超实用“萌系”呈现技巧及设计案例分析...

    新春期间不打烊! 之绘ART很荣幸 邀请到腾讯游戏学院 为各位小伙伴打造干货内容! 关于讲师:钟文博 ,腾讯互动娱乐创意设计部高级设计师,擅长萌系产品的设计表达. 导语:不同的美术风格有着不同的受众偏 ...

  5. 移动端html5手写板,Vue+canvas实现移动端手写板步骤详解

    这次给大家带来Vue+canvas实现移动端手写板步骤详解,Vue+canvas实现移动端手写板的注意事项有哪些,下面就是实战案例,一起来看一下. 清除 保存 Canvas画板 var draw; v ...

  6. 线条边框简笔画图片大全_超治愈萌系手帐素材大全 美食旅游花草人物花边都备齐了...

    现代人每天都生活在一个充满焦灼感的空气中,成年人的世界里,每个人都不容易.不论是生活还是工作,都充满了各种挫折.很少有人能一帆风顺,为学习.为工作.为家庭.为感情.我们总会在坎坎坷坷中成长,难免会觉得 ...

  7. c语言用graphics画直线 带箭头直线_动漫人体比例怎么画?教你画出萌系少女!...

    这里需要注意的是,原来想要画人物的全身画时需要参考很多的人物素描以及人体的构图等方面的资料,但是我认为,萌系的画是一种虽然很像现实中的人物但是却存在一定差异的东西,所以这里我们这个部落格将以其他东西的 ...

  8. 萌系外表+丰富功能,i宝机器人成CES人气展品

    万众瞩目的CES Asia 2018亚洲消费电子展,如期在上海拉开了帷幕.横跨亚洲市场的500多家优秀科技企业,纷纷携最新研发成果亮相本次行业顶级盛会.其中,南京阿凡达i宝机器人凭借其出彩的人形外观以 ...

  9. html+js+canvas实现画板涂画功能和vue+canvas实现画板涂画功能

    1,html+js+canvas实现画板涂画功能 效果如下: <!DOCTYPE HTML> <html> <head><meta charset=" ...

最新文章

  1. 重启网卡服务_Linux下查看不到物理网卡配置
  2. 3 关于数据仓库维度数据处理的方法探究系列——缓慢变化维概述和原理
  3. 网络生活点滴 网络管理实用8招技巧
  4. scala通过mkString方法把一个集合转化为一个字符串
  5. CefSharp 支持MP4
  6. 题目1003:A+B
  7. 微信公众平台开发(150)——从新浪云SAE上传图片到图文消息
  8. python多大学_用Python看看你的大学A4纸还剩多少!
  9. 深入理解C语言系列之C语言语法陷阱(考题常设置的陷阱点、必须避免的错误和缺陷类型)
  10. android列表的默认值,ListPreference默认值没有显示
  11. excel字符串和单元格拼接_Excel单元格内计算式及字符串拼接实现
  12. 单片机编程软件IAR和烧写软件SmartRF安装教程(超详细)
  13. 小程序下载到手机后的目录。
  14. LMS Amesim 用途及界面汉化
  15. python手写数字识别实验报告_ANN MNIST手写数字识别总结
  16. PDMS.NET开发
  17. 蓝桥杯 算法训练 寂寞的数
  18. html数独游戏源代码,数独算法及源代码
  19. 服务器启动成功网页无法访问,apache启动后无法访问网页的解决方法
  20. 使用微PE安装U盘windows系统

热门文章

  1. Android 手机灭屏流程分析详解
  2. 企业员工生日提醒短信怎么发送
  3. python 画三角形matli_Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
  4. 中国3D金属打印机市场现状研究分析与发展前景预测报告(2022)
  5. 淘礼金解析/淘口令解析工具
  6. JQ拖曳事件mouseup失效的解决办法
  7. Poisoning Attack in Adversarial Machine Learning
  8. 什么是深度学习、强化学习
  9. windos命令小全
  10. CREO:CREO软件之零件【工具(调查/模型意图/实用工具)】、【视图(可见性/方向/模型显示/显示/窗口)】的简介及其使用方法(图文教程)之详细攻略