Commit 07399915 authored by BlackAngle233's avatar BlackAngle233
Browse files

5.31

parent 0314bc9c
File added
# 初稿
1. 绪论
* 增强现实技术
* 增强现实技术“augmented reality”技术是一种将虚拟信息与真实世界巧妙融合的技术,将虚拟信息模拟仿真后,叠加到现实世界中。早在二十世纪五、六十年代,Morton Heilig 就发明了 Sensorama Stimulator,而在近年来随着计算机视觉、图形处理能力、显示技术和输入系统的进步,增强现实才变为越来越便捷与实用。尤其是在当下,几乎人人都拥有这一部高性能的智能手机。同时,开发平台也越来越为完善,例如 Vuforia 以及国内的 EasyAR 等等,使得增强现实的应用开发越发便捷。
* 许多过去研究已经证明了增强现实应用在建筑、医学、娱乐等领域带来的巨大益处,而其在教育领域内也有着潜在并且可观的前景。在国内外斗已经出现了诸多利用增强现实进行课外教学的应用,更是有不少老师已经将其应用于课堂之上。而在国内相关的研究相对还比较少,针对中学数学教学的研究更是屈指可数,大多也都局限于书本之上。
* 在数学教学中,“数形结合”是重要的数学思想方法,“数缺形时少直观,形缺数时难入微”是华罗庚先生对数形关系的精辟论述。结合笔者自身的经验,中学时同学们数学成绩的较大差别都出现在几何,尤其是立体几何之上。大部分中学生在学习数学的过程中经常会出现对于图形,尤其是立体几何理解上的困难,从而导致了对公式的错误使用导致解题错误。增强现实可以将抽象的数学关系通过立体的图形展示出来,并让学生自由操纵多角度观察学习,加深对其的理解。
* 近年来,卡内基梅隆大学的一项研究便致力于将抽象的数学关系转化为漂亮的图形。但作为网页应用依旧有其局限性,其对于立体图形的绘制与显示效果并不尽如人意,若是将其应用于增强现实之上,并扩展支持立体几何的绘制,则会有更加显著的效果以及教学价值。
* 2016年,任天堂在手机上发布了《宝可梦GO》,一下子点爆了国内外的手机应用市场,使世人的注意力汇聚到了增强现实技术上。在游戏中,玩家可以通过手机摄像头,在现实世界中看到虚拟的宝可梦,并进行捕捉战斗等交互行为。一时之间,各地的路上都能看到举着手机寻找宝可梦的玩家的身影。
* 虽然这只是一个简单的游戏,且热度很快就消退,但无疑为所有人打开了增强现实的大门,让全世界开始思考研究增强现实在各行各业的应用。
* 例如在医疗领域,张力新等人便已提出了将增强现实与脑机接口结合的想法,用于病人的康复治疗。([1]张力新,张裕坤,柯余峰,杜佳乐,许敏鹏,明东.基于Hololens的增强现实脑-机接口研究[J].中国生物医学工程学报,2019,38(01):51-58.)这个设计解决了原来脑机接口康复设备的便携性问题,有望在未来的实际医疗领域真正运用。类似的还有许许多多用于手术训练,或是解剖学学习的增强现实应用,无不是新时代背景下科技与医学结合的产物。
* 此外,旅游业作为我国重要的经济来源,自然也正如火如荼地进行相关增强现实应用的开发。在杭州南宋官窑遗址博物馆,相关负责人就依托 AR 以及 5G 技术,再现了八百多年前的官窑遗址,让文化遗产“活”了起来。它们更是推出相关的虚拟导游等吸引了众多国内外的游客前来参观,感受中国文化。而今也有越来越多的景点,博物馆提供了类似的服务,特别是一些过去场景的复现或是故事表演,都为游客营造出强沉浸式的游玩体验,令人对其心驰神往。
* 而在教学应用中,笔者发现目前市面上的大部分应用都是集中在婴幼儿教育之上,且都以游戏化的设计为主。例如,林登等人基于增强现实技术开发了移动游戏的数学学习方法。(Deng L, Tian J, Cornwell C, et al. Towards an Augmented Reality-Based Mobile Math Learning Game System[C]//International Conference on Human-Computer Interaction. Springer, Cham, 2019: 217-225.)用户可以通过增强现实以及设备中的传感器,模拟与虚拟宠物进行交互的过程,从而激发在家中学习数学的学习兴趣,最终在这个过程中强化其数学技能。与此同时,在马来西亚也有教育团队设计了 AR 魔法之书。(Zhang M, Wu L, Yang L, et al. A digital entertainment system based on augmented reality[M]//Informatics in Control, Automation and Robotics. Springer, Berlin, Heidelberg, 2011: 787-794.)在这本书中,数学知识被融入了一个个故事之中,再结合增强现实强情景化以及沉浸感的特点,让学生在阅读故事的同时学习知识,调动其学习兴趣。
* 笔者也发现,目前并没有一个真正适用于中学生学习数学的增强现实应用。过去的研究大都关注于用 增强现实技术吸引并激发学生的学习兴趣,但对学业繁忙的中学生来说,自然没有这个时间去进行游戏化的学习。但增强现实技术在教学中的作用依旧是不可忽视,且十分具有潜力的。
* 中学数学教学应用现状
* 如笔者在上文中所提及的,许多过去研究已经证明了增强现实应用在建筑、医学、娱乐等领域带来的巨大益处,而其在教育领域内也有着潜在并且可观的前景。在国内外都已经出现了诸多利用增强现实进行课外教学的应用,更是有不少老师已经将其应用于课堂之上。而在国内相关的研究相对还比较少,针对中学数学教学的研究更是屈指可数,大多也都局限于书本之上。
* 现今正处于新媒体时代,因而各大中学都在进行中学数学教学模式的改革,但从笔者自身经历以及对身边人的了解不难看出,这种改革依旧局限于多媒体设备的使用。例如,使用 ppt 、投影仪等设备进行授课,而大多的习题解答依旧是在黑板以及试卷上完成的。不可置否的是,多媒体设备的加入,一定程度上加快了课堂学习的效率。通过大屏幕以及设计优良的 ppt,学生的学习兴趣能被快速激发,而且能清晰看到老师正在讲的知识点以及配套的动画,都使得学生能更快接受新知识。虽然其解决了黑板授课不清晰以及板书书写效率低的问题,但依旧是处于二维的范畴,即使是立体几何的图像对学生来说看过去依旧是平面图像。而且学生不能自行旋转缩放图像来观察其具体的形状,因而对一个图的印象往往停留在其二维的形态,当涉及旋转等复杂操作时,很多学生便不知从何下手,尤其是对一些空间想象力较差的学生来说。
* 在数学教学中,“数形结合”是重要的数学思想方法,“数缺形时少直观,形缺数时难入微”是华罗庚先生对数形关系的精辟论述。结合笔者自身的经验,中学时同学们数学成绩的较大差别都出现在几何,尤其是立体几何之上。大部分中学生在学习数学的过程中经常会出现对于图形,尤其是立体几何理解上的困难,从而导致了对公式的错误使用导致解题错误。在去年,张娅娅做了一篇有关于高中生立体几何学习现状调查研究。([1]张娅娅. 高中生立体几何学习现状调查研究[D].西北师范大学,2020.)其中就已经提及了,要合理运用信息技术,培养学生的空间想象能力,在未来这势必成为中学数学教学一大研究以及发展方向。而增强现实技术可以将抽象的数学关系通过立体的图形展示出来,并让学生自由操纵多角度观察学习,加深对其的理解。许多学生认为数学就是枯燥无味的背公式,而立体生动的可交互图形,也可以大大提升学生对于数学的学习兴趣,从根本上改正他们这一看法。于此同时,也能培养学生的空间想象能力,这一能力不仅仅是在数学学习上有用,在其他方面也有十分大的价值。例如化学中的分子式的学习,物理中磁场的学习都对这一能力有这要求。当然,笔者认为这一些相关的学习也势必可以扩展为基于增强现实的教育应用。
* 近年来,卡内基梅隆大学的一项研究便致力于将抽象的数学关系转化为漂亮的图形。(Ye K, Ni W, Krieger M, et al. Penrose: from mathematical notation to beautiful diagrams[J]. ACM Transactions on Graphics (TOG), 2020, 39(4): 144: 1-144: 16.)但作为网页应用依旧有其局限性,其对于立体图形的绘制与显示效果并不尽如人意,若是将其应用于增强现实之上,并扩展支持立体几何的绘制,则会有更加显著的效果以及教学价值。而其中有许多的思想是值得笔者去思考和学习的,首先便是自动化的绘制流程。虽然其正式的网站还没有上线,但从其案例可以看出,用户只需要输入一些数学对象以及这些对象之间的联系,系统便可以快速自动为其绘制符合输入的图形。这一特性正可以满足想象能力弱的学生的需求,他们知道数学定义,但却无法想象图形的形状。因而若有这么一个系统辅助,帮助他们快速翻译数学定义以及目标图形,则可以大大提高他们的学习效率,以及对数学定义的理解力。当然作为一个学习系统,其对用户的要求还是比较高的,用户需要优先学习系统的语法才可以使用系统进行绘图,而这在中学教学的场景下就并不适用。但以此为出发点,笔者构思并设计了一个增强现实场景下中学数学教学系统。
* 增强现实场景下中学数学教学系统
* 为了设计一个增强现实场景下中学数学教学系统,我们必须先明确整个系统的核心目的以及核心用户的需求。首先,系统的目的是提供一个快速高效的平台,能够快速将抽象的数学关系定义转换成生动且准确的数学图形,从而呈现给师生以满足教学需求。因而整个系统大致需要分为三个部分,一是用户输入的部分,可以让师生快速进行数学定义的输入;二是迭代计算的部分,系统自动将用户输入的数学定义计算出正确的数学图形,并得到其坐标;三是渲染绘制的部分,系统将计算出的数学图形进行渲染,绘制到用户界面上以供观察。之后的整个系统设计都会围绕着三个部分来展开。
* 其次,我们针对的是中学数学教学的场景,而目标用户是中学师生,系统的目标是提供课堂教学的辅助。因而整个系统必须保证足够简单,使得师生能够快速上手使用,且即使在课堂中使用也不会耗费过多时间,从而快速高效达到教学目标。其次,对大部分使用本系统的学生来说,他们对于需要绘制出的图形可能是一无所知或是一知半解的,因而系统不应该对用户的数学能力有过高的要求,即输入过程需要足够简单,哪怕用户不是很了解具体的因果,也能完成正确的输入从而看到结果。
* 除此之外,现存的增强现实应用中都存在一个相同的问题,即过于定制化,除非使用的老师同学有着较强的编程能力,否则难以进行个性化教学。因而,如何设计一个方便老师自定义内容的教学应用便成为了一个问题。参考几十年来最流行的数学绘制软件几何画板,笔者认为其清晰简便的用户界面设计可以极大简化师生的学习成本。再加之,整个中学涉及到的常用数学对象也十分有限,因而将其简化为用户界面按钮是极为可行的。
* 同时,该系统是设计为教学的,因而也应该具备师生课堂上共享以及交流的功能。在云服务器盛行的当下,这自然是十分容易实现的,在这里笔者选用了微软提供的 Azure 来完成这一功能。直接传输三维模型的开销可能是巨大的,而且效率较低。因而笔者设计了一系列数据结构,用于图像的生成和传输,教师和学生可以通过传输封装好的数据从而快速共享。
* 由于整个系统是在课堂上使用的,迭代计算以及渲染绘制部分的效率也需要有所保证,没有人希望上课时花费几分钟时间等待一个图形的绘制。所以在保证正确性的前提下,这两个部分都需要尽可能高效,这对我们的算法提出了一定要求。此外,绘制的图形的美观性也会极大影响学生使用本系统以及学习的兴趣,系统也应该在一定程度上对此有所满足。
* 而老师常常会选择在备课阶段就提前进行一些图形的绘制以供上课使用,这也就要求系统需要有一个保存载入的功能。老师可以通过这个功能进行预先的输入,在课堂上就不需要再重复输入,而是直接载入课前准备好的图形即可。笔者在这里使用二维码的形式对这一功能进行包装,这也使得这一保存载入的功能同时可用于分享,只要把对应的二维码分享给他人即可。为了这一目标,笔者设计了一系列数据结构,用于图像的生成和传输,教师和学生可以通过传输封装好的数据从而快速共享,而不是直接分享三维模型,从而节省分享时的开销。
* 同时,该系统是设计为教学的,因而也应该具备师生课堂上共享以及交流的功能。在云服务器盛行的当下,这自然是十分容易实现的,在这里笔者选用了微软提供的 Azure 空间锚点来完成这一功能。虽然直接传输三维模型的开销可能是巨大的,但在教学场景下并不会对这一部分有过多的性能损耗,因而是可以忽略不计的。Azure 空间锚点不仅仅支持增强现实,同时可以支持虚拟现实、混合现实多设备多用户使用,因而这一选择是为了日后系统可能需要做的改进和扩展所做的准备。笔者相信在未来这些设备走进课堂都是十分有可能的,因而在系统中为其留下了扩展的可能性。
* 这样一个设计三大部分,以及增强现实技术、空间锚点技术的系统的开发需求相对来说还是比较复杂的,而笔者了解到 Unity 引擎恰好在这几个方面都有着较好的表现。同时其作为业内目前最为常用的开发引擎,多年来不断保持着更新,与相应插件的合作也越来越友好,主流的增强现实插件都对其有着不错的支持。于此同时,微软的 Azure 空间锚点也对其提供了支持,相关的 HoloLens 设备也都可以通过 Unity 开发。综合以上,笔者选用了 Unity 作为系统的核心开发引擎,并使用对应版本的 EASY AR 以及 Azure 空间锚点插件以完成设计。
* 本论文旨在针对以上的问题设计开发一个针对中学数学的教学应用,将其应用于课堂教学,进一步提高教学效率以及提升学生的学习兴趣。从技术层面来看,本课题着力于将抽象的数学关系自动转化为正确的数学图形,在确保各项约束的精确性的同时也要考虑运算效率。从应用层面来看,对教师来说,可以减少其在课堂上进行图形绘制时所耗费的时间,只需要进行简单的输入便可以快速生成需要的图像,同时共享给所有的同学;对同学来说,可以多角度去观察立体的图像,更深入理解并学习知识,提高学习效率。同时,手机以及平板电脑作为便携设备,还可以帮助将数学学习扩展到课堂之外。
* 本章小结
* 在本章中,笔者对目前增强现实技术的应用做出了概述,并列举了一些近年来比较有突破性成果的应用,说明增强现实技术在应用层面上所拥有的巨大潜力与意义。而后,笔者对当前市面上数学教学相关的应用进行了调研,发现市面上的软件依旧以游戏化激发幼儿学习兴趣为主,尚没有系统化针对中学数学为核心的教学应用。笔者更是关注到目前中学生在数学学习上一大核心困难便是对几何,尤其是立体几何出现的理解障碍。虽然如今正在进行多媒体教学的课改,但其更多还是体现在提高课堂效率的价值上,在帮助学生构建空间想象能力以及认识立体图形上依旧有所不足。结合如今正高速发展的增强现实技术,笔者由此出发进行了增强现实场景下中学数学教学系统的设计,并将快速转换抽象的数学关系定义为生动且准确的数学图形作为目的。笔者将系统划分为三个部分:用户输入、迭代计算以及渲染绘制,并且围绕核心目的对三个部分进行了不同的设计。笔者将 Unity 作为核心开发引擎,且在其中引入了 EASY AR 以及 Azure 空间锚点的辅助,拓宽系统的使用场景,以及为后续系统扩展改进留下可能性。
2. 系统设计
* 本课题的目的是构造一个基于增强现实的中学数学教学系统,通过直观便捷的用户界面按钮来快速绘制师生所需要的几何图形。因而系统的设计必须满足一系列的需求,其中大部分是参考过去相关的研究而综合得到的:
* 数学对象应该用师生所熟悉的方式表达,系统不需要输入完整的数学题目文字表达,因为文字经常是带有歧义的,而使用人工智能来解析语义又会加重整个系统的负担,不利于高效使用
* 系统应该被限定在中学数学的领域中,数学表达式的形式应该采用中学通用的形式,从而便于师生理解以及应用
* 由于师生传递的数据仅仅是数据结构,而图像的解析与绘制是在本地完成的,同一种数学关系解析出的结果应该是一致的,这样才能保证师生在交流上的一致性。
* 对于有歧义的表达,系统理应提醒用户其多解性,这可能是题目设计的陷阱,也可能是一些错误的输入所导致的
* 系统应该足够高效来满足课堂教学的需要,数据的输入以及图像生成都需要便捷快速
* 对于有错误的表达,即无法绘制出的图形,系统理应提醒用户其错误性;而对于多解性的表达,系统每次只可能提供一种图形,而不会列出所有可能性
* 系统应该足够高效来满足课堂教学的需要,数据的输入以及图像生成都需要便捷快速,同时视觉复杂性应该较低,不掺杂多余的信息影响教学目标的实现。
* 输入的数据应该是可以保存以及传输的,满足教师课前备课的需要,而不是每次都在上课时重新输入图形数据。
* 为了达到这些目标,参考卡内基梅隆大学的 Penrose 系统,笔者从一般情况下人类用手绘制图形的方式上获得灵感。首先,在中学数学领域内,每一种对象都是有约定俗成的一个标准的表达式以及可视化图标。例如,点常以一个大写字母表示,而绘制成一个小黑点。为了产生一张正确的图形,用户必须输入一系列数学表达式,而系统则将这些表达式系统化地翻译成图标,最后在绘制的过程中管理并汇聚这些图标在画布上。笔者所需要做的就是将这个用手绘制的过程形式化从而让计算机能够进行计算。就如同约翰·希尔勒的“中文房间”实验一样,这一个系统没有真的必要去对数学有深度理解,它只需要能完成翻译工作即可。因此这一系统并不会解决所有绘图上的困难,它只能局限于设定好的中学数学这一语境当中。因而用户仍然需要在输入时确保以下的要素:
* 输入的数学表达式是有合法的
* 确保输入的图形是能绘制的,且能正确传递意义
* 大部分情况下,系统对于输入的限制可以确保这些条件,但并不能完全排除用户进行了非法的输入。系统只会简单完成其翻译工作,对于无法绘制出的图形可能会进行提醒,但也有可能直接给出错误的结果。
* 与此同时,不能指望这一系统解决复杂计算或是数学问题(例如,图灵停机问题或费马大定理),系统的作用仅仅在于绘制图形,并不能帮助求解数值。例如,系统可以通过函数表达式绘制函数图像,从而从图像上大致看到零点的位置,但不能直接求出这一零点的坐标。但相对的,系统可以生成十分复杂的图像,只要用户输入足够多合法的表达式即可。
* 系统通过算法有效地将把绘图过程模型化为一个编译过程,编译的目标一个约束最优化问题而不是一个二进制可执行文件或是静止模型。一旦进行编译,这个问题就可以被使用和复用来生成可视化的图形。Fig.1 说明了系统的高层。
* 基于语言的规则
* 在本系统中一个主要决策便是使用编程式的定义语言来指定数学对象以及他们之间的关系及表达式,虽然对用户来说抽象成为了简洁的用户界面,但依旧没有改变其基本形式。与其相对的是基于绘图的规则,例如常见的几何画板之中,需要用户已经了解如何可视化抽象概念,它使数学内容和一种特定的可视化表现捆绑在一起,因而对于还处于学习过程中的学生来说,并不总是友好的,通常初学者难以用其画出正确的图形。一个基于语言的规则提供了抽象层用于分割数学对象和可视化图形,这个规则也确保了师生对于输入的认识一致,因为语言是最常见的方式来表达数学思想以及定义。
* 从系统设计的角度来看,一个基于语言的规则提供了一个统一的表现形式,更易于底层框架的设计,对整个翻译管道来说,输入的形式上更为一致。而且,如果有必要的话,这也使得新规则的加入更为简便。考虑到师生应用的需求,他们只需关注到输入和最后的绘图结果,而无需对系统计算的过程有任何了解,因而权衡利弊之下,简化了暴露给输入部分的接口——只保留简单的按钮。但这也导致若师生想对系统进行自定义的更改是无法实现的,对于系统的扩展和个性化应用并不友好。
* 用户可以通过点击按钮直接完成定义式语言的输入,例如点击 Point 按钮,系统会自动根据当前已有的点,生成一个新的点,并为其命名。这个过程就类似于程序中的声明新对象的语言,只不过这个过程被简化为了按钮点击,而无需用户对语言具体认识而手动输入。
* 但对系统来说,输入究竟是一个按钮还是一句声明语句是没有区别的。系统只会关心,整个结构中有几个点,而不会在意每个点是怎么来的,因而整个系统依旧可以用基于语言的规则进行设计。用户按钮会自动生成对应的语言提供给系统,而后系统根据语法生成对应的数据结构保存在内存之中,等待绘制过程中使用。
* 这样的设计虽然舍弃了一部分基于语言的规则的灵活性,但却依旧保留了整个系统的高效性以及简化了用户输入的操作和上手难度,笔者认为对中学数学教学场景来说更为友好,而具体的底层框架以及用户界面设计将在后续的段落中提及。
* 基于优化的绘制
* 本系统的第二个主要设计决策是使用限制的优化方法来进行图的绘制以满足给定的条件。这个方法也是受益于人们平时用手绘图的方式(Fig.2):一个点一个点绘制,直到其满足所有目前能满足的约束。在复杂的情况下,绘图者可能会调整之前的点的位置使全局图形更为精准,但通常不会超过几次。将这个绘制过程自动化就可以使得乏味且易出错的手工绘制任务变得简单而且快捷。
* 有很好的理由来相信基于优化的绘制方法可以扩展到非常复杂的图形中。首先,一个直观的图不需要在全局范围内保持最优,坐标也不用完全精确,而更应该关注到局部改善,例如文本可以简单地更靠近它标注的对象附近。实际上,不同的局部优化可以提供有用的案例来帮助学生构建对图形的直觉。其次,即使是复杂的图,其自由度也依旧少的惊人,系统的绘图以及翻译逻辑都是不会改变的。最后,更为智能的绘制模式中,系统理应能通过过去绘制过的图形来简化局部绘制的过程,例如当识别到等边三角形时直接生成对应的关系,而不是再次通过迭代进行计算,从而优化整个复杂过程。当然这在目前的系统中并未加以实现,因为中学理应并不会涉及到如此复杂的情况。
* 在我们的系统中,图的规划与解题的细节是相联系的,规划的过程即是解题的过程,但输入以及绘制的过程是与之相分离的。因而在未来,输入和绘制的部分都是可以被扩展的,只要能将新的输入转化为约束关系,或是加入更多自定义的 Shader 脚本都能与核心部分保持高度兼容性。基于优化的方法的主要开销是把需求放在了底层系统设计上:所有的输入最终都需要转换为点与约束关系式,这些需求可以通过标准数学方法来极大满足。
* 通常来说,图的优化本身就是有个富有挑战的问题,笔者当然不是为了在这篇文章中完全将其解决。当前,本系统仅仅使用一个通用的约束下降的方法来求解。当然,笔者也很高兴找到这个简单的方法来处理中学数学中大部分的图形绘制方法,并希望它能真正对教学起到帮助。
* 开发引擎
* 目前市面上成熟的开发引擎已经有许许多多了,各类增强现实开发的插件也屡见不鲜,因而高效性成为了笔者主要选择的根据。Unity 作为业界广泛使用的开发引擎,有着其独到的优势。首先,其集成的图形化界面使得用户界面设计以及控制逻辑上的开房变得十分快捷。此外,所需的调整和变动都可以实时在编辑器中看到,可以直接从用户角度体验程序的运行,十分利于面向用户的系统的开发。笔者在此系统中,选择了 Unity 2019.4.3f 版本进行设计与开发。
* 同时,Unity 也支持直接编写 Shader 脚本以适应不同的渲染需求。更是提供了 Frame Debugger 之类的辅助调试插件,很大程度上缓解了编写 Shader 脚本时查找 bug 的难度。其最大的优势在于材质球的存在,通过调整 Shader 代码以及其中的部分参数,可以直接从材质球上看到渲染的变化,而无需每次都通过运行程序进行观察。这无疑比起直接使用 OpenGL 或 DirectX 进行绘制脚本的编写方便了很多。
* 最后,本系统涉及到的增强现实技术也在 Unity 中有着开发者工具包,在比较了 Vuforia 和 EASY AR 两种主要插件以后。笔者发现后者不会带有水印且没有识别次数的显示,是完全免费的增强显示引擎,且也是现今国内最好的增强现实开发插件。因此,笔者在此系统中选择了 EASY AR 作为增强现实的主要开发工具。而服务器则采用了微软提供的 Azure 云来进行同步,其也在 Unity 中有着较好的集成插件,便于开发。此外,Azure 也提供了空间锚点的功能,即将虚拟物体绑定到真实物理空间之中,以满足多用户多终端多平台的共享。虽然这在目前的系统之中看起来并无大用,但在未来笔者相信随着虚拟现实、混合现实技术相继走入课堂,这样一个多平台的服务将会为系统改进提供巨大的可能性。
* 相关的系统
* 笔者在这里其他一些把抽象数学关系转换成可视化图像的系统,相比于其他类型的工具,本系统的优势在于对师生使用较为友好,既能满足课内课外学生对于数学图形的理解需求,又保证了高效性,不会拖慢教学节奏。但其他类型的工具依旧有其无法替代的优势可以进行借鉴,因而笔者也对其做出了一定的分析与探讨。
* 目前市面上有三种主要的系统来转换抽象的数学输入为可视化图像:
* 基于语言的系统,例如 TikZ。它是一个域无关的系统,而且在可视化图像上提供了很强的灵活性。其类数学语言的使用对笔者的系统是由一定指导意义的,然而现存的系统对于用户的使用还是有一定的要求,例如需要首先学习其语法才可以开始绘制。尤其是在一些复杂图形上,初学者常常会难以下手不知从何开始,因而并不适合中学师生的学习使用。基于语言的系统提供的强大的绘制灵活性是十分重要的,因而在本系统中,底层依旧保持了基于语言的系统的设计逻辑,但在用户层级上,则做出了一定的改进从而满足中学数学教学的使用场景。
* 基于绘制的系统,例如 GeoGebra。它使标准化数学表达可以被使用作为输入然后自动化生成富有吸引力的图。仅仅作为一个图形计算器对于大多数学生来说是十分易于接受的,且整个绘制过程都是十分流畅且美观的,但同时其也有只支持平面图形的局限性。但其界面设计也是值得笔者学习,并在本系统中有所体现的。不过其绘制方式在立体场景并不友好,用户很难在平面上拖动出不同角度不同深度的点与线段。除此之外,对于一个数学初学者来说,面对第一次遇见的数学定义的图形,要求其直接用点线面将其绘制出来也是有所困难的,因为其脑中并没有正确的答案。因而笔者也对其做了一定程度上的更改与简化,减少用户使用时所需要做的输入,而直接将完整的图形呈现给用户,更适合中学生初学使用。
* 最后则是例如 graphviz 这般针对特定领域语言转换成高质量图像的系统。其特点在于其十分强大的便利性,但其缺点也十分明显,便是定制化过于强,几乎没有办法扩展和定义新的可视化内容。本系统也参考了其一部分的设计,为中学师生数学学习需求进行了定制化,从而以牺牲系统的可扩展性为代价加强系统的便利性。
* 本章小结
* 在本章中,介绍了整个系统设计的目的是构造一个基于增强现实的中学数学教学系统以供中学师生使用,同时罗列了系统的主要需求,以及由此出发的诸多思考。首先,笔者将整个系统的语境限制在了中学数学这一语境当中,且对系统具体应该完成的工作进行了定义,即将用户输入编译为一个约束最优化问题,再通过解决这个问题进行绘制。由此提出了在编译过程中使用基于语言的规则,这一规则的提出是为了保证整个系统有一个统一的行为过程,即一致的对象定义以及一致的对象计算的方式,但笔者也从中舍弃了一部分灵活性而简化了用户所需要进行的输入操作,以让整个系统变得更加易用。同时,在绘制过程中使用基于优化的绘制策略,这是从人们平时手绘图形的行为方式中获得的灵感,笔者将这个过程使用代码进行了自动化计算,具体的实现逻辑将会在下一章节中叙述。此外,笔者对于开发引擎的选用进行了说明,并比较了相关类型的其他系统,分析其优劣从而对本系统的开发提供指导作用。
3. 底层框架
* 本系统的底层框架包含三个主要部分:
* 数据结构:声明了数学对象及其定义,同时提供了一系列绘图计算所需要的方法
* 迭代计算:根据用户输入的数据结构进行迭代绘图计算
* 渲染脚本:将绘图计算的结果渲染至画面上
* 一次完整的绘图必须包含这三个主要部分,在这个部分笔者通过运行一个渲染等边三角形的例子对三个部分进行说明。
* 数据结构
* 数据结构是整个系统的根本,决定了如何用户如何进行输入以及系统如何根据输入进行绘图计算。数据结构由三个主要部分组成:
* 点(Point)
* 即图形的基本构成单元。点的基本属性有名称、三维空间坐标以及一个状态。前两者无需过多赘述,状态则是标记这个点是否完成或可以进行计算的一个变量。整个绘图计算的目标就是将所有点的坐标进行移动,从而使得状态更改为已完成。可以说只要所有的点的坐标确定了,那剩下的绘图只有连线和面绘制的部分了,就相当于已经完成了。
* 考虑到简化用户的操作,因而点是不可以直接指定坐标的。虽然笔者在本身的设计中提供了这个方法,但发现用户经常会出现错误输入,而且加重了进行初始输入的负担,且在立体空间中如此操作对大部分用户来说难以想象。
* 对用户来说,他们只需要关心图中有多少个点即可,具体的坐标和状态都是由系统进行修改和操作的,这样设计更符合这个系统的初衷。
* 线、面、向量等数学对象(Object)
* 它们的共性在于都是点的集合。无论是哪个对象都是由两个或多个点构成的,确认点的位置就是确认了数学对象的位置。而数学对象之间的关系则表现为了约束,因而数学对象是点到约束的中间载体。当然每种数学对象都有着自己特殊的属性,例如线有方向,面有法向量等等,这些属性都会在约束的计算中被使用到。
* 这是用户最需要关注的一个部分,因为一个完整的图形就是靠这些数学对象来构成的,而这个系统的初衷就是将抽象的数学表达关系转换成具体的图形,即帮助用户理解这些数学对象具体应该出现在图的什么位置,从而加深对数学表达的理解。因而用户需要去明确具体图上有哪些数学对象,以及它们之间的关系从而指定约束。
* 约束(Constraint)
* 即数学对象之间的关系。约束将其用数学公式抽象成点之间的关系,以方便后续图形迭代时的计算。此处笔者根据中学数学常见考题类型,将约束分为以下十四种关系:
* 线段长度:例如 AB = 1,即表示线段 AB 的长度为 1 个单位长度
* 线段相等:例如 AB = AC,即表示线段 AB 与线段 AC 长度相等
* 线垂直:例如 AB ⊥ AC,即表示线段 AB 与线段 AC 互相垂直
* 线垂直于面:例如 AB ⊥ 面 ACD,即表示线段 AB 与面 ACD 互相垂直
* 线平行:例如 AB ∥ AC,即表示线段 AB 与线段 AC 互相平行
* 线平行于面:例如 AB ∥ 面 CDE,即表示线段 AB 与面 CDE 互相平行
* 线段相交:例如 AB 交 CD 于 E,即表示线段 AB 与线段 CD 相交,且交点为 E
* 中点:例如 C 为 AB 中点,即表示 AC = BC,且 AC ∥ BC
* 点在线上:例如 C 在 AB 上,即表示 AC ∥ BC
* 点在面上:例如 D 在面 ABC 上,即表示 S△ABD + S△BCD + S△ACD = S△ABC
* 角度相等:例如 ∠ABC = ∠ABD,即表示角 ABC 与角 ABD 的角度相等
* 面平行于面:例如面 ABC ∥ 面DEF,即表示面 ABC 与面 DEF 的法向量互相平行
* 面垂直于面:例如面 ABC ⊥ 面DEF,即表示面 ABC 与面 DEF 的法向量互相垂直
* 面积:例如 S面 ABC = 1,即表示面 ABC 的面积为 1 个单位面积
* 约束是将用户输入的数学对象之间的联系,通过系统抽象为点之间的关系,并作为迭代计算的目标存储在系统之中。因而约束还需要迭代运算时所需要的梯度值,以及当前约束所需要的表达式和迭代方法。值得一提的是,约束也有一个状态变量,标记这个约束是否完成或可以进行计算。决定一个约束是否完成则取决于这个约束相关的所有点是否完成;当有一个点未完成时,约束则认为可以被计算,从而确定这个点的位置;而当两个以上的点未完成时,约束则被认为无法计算,需要等待其他的约束先进行迭代。
* 这样设计的好处是将抽象给系统的部分以及需要呈现的用户的直观的部分进行了一个分离。对于用户来说,他们并不需要关心具体哪个点在什么坐标,因而系统并不支持对于点坐标直接的输入。但与此同时,数学对象之间的关系又是用户十分关心的重点,因为这有这部分输入准确才能保证最后图像的质量,所以数学对象层的出现是十分有必要的,提供给用户一个清晰和直观的输入方式。
* 而对系统来说,它并不需要关心图上有哪些数学对象,它只负责把点按对应的约束排列好即可。如此说来,系统只需要点和约束两层数据即可完成计算任务,所以此时约束层对系统来说就是尤为重要的。由此说来,数学对象层完成了一个翻译的工作,将人类能理解的数学语言转换成系统所需要的点之间的关系,再将系统计算得到的结果,通过数学对象层进行绘制,是整个系统中必不可缺的一部分。
* 迭代计算
* 广度优先搜索(Breadth First Search)
* BFS 是在图中常用的遍历搜索算法,简单来说就是从图中的一个点开始,不断系统地展开以遍历图中所有的点。所有被遍历的会被维护在一个先进先出的队列之中,同时还需要维护一个已经被遍历的点的列表,即可快速有次序的遍历整张图。
* 在我们的系统中,绘图的过程其实就是遍历所有的点并确定其坐标的过程,而每个点的坐标又是与相邻的点有直接联系的。因而采用广度优先搜索来遍历图中所有的点更为合适,就如同人们在平时自己绘制图的时候思路一样,从一个点开始,然后不断扩展其周围的点,最终完成整张图的绘制。
* 约束最优化问题
* 一个点的坐标的确定由其关联的所有约束共同决定,因而其实求解点的坐标的过程就是求解一个约束最优化问题的解,而且这些约束关系在约束处理时都已经转化为零点问题,即求一个数学表达式的零点,而变量则是这个点的 xyz 坐标。因而在我们的系统中,整个求解过程实则是在求解满足一组三元多次方程组的解。只不过这个方程组方程的数量以及次数是不确定的,因而并不一定能直接求解得出。
* 但我们也不难观察得出几乎所有的约束都是线性变化的,因而都可以通过梯度来进行一致的计算行为。即将点当前的 xyz 坐标代入约束表达式,比较其值与零的关系,再根据约束表达式求出 xyz 对应的梯度值,再将点根据这两个值进行相应的移动,完成一次迭代。Fig.3 以直线长度为例说明这一过程。
* 但这个过程是会存在一定问题的,尤其是在当多个约束同时影响一个点时,会出现如 Fig.4 的冲突。因而参考梯度下降算法的过程,在进行移动时需要加入一个随机偏移量,避免两个约束的值在极限点来回偏转导致死循环。
* 此外,每次点根据约束移动的步长也需要进一步处理以加快迭代效率。例如在梯度较大时,减小移动的步长可以避免跳过了目标值而反向多次迭代;反之梯度较小时,步长也可以适当加大更快靠近目标值。而当约束的结果已经很接近目标值时,步长就应不断减小,使其最终能达到目标值。为了达到这个目的,笔者在系统中针对约束值以及梯度值进行了步长的分层,这个分层也可以用来控制整张图的精度。但在实际使用中,用户并无法区分三位小数精度以及四位小数的精度,因而为了程序效率,精度可以适当降低。
* 当一张图的所有点及约束输入完成后,即开始系统的迭代。此时,系统需要维护一个队列,存储了当前待更新的点,以及一个存储了已经完成的点的表。
* 整个系统的迭代计算过程的灵感完全来自于人们通常手绘的方式。大致分为三个步骤:
* 步骤一,选择初始点。这与平时我们绘图的顺序是一致的,面对一个图形,第一步往往是随便选择一个点先绘制在纸上,而这个点通常是 A 点。系统即是在模仿这个过程,在计算的一开始,先选择一个点,将其设置在画布上,并将状态标记为已完成,之后的整个迭代都不再会对这个点有所改动。同时将这个点所关联的其他点加入队列中,以便后续迭代。值得注意的是这个点不应被设置在原点,因为这对后续点的迭代是不利的,可能会出现重合的情况而导致出错,例如线段失去了方向向量。所以初始点的坐标在系统中将会参考外点方法,将其置于无穷远处,通过将其他的点不断移动至初始点附近从而完成整张图。在完成后再将初始点移动至坐标原点,让图形能够正确显示即可。
* 步骤二,迭代所有待更新队列中的点,判断其状态,这也是整个程序的主要循环部分。
1. 将这个点相关联的其他点加入队列中,确保整张图的遍历依旧在进行。
2. 判断这个点是否已完成,若已完成则踢出队列,将其加入已完成的表中,回到1;否则继续下一步
3. 判断当前点有多少个相关的约束以及其中有多少个可以计算的约束。
* 若约束全部完成,则修改点的状态为已完成,并踢出队列,将其加入已完成的表中,回到1;
* 若有可以计算的约束,则通过梯度移动点的位置,使得约束得以满足。需要注意的是,此时可能会出现多个约束需要同时计算的情况,因而它们需要同时进行满足,迭代应是在它们之间循环,而不是优先某一个约束进行计算的。特别的是,如果此时只有一个约束需要计算,则不需要经过迭代,可以直接设置点的位置以满足该约束。
* 若出现没有任何一个约束完成且没有任何一个约束可以计算的情况,则说明这个点是自由的,因而可以直接为其随机一个坐标,当然在通常的绘制过程中不应该出现这样的点。
* 若约束只完成了一部分,且没有可以计算的约束,则说明这个点的位置还有可能改变,因而将其重新加入队列,等待下一次轮到它时再做计算。
4. 当队列为空时,则跳出循环
* 步骤三,检查是否还有未完成的点,若有说明其与之前绘制的图之间没有关联,是独立的部分,重新选择一个点作为初始点回到步骤一;若没有则说明图已经计算结束,将初始点坐标移动至原点即可进行绘制。
* 当然在整个迭代计算的过程中,还有许多需要注意的细节问题。例如,当一个点的坐标发生改动时,其相关的数学对象的属性也势必会有相应的改变,这些都是需要及时更新的,否则会直接导致约束的计算出现错误,从而无法将点迭代至正确的位置。同时,点的状态的改变也会直接影响约束状态的改变,因而这也是需要多加注意的。整个迭代中有多处可能修改点的坐标以及状态,每次修改都应进行相应的检查与更新,以保证整个系统的正常运行
* 渲染脚本
* 顶点优化
* 在迭代过程结束后,系统已经拥有了所有的点坐标以及相关的数学对象的信息,一开始的时候笔者试图直接绘制图形,例如线段就直接调用 DrawLine 函数来绘制。虽然在编辑器里看起来效果还不错,但实际在手机上运行时,由于整条线段的粗细只有一个像素,因而几乎难以看清,尤其是在接入 AR 复杂场景之后,十分难以辨别。因而在绘制操作前还需要对这些坐标进一步优化,扩充其顶点数据。此时就需要使用到 Unity 的渲染管线,具体我们会在下一个章节提到。
* 在这里,我们最为重要的是要先构建一个 mesh 网格来交给 Unity 绘制,其中需要有我们优化过的顶点数据(vertex)以及对应的三角形序列(triangle)。在经过一系列考量和实验之后,笔者决定通过综合线段的方向向量及摄像机的角度来优化顶点数据。
* 将线段扩充成一个圆柱体听起来似乎是一个比较好的选择。但实际情况是在线段相交的地方会出现穿模等难以辨识的情况,尤其当两条线段靠近但并无相交时,此种方式哪怕从不同角度看上去也会像它们相交了一样,而缩小圆柱体半径又与本来的目的相违背。因而这种扩充成圆柱体的想法并不适用于我们的系统。
* 因而,笔者退而求其次,选择了一种略显复杂的方式进行优化。我们的目的是让线段在画面上看起来不那么细,因而只需要在摄像机所能看见的面上做文章即可。即拿到摄像机视图上的 xy 轴,并将线段在这个面上拓宽。而拓宽的方向则与线段的方向向量垂直。这样在单一方向上看起来的效果与上一种方法是一致的,但是在旋转图像时,则可以让各线段之间的关系更加明显清晰。当然这样做的开销也会变大不少。首先,在图像的缩放上,我们也需要同时改变拓宽的宽度,否则图像会变得十分怪异,这很好想象。
* 更为复杂的是,由于需要读取摄像机的角度,因而每帧都需要对图形进行更新操作,而不是只在开始的时候绘制一次图形。但笔者认为这样的牺牲是可以接受的,因为它能让图形看上去更加直观。而且中学数学的图形实际上并不会十分复杂,即使是每帧都更新图形的操作也不会给系统带来过大的负担。
* Shader 脚本
* 默认的 Shader 色彩脚本其实就可以满足系统的需要,但为了丰富学生的兴趣,笔者还提供了一些其他的渲染脚本以供使用,例如 HDPR 的光照模型,彩色渐变的色彩模型等等。用户只需要简单的点击界面上的按钮,便可以完成脚本的替换,看到不一样效果的图形。
* 值得一提的是,点在系统中是不会被渲染的,因为用户往往更关注于图形的整体,若点过于突出的话,会影响对整体图形的感觉。同时,点在中学数学中往往是线段交点的形式存在,非交点的点往往没有作用,因而无需对点进行特殊处理。作为补偿,点的名称将被标注在对应点的附近,但此处有一个遮挡关系,因而只有最前面可见的点会被标注,被遮挡的点没有标注。
* 对于面的渲染提供了一个开关的选项,因为总是渲染面的话将会造成强烈的遮挡关系,导致许多其他数学对象不可见。用户可以自由选择需要的显示方式,以从不同角度和透视中观察结果,从而加深对于图形的理解与感觉。
* 本章小结
* 在本章节中,笔者系统性地说明了整个系统的底层框架的三个部分:数据结构、迭代计算以及渲染脚本。首先在数据结构中,分为点(Point)、数学对象(Object)以及约束(Constraint)三个部分。其中,点以及约束是为了系统进行计算而存在的部分,而数学对象以及约束则是为了用户输入而存在的部分。通过这三个部分,系统完成了一个翻译工作,将人类理解中的数学语言转换成系统所需的点之间的关系,从而进行迭代计算。在迭代计算过程中,系统使用了广度优先搜索算法来遍历整张图中所有的点,并进行一一迭代计算,这与人们绘制图的思路是类似的。而整个求解过程则是在解决多个约束最优化问题,对每个点来说,都是求一个三元方程组的解。因而,系统采用了梯度进行计算,通过不断迭代点的位置,向目标约束的位置移动从而求得最终坐标。在最后的渲染脚本中,系统先对迭代求解到的点的进行了数据上的优化,结合摄像机的角度以及自身的方向向量生成对应的顶点数据,再进行绘制。同时,系统也提供了多种 Shader 脚本供用户选择使用。
4. 渲染引擎
* 在本系统中,渲染引擎特指 Unity 引擎,其主要功能是把整个系统迭代计算的结果渲染绘制成立体的图形。当然用户界面设计以及相应增强现实和空间锚点插件的引入也由其完成。由于在这一部分,引擎的性能负担其实并不大,因而大多数的设计都是以用户体验为主,比如渲染的优化以及用户界面的显示。
* 渲染管线
* 在本系统中,我们使用的是 Unity 默认的渲染管线,使用的引擎版本是 Unity 2019.4.3f,作为一个已经封装比较完整的引擎,再加之整个系统其实对渲染的要求并不高,因而没有必要做过多自定义的渲染操作。当然 Unity 的渲染管线底层也不在系统的研究范围之内,就不在此做过多展开。此外,笔者也考虑使用 URP 管线进行效果更好的渲染,但在实际体验下由于手机性能的问题因为还是选用了常规管线,否则会导致一些贴图无法正常显示。
* 在这个部分要论及的依旧是整个 mesh 的生成逻辑,即我们在 CPU 层级完成的部分。首先一个重要的问题是,一个图形究竟是使用一整个 mesh 来进行绘制还是分为多个部分,例如一条线段一个 mesh 以及一个面一个 mesh。听起来这两种方法的差异会十分巨大,但实际上因为中学数学涉及的图形常常是轻量级的。虽然理论上来说,一整个 mesh 的绘制肯定会比多个 mesh 的绘制更为高效,但这两者的表现在系统中的性能差异几乎是可以忽略不计的。同时,分为多个对象绘制对于图形的修改来说也更为便捷,不用重新刷新整个 mesh 这对系统的实现逻辑来说更加友好。
* 值得一提的是,对于向量的计算来说,在系统中依旧是把其当作线段来进行处理了,因为除了方向以外,其他的行为几乎与线段一致。但是在渲染的过程中,向量需要比线段多绘制一个箭头,这就需要额外进行一次计算,综合其方向在屏幕空间的投影以及终点在屏幕空间的坐标绘制箭头。
* 用户界面设计
* 用户输入
* 在本系统中,用户所需要做的需要操作便是输入数学对象以及其关联关系。因而这一部分的用户界面设计是重中之重。笔者在上文中也提到过一些其他的绘图系统以及它们的优劣势,通过对它们的观察以及对目标用户的分析,做出了目前的实际。
* 首先,我们的系统的目标用户是中学师生,因而大部分人对于并没有任何编程方面的知识。于此同时对大部分使用本系统的学生来说,在系统图形完成绘制之前,他们对于整个图形应该是什么样子的可以说是毫无概念。
* 其次,系统的目标是在课堂上为师生提供一个便捷高效的绘图交流途径,因而不应该再为使用者加重学习负担,让他们在使用前先学习语法是不切实际的。由此看来,无论是基于语言还是基于绘图的系统似乎都并不适合在中学数学教学的场景下使用。
* 因此笔者提出将它们的优劣势相互结合,保持基于语言的系统的高效性,但又保留基于绘图的系统的易操作性。为了保证系统可以用于课堂,它一定要具备高效的特点,即师生可以快速绘制出目标图形。这就要求系统的底层必须是基于语言来设计的,如此系统才能有一个通用的算法快速得出目标图形从而让用户直接观察。但之前也提到,基于语言的系统往往需要用户提前学习相关的语法来定义对象,这就加重了师生的学习成本,同时对于一些不熟悉的初学者,常常会因为错误的输入而得不到想要的结果。这与课堂教学需求是违背的,所以笔者在此简化了这个过程,将系统的语法封装在了用户界面中的按钮之上,如fig.5。当用户点击 Point 按钮时,则相当于使用了语法在系统中定义了一个新的点,同时界面上会显示这个点。这样的操作模式无疑更适合中学师生来使用,且他们能直观看到自己在系统中输入了些什么,从而在错误输入时快速检查更改。
* 当然这样的设计也为系统带来了一些弊端,对用户来说操作过于简化反而减少了其个性化的内容,例如在系统中是不允许用户直接指定点的坐标的。但综合来看,这对大部分师生来说是无关紧要的,他们只需要关心最后整体的图形即可,而无所谓具体的坐标。若需要指定坐标绘制,说明其对图形本身已经有了一定的认识,此时他们应该使用更加开放的系统,例如几何画板来进行绘制。当然这部分的功能是可以扩展延伸的,只不过在目前的需求中并没有这个必要。
* 图形观察视图
* 在这个部分,系统将绘制完成的整个图形呈现给用户观察,用户可以通过手指旋转以及缩放图形,更可以配合 AR 在现实世界中感受其形体。此时对用户来说,观察是唯一的需求以及目的,因而此时界面上将隐藏几乎所有的 UI 以及文字,将最大的空间留给目标图形。当然用户也可以自行开关绘制界面,如若需要进行修改的话。
* 当然这个缩放也是有限制的,用户不能无休止将图形缩小或是放大,因为此时将观察不到任何图形的细节,这样的操作是无意义的。同时,修改物体的尺寸对渲染也是有一定负担,哪怕是在这种轻量级系统中依旧可能发生不可预知的错误,因而缩放的比例有上限以及下限。
* 保存载入
* 最后,系统提供了一个保存载入图形的方法。当用户选择保存时,系统将会自动按数据结构将图形数据进行序列化,而后保存到一个二维码中。通过分享这个二维码,其他用户就可以在系统中载入这一图形的数据,并进行相应的绘制。当然这是一种离线的操作行为。
* 课堂上为了更高效的操作,系统也提供了课堂内共享的方式,即师生可以通过登录同一个服务器来进行实时同步。当然在这种情况下,只能进行图形的观察,而不能进行任何程度的修改,否则很容易出现多人同时修改而导致的冲突。所以对教师有了一定的备课需求,但这种需求相对于板书或是其他软件的绘制都是小巫见大巫罢了,同时也有着更好的教学效果。
* 插件使用
* 本系统中使用了两种主要的插件以进行辅助开发:
* EASY AR
* 现在市面上的 AR SDK 选择并不多,大多数人常用的还是高通的 Vuforia,但近年来国内的 EASY AR 也有着良好的表现。相比于 Vuforia,它无需授权,也不会带有水印,更没有识别次数的限制,是完全免费的 AR 引擎。因而笔者选择尝试使用 EASY AR 作为开发插件。得益于其完备的中文版文档,学习及使用都非常方便。
* AR 作为近年来火爆的开发方向,尤其是自任天堂的 《宝可梦GO》以来,收到了各界广泛的关注。其特点便是将虚拟物体与真实世界的结合互补,从而增强用户的体验。最常用的便是图片识别技术,通过设定好的图片经过摄像头扫描,生成对应的图像显示在屏幕中。
* 系统便是采用这一种操作模式,为师生提供更加便捷的操作以及感受。笔者选择了一些中学课本上比较常见的几何图形,并将其数据结构提前录入在系统之中,并为其配置了相应的二维码。当师生使用 AR 功能扫描到对应的图片二维码时,系统便会自动加载对应的数据并生成图像在界面上。这无疑能极大提高师生上课的效率以及学生对于复杂图像的感知。
* 但这毕竟是一个需要投入大量人力才可以完成的工作,因而笔者预设的图形库并不多,还有待在以后不断扩充。同时,如何将这些二维码结合到课本供师生使用,也是日后系统推广时需要思考的问题。当然,由于系统是直接使用的 EASY AR SDK,势必会带有一些其本身就有的问题,例如不能支持用户快速旋转移动等等,但这些问题本就是目前 AR 开发者们在不断致力去解决的,笔者自然不能指望在这个系统中完全解决。
* Azure 空间锚点
* 现今市面上的云服务器是否众多,若仅仅是为了课堂同步数据,自然有许多更为高效与方便的选择。但本系统在这里选择了使用微软提供的 Azure 云,核心便在于其专门为了 XR 提供的空间锚点功能。
* 空间锚点简单来说便是将用户设置在虚拟空间中的物体,绑定一个现实世界中的物理坐标,并上传到 Azure 云上。此时,访问同一个云的用户,便可以在他的 XR 设备的同一地点看到被绑定的物体,就仿佛现实中这个物体就是存在的。
* 首先,其提供了强大的多用户多终端多平台的共享功能。只要在同一个地点,多个用户可以在同一个位置看到同一个物体,且可以自由选择想要的角度进行观察,就如同这个物体真实存在,这与课堂交流的目标是十分契合的。而且,它还允许多平台的用户进行共享,只要访问同一个 Azure 云,无论是虚拟现实、增强现实还是混合现实,都可以共享这一物体。这对系统在未来的延展性也作了一定的保障,笔者认为在未来,VR 头盔以及 MR 眼镜走入课堂是十分有可能的,在国外许多大学已经开始开创这样的先例。因而,虽然在本系统中使用这个技术颇有些杀鸡焉用牛刀的意味,但这也为系统日后的改进奠定了一定的基础。
* 但使用这一技术也是伴随一定代价的,其渲染是通过在云端远程渲染之后再传回给用户的,因而这就要求用户需要有着高速的网络连接,就当前的课堂情况来看,或许还并无法实际运用。但笔者相信在不远的未来,随着 5G 网络布局的不断完善,这一困难也会被很好解决。
* 开发环境
* 整个开发过程都是 Windows 10 上完成,使用的引擎版本是 Unity 2019.4.3f,结合其安卓以及 IOS 平台开发工具。
* EASY AR 插件的版本为 4.2.0。
* Azure 空间锚点的配制较为复杂,需要使用:
* AR Foundation v3.1.3
* Windows 混合现实(用于支持 HoloLens 设备)v4.2.1
* ARCore XR 插件(用于支持 Android 设备)v3.1.3
* ARKit XR 插件(用于支持 iOS 设备)v3.1.3
* 测试使用的安卓手机型号为:xxx,系统能正常且流畅的在其上运行。
* 本章小结
* 在本章中,笔者说明了渲染管线的选择以及使用,底层均由 Unity 引擎来完成,极大减小了开发上的成本。而系统将更多的精力花在了 mesh 的构建上,对每种数学对象进行了分类,逐个计算其 mesh 中的顶点数据,牺牲了一小部分性能的情况下,使得整个系统更为简单。在用户界面设计上,笔者综合了在绪论中提及的几大常见数学绘图系统的特性,以在课堂上为师生提供一个便捷高效的绘图交流途径为根本目的,选择了以按钮为主的用户操作模式。这一设计虽然使得系统个性化的内容收到制约,但也提高了整个系统的易用性以及高效性。而在图形观察视图中,系统也提供了一系列特性保证用户可以最大程度上观察图形细节的同时不会误操作。此外,系统也提供了以二维码为载体的保存载入功能,以供师生互相沟通。在插件的使用上,系统以 EASY AR 以及 Azure 空间锚点为主,前者结合二维码为课堂提供了更高效的观察立体图形的途径,而后者则为系统提供了师生共享的特性。但插件的使用依旧带来一系列问题,例如一些错误的判断以及对网络环境过高的依赖,需要日后系统以及插件方共同尝试解决。
5. 事例与评估
* 本系统的目的是构造一个基于增强现实的中学数学教学系统,快速转换抽象的数学关系定义为生动且准确的数学图形。这里,笔者列举了一些本系统适用的情景进行图形的绘制,并对其性能做了一定分析。所有此处的事例都是由系统自动计算得出,笔者没有进行任何手动的修改。
* 平面几何
* 向量
* 立体几何
* 性能表现
* 本章小结
6. 未来的工作
* 师生如何在课堂上高效直接沟通数学思想一直是中学教育中的一大难题。尤其是对几何不敏感的学生来说,即使配有二维图片依旧会遇到想象上的瓶颈。而 AR 的出现则提供了一大契机,让学生有机会通过虚拟几何图形结合现实世界的方法,多角度观察几何图形,从而加深对于其的感受与理解。本系统的设计始终围绕这一核心目标进行,不断简化对使用者的要求,从而让各式各样的学生都能从中受益。
* 但目前系统的设计依旧存在一系列缺陷,笔者希望能够在未来的工作中能够改进。首先,系统的设计过于封闭,几乎没有提供外部开发者能够介入的接口,这就使得城市或是学校之间若需要做一些自定义的改动变得十分困难。同时如果发生了课改,需要加入一些新的约束或是数学对象也需要直接对系统底层进行修改,十分不方便。因而如何将这部分很有可能需要变化的部分从系统中抽离出来,是未来可能需要考虑的一个重点。
* 其次,当前的迭代过程是直接在 CPU 中运行的,在测试中可以看到当一个点有多个约束时,所需要的计算时间是呈指数级增长的。虽然在中学数学中不太会出现如此复杂的情况,但若在加载复杂图形时,系统出现了长时间的未响应,会让用户觉得系统出现了问题,从而降低用户体验。所以系统中的迭代算法也是需要进一步优化的。
* 此外,整个系统的美观性也有待商榷,笔者的设计大多以功能层面出发,因而并没有对界面的美观做过多的设计和调整。在未来也需要专门针对这一部分进行设计,改善用户体验,才能让系统更受欢迎。
* 最后,也是笔者所希望看到的,随着目前虚拟现实以及混合现实技术的不断发展,其应用场景也不断增多,甚至也有可能走进中学的课堂。因而,笔者也希望系统能开发出在 VR 头盔上运行的虚拟现实以及在 HoloLens 眼睛上运行的混合现实的版本。综合在系统中使用的 Azure 空间锚点技术,使得整个中学数学学习的氛围以及过程更为有趣以及生动。
No preview for this file type
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment