[Macro]写动画倒也不难——3D8动画层函数库v0.1分享

Photobucket

倒是有越来越多的朋友,无论是否用3D8,都搭建起自己的8x8x8LED光立方作品,大家在硬件电路基本成熟之后,开始着力于动画的实现。这是我一直期待看到的,毕竟就目前的开发水平而言,想要让毫无编程经验的朋友玩起来,还是不太现实的,只能借助于现成的“小卡”或是上位机。要实现完全的自定义,还是需要编程,因为3D8的本质,就是8片8×8点阵屏么,又实现了驱动与动画的分离,所以动画就是要自己研究才好。本文提供了v0.1版的动画函数库,方便有编程检验的朋友更快速地实现丰富的动画效果。

不过编动画的经验还是有一些,和大家分享一下,希望可以抛砖引玉,帮助有志于玩转单色LED光立方的朋友更方便地实现动画效果。不过首先强调一些,我这里所说的“动画”,是真正的“动”画,画面是动态生成的,我不太喜欢使用“录像”的方式播放动画,倒是觉得慢慢玩算法实现动画的过程,无论对个人编程水平还是空间想象水平,都是很好的锻炼,而且其乐无穷。

因为单片机系统的种种限制,没法像使用电脑那样,随意地“挥霍”系统资源,也没法面向对象(51的话,你就忍了吧),所以我们使用一个64字长的单字节数组,建立于8x8x8光立方上512个光点的对应关系。所以,这个“动画层函数库”的本质,其实在三维模型的基础上,对数组进行各种运算。这也就是为什么几乎每个函数都以数组指针作为第一个参数,因为,玩的就是数组。

在初步分享的V0.1的函数库里面,最具有含金量的,其实就是变换坐标系函数。作为输出函数,可以直接实现坐标系的翻转,或是镜像,当然也包括二者的叠加。使用数组,实现坐标系翻转还是比较麻烦的。在此,特别感谢 @ZognaG,在他面前,实在不敢吹嘘自己C语言有多厉害,感谢他提供的点拨。现在坐标翻转的效率很高,虽然多了不少转换,但是速度没受到什么影响。其实类似这样坐标系旋转的算法,基本隶属于“计算机图形学”,而核心是“线性代数”。不要以为学数学都是为了考试么,^_^。不过在3D8的例子中倒是没有用到这么复杂,真要那样计算的话,肯定速度也不够。都是正交变换的话,倒简单了许多。

cMode参数的取值不同,对输出坐标系的影响如下:
Photobucket

这也就是为什么过去小卡的演示程序里面,看起来一样的动画,会不同方向地播放一下,甚至有些动画,故意就是用非编程用的坐标系播放(例如“水滴”,嘿嘿)。因为考虑到数组的特性,编程好编的动画,直接显示的视角未必好看;而好看的动画,在特定的坐标系未必好编写。而变换坐标系输出,就能基本解决这个问题。图例中并没有显示完全列出所有组合,只是把常用得列出来。有兴趣的朋友不妨多进行测试。关于3D8及其初号机Matrix8的动画,欢迎访问aguegu优酷空间的3D8/Matrix8视频专辑

V0.1版的头文件如下

////////////////////////////////////////////////////////////
// Animation Function Library for 3D8 controller
// Based on STC 89C51 series MCU with 22.1184M XTAL
// Version v0.1
// Date: 2011-12-03
// Copyright @ aGuegu 2011-2012
// http://aguegu.net
////////////////////////////////////////////////////////////

#include 
// 可根据实际需要,换为相应的单片机头文件

#ifndef _3D8LIB_H_ 
#define _3D8LIB_H_ 

typedef unsigned char uint8;
typedef unsigned int uint16;

#define COLUMN_COUNT 	64
#define LAYER_COUNT 	8

#define _COL(x, y) (((y)<<3) + (x))

extern void DelayL(uint16 a); // 长延时,1长延时 约等于 65536 个短延时
extern void Delay(uint16 a);  // 短延时,X个时钟周期级别

extern void UartInit (void);
// 串口初始化,波特率为115200

extern void SetUniqueValue2Cube(uint8 * p, uint8 cValue);
// 全局赋值为cValue,清屏的时候常用

extern void SetUniqueValue2Frame(uint8 *p, uint8 cFrameIndex, uint8 cValue);
// 将y=cFrameIndex面(8个字节),全部赋值为cValue

extern void SetFrame(uint8 * pDest, uint8 cDestIndex, uint8 * pSource, uint8 cSourceIndex);
// 将数组pSource的y=cSourceIndex面(8个字节)复制至 数组pDest的y=cDestIndex面(8个字节),多用于取模数据赋值

extern void SetDotByXYZ(uint8 *p, bit bOn, uint8 x, uint8 y, uint8 z);
// 将点(x, y, z)设为bOn

extern void SetCubeByXYZ(uint8 *p, bit bOn, uint8 x1, uint8 y1, uint8 z1, uint8 x2, uint8 y2, uint8 z2);
// 将以点(x1, y1, z1),点(x2, y2, z2)为对角线的长方体实心填充为bOn

extern void SetBlockByXYZ(uint8 *p, bit bOn, uint8 x1, uint8 y1, uint8 z1, uint8 x2, uint8 y2, uint8 z2);
// 将以点(x1, y1, z1),点(x2, y2, z2)为对角线的长方体框架填充为bOn

extern void MoveZ(uint8 *p, bit bDirection, bit bRecycle);
extern void MoveY(uint8 *p, bit bDirection, bit bRecycle);
extern void MoveX(uint8 *p, bit bDirection, bit bRecycle);
// 整体图案平移分别沿z,y,x三轴平移
// bDirection: 	0为正方向,1为负方向
// bRecycle:	1为头尾循环,0为不循环

extern void PrintCube(uint8 *p);
// 标准输出

extern void DisplayCube(uint8 *p, uint8 cMode);
// 坐标变换输出

#endif

目前函数库还在不断扩展中,也是抛砖引玉,大家完全可以自己去编写自己好理解而且结合自己实际需要的函数库。不要一个主函数,从头写到尾,那不是良好的编程习惯。函数库下载链接:3D8-Lib_v0.1_20111203

同时分享两个例程,就是在视频里面出现的2个:

  • 065-3D8-Controlller-DemoWithLib 显示坐标图例中的输出效果
  • 066-3D8-Controller_Demo_Wind 为六方向“流”动画,以及4方向空心框变换动画。(2011.12.25更新,特别感谢 山东-行云流水 和 福建-木子 两位群友,指出原先例程中 SetEmptyCubeByXYZ 函数未定义的编译错误,因为在库函数中已经将这个函数改名为 SetBlockByXYZ。在此,对各位带来的困扰深感歉意。)

研究例程可以发现,动画逻辑的实现,基本已经脱离硬件架构,成为完全的C语言程序了。软件大牛们,玩硬件没有那么难啦,把硬件结构都做好以后,随你发挥啦~

如果把3D8的软件系统分层的话,可以大致分为三层:驱动层(包括LED驱动电路,串口通讯),函数层(动画函数),实现层(实现最终动画逻辑)。加上硬件的话,现在硬件层、驱动层、函数层,都基本做好,而实现层的部分,基本就是原生C语言代码了,也就是说,哪怕您对硬件电路完全没有概念,只要知道C语言是怎么一回事,就能玩起3D8光立方啦~

另有,视频讲解,介绍如何在新建工程中调用函数库,并对坐标系进行说明,不过不知道讲清楚没有……

特别感谢:@低调坚持不懈地改良3D8的硬件; @ZognaG,我的C语言顾问。

*不作伸手党,下载代码请留名,谢谢。

P.S. 欢迎对LED光立方感兴趣的朋友,无论是否购买套件,加入3D8的官方QQ群,参与在线讨论。1群:165068863,2群:179638304(已并入1群)

关于aGuegu

向着更高的逼格
此条目发表在3D8 光立方分类目录,贴了, , , , , , , , , , , 标签。将固定链接加入收藏夹。
  • Zeus

    非常感谢!!大神 膜拜

  • fish

    沙发,学习中,感谢阿官!

  • 李秦剑

    偶像啊,,以后多向你学习

  • daicheng

    学习了

  • sunny

    大神,求学习

  • 潇洒东东哥!

    很好很强大,学习了!!

  • 谢谢

  • 小颜

    谢谢分享!

  • 孙中孟

    感谢牛人,学到了不少东西

  • 感谢 阿官

  • Tom

    谢谢分享!!

  • dqb

    学习了,谢谢!

  • aGU谢谢你分享啊

  • 谢谢分享,学习了

  • xingfu的飞

    资源很好,学习中

  • 肖云

    看看 ···

  • 李祖权

    学习学习

  • LcPMcm

    看看!!不错!!!