Mobile

3D Electronic Blocks

基于Android平台的幼儿教育APP——3D电子积木

一、前言

这是我在大学工作室的最后一个项目,大三下学期,大年 29 还去老师家研究算法、汇报进展,寒假放的一周假除了吃年夜饭基本每天都是朝 6 晚 12 满负荷,这些场景都历历在目,不过也很欣慰,这个项目拿下了工作室所参加的所有比赛的最高奖项:中国大学生计算机设计大赛全国一等奖、「发现杯」全国大学生互联网软件设计大奖赛华北赛区一等奖/全国总决赛二等奖、「鑫台华杯」华北五省及港澳台大学生计算机应用大赛一等奖,也算是为我工作室生涯 and 和老五的合作画上了一个圆满的句号。

二、项目介绍

3D电子积木是一款结合电子知识的教育类应用,它采用的是数据可扩展的架构,用户不单可以体验内置的实验,还可以下载服务器上的实验数据包。现阶段,安装程序内置6个实验,这6个实验用户可以直接体验,服务器上有另外6个实验,用户需要下载才可以体验。


元器件介绍界面包含了所有元器件的3D展示与文字介绍。


APP 初始状态包含 6 个内置实验,除此之外也可以由用户自行下载额外可供的实验包(商业模式:可修改成付费下载)。


加载界面会随机提示一些电路相关的知识点。实验界面可以旋转视角、将元器件拼接到电路板上,连通电路呈现出对应的实验效果。



每个实验都附有对应的实验讲解。


三、技术难点

1、电路计算核心算法

这是本软件最大的难点,将电路转化成数学模型,首先要将电源以及导线直接看做电流源,因为电路未联通时是无法判断电流方向的,只有这样才可以将复杂的物理模型转换为数学模型。之后根据对结点电压法的进一步改进,得到了适应本软件的升级版结点电压法。

矩阵是解决很多算法难题的优良选择,当将建立好的电路转到矩阵的数学模型上后,由矩阵来检测电路的正确性,每个元器件都是更新矩阵的元素,当确认连通后,就得对这个最终矩阵进行简化和 LU 分解,最后的结果标示这实验最终呈现效果。

2、数据异步加载

位于服务器待下载的数据包,需要实现异步加载才可以被显示在用户的设备中。首先是最简单的普通数据文件的加载,需要使用字节流的方式,将数据文件下载到本地并加以读取,这一步并不难实现。

难点在于对于图片和视频的加载。对于图片,可以通过创建一个载体的方式来加以显示, Unity 封装了 Texture 和 Sprite 工具类,而后者可以作为最终图片的容器。对于视频,我们利用了视频贴图技术,将相对路径和绝对路径区分开来,这么做是因为在移动设备中并不是任何路径都对开发者提供所有类似读写的权限,之后不断优化以及封装此模块的代码,最终实现了只需要接收一个参数就可以获取播放视频的机制。

3、数据包的解压缩

其实在项目开发时,最先考虑并不是 Zip 格式保存数据包,而是用 Unity 提供的 Assetbundle 格式来保存,但是经过多次测试,这种格式被淘汰了,最终我们应用Zip格式。所以当数据包被异步加载到用户设备中时,还需要对其进行解压缩处理。

解压缩在应用中体现不明显,基本紧随下载完成。经过一段时间的查阅资料以及测试,明白 Unity 中如果要实现解压缩的功能,需要下载 ICSharpCode.SharpZipLib.dll 文件,下载完成后将该文件放置在项目的相关路径中,之后利用命名空间的引用来编写相关代码来实现解压缩功能。

4、多指触控

触控在代码逻辑中被单立一个特殊模块,项目中共包含了5种不同的触控手势:单指点击、单指滑动、双指左右平移、双指上下平移、双指缩放。其中单指点击和单指滑动这两个手势,Unity 引擎自身已经有了很好的封装和相关API,只需要调用即可。

在区分双指平移以及缩放时,利用了向量相关的知识。首先要了解应用画面的更新是以帧为单位,每两帧之间的间隔非常短,我们可以获取上一帧手指的位置,与当前帧手指的位置形成一个二维向量,因为是双指操作,所以会得到两个二位向量,之后判断这两个向量的夹角,就可以区分当前操作是平移还是缩放。

5、元器件拼接

在初始的模型调整时,严格规划了模型的尺寸,全部按照实际尺寸比例。Unity 引擎自带碰撞器,为我们的检测带来了方便,此时碰撞器删除以往物理碰撞的载体身份,而是作为一个触发器。


当两个纽扣的碰撞器碰触到的时候,不触发物理上的碰撞,而是传给管理层一个触碰信息,得到这一信息后,由代码进行检测,计算中心位置,如果满足拼接要求,则进行拼接。在模型设计初,我们为每个模型都进行了归类处理,同一类型的模型被冠以相同的标签 Tag ,这也是是否可以进行拼接的判断因素之一。

6、场景间的异步加载

由于模型较为精细,进入实验场景时需要大量加载时间,这种现象严重降低用户的体验,所以场景之间的异步加载是必须要解决的。

为此新建了一个过渡场景,在此场景中设置进度条,首先禁止 Unity 中加载完毕后自动切换场景的模式,在过渡场景运行的同时,也对实验场景进行加载,通俗的说就读条滚动和下一个场景的预读是同步进行的,这样就使整个软件看起来运行更加流畅了。