1.计算机动画的实现
从图像移动方式上基本可分为三类:
【资料图】
目标对象移动法(背景不动,改变目标位置)
背景移动法(目标不变,改变背景,呈现动画效果)
屏幕移动法(也称拉屏技术,将屏幕映射到一个更大的图像逻辑缓存区某一位置,通过改变屏幕位置实现动画,常用于三维动画)
从处理方式上可分为:逐帧动画和实时动画
用于实现动画的技术非常多:
重画技术(又分为清屏重画法和底色覆盖法)
清屏重画法(图像的每个变化都重画,最直接的逐帧动画)
底色覆盖法(使用背景色重画要清除的部分,使对象产生移动效果,只适用于单色背景,还要解决图像冲突(两对象图像有重叠部分时,一个对象的移动导致另一对象图像不完整的情况)问题)
异或法(对象图与背景相异或,并再次与对象图相异或即可还原背景,适用于各种背景,而且没有图像冲突)
背景变换法
整体存取法
隐式页动画(两页缓冲区,一页用来显示,一页用来绘图,应用于复杂动画)
多页面显示法(现代新型显示器配置,用于高帧高清晰度的动画)
2.分析异或法实现动画的原理
我们不难理解,位运算异或有两个重要性质:相同的两个数异或值为0;任意数和0异或还是它本身。
例如:a^b^b=a,a^b^a=b;1^0^1^1=1^1^1^0
多个数异或时,每个二进制位的值只与0和1的个数有关,与顺序无关。
图像也是用数据表示的,采用异或技术实现动画显示的方法:
编辑
在背景上提取将要显示对象的区域,将该区域与对象异或存于缓存区;
将对象显示在对应位置;
移动对象时,将前面缓存的数据直接在对象区域异或,就恢复背景了,选下个位置返回第1步,顺次执行。
图像冲突的分析:如果在第一个对象显示的位置还要显示另一个对象,是否还能恢复背景?
为此,我们要分析三个数(A,B,C)之间的异或。按前面技术方案,假定B为背景,A先算,则A^B,后C^A;若是C先移走,很容易理解A被还原了,再移A一定还原B,不会冲突;若是A先移走,则先得C^(A^B),后得
(C^A)^C^(A^B)=B,仍然不会冲突,运用二进制数值直观展示这个运算过程如图:
编辑
依此类推,有n个对象时,其值记为P1,P2,P3……Pn,设背景为P0,同一位置先后显示n个对象,则缓存的值有
P0^P1, P1^P2, ……, P(n-1)^Pn。
移除所有对象时,Pn^P0^P1^P1^P2^P2^P3^……^P(n-2)^P(n-1)^P(n-1)^Pn
等于Pn^P0^Pn=P0,依旧还原背景。
故,异或法能轻松实现有多个移动对象的动画,并恢复背景,不会造成图像冲突。
以上就是异或法实现动画的基本原理了,希望对大家有所帮助。
顺带一提,这个异或法技术在我的开源项目《ActSpace》中具体实现了,所有源码都是从底层实现的哦!它涵盖了键盘操作,文件处理,图形学技术(比如图片显示、裁剪、动画实现等),碰撞检测等方面技术基础,感兴趣的话赶紧拿去钻研学习吧。它并不完美,但它一定是我呕心沥血打造的,也许我不会再去完善它,但我相信大家一定能够把它打磨得更加精致!项目地址:GitHub-ActSpace
思考:上述技术方案可能会出现什么样的问题?如果是动态变化的背景,异或法还可行吗?怎么解决?
欢迎大家评论区留言探讨!
原文出处:异或法实现计算机动画技术的原理 - 自导者薄空的文章 - 知乎https://zhuanlan.zhihu.com/p/586643693