增强现实:必知必会的工具与方法(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-21 03:18:30

点击下载

作者:(美)穆勒(Mullen, T.)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

增强现实:必知必会的工具与方法

增强现实:必知必会的工具与方法试读:

前言

增强现实(Augmented Reality,AR)这个术语描述的是向实时媒体中融入虚拟内容和数据所需的各种技术。增强现实的理念就是在实时媒体中尽可能无缝地融入并不真实存在的东西,以此来增强显示用户周围的世界。这个增强可以是任意形式的,可以在实时场景上覆盖一条文本数据,也可以把完整的、交互性的3D图形场景融入真实世界。

增强现实的实现主要依靠两种硬件。一种是能够采集真实世界的信息的硬件,采集的信息包括影像数据、位置数据、方向数据,以及可能的其他形式的数据。另一种是在重现实时媒体时能够融入虚拟内容的硬件,并且要能够以一种有意义的、有用的方式来融入虚拟内容。

随着近年来智能手机的普及,现在几乎每个人的手机上都有令人激动的增强现实功能。这导致人们对于移动平台和一般平台上的增强现实开发的兴趣呈爆炸式增长。随着笔记本电脑和台式机上的网络摄像头的广泛使用,用于营销和创造性用途的基于浏览器的增强现实开始走向繁荣。低成本摄像头和显示器也使人们能够低廉、便捷地建立起实时的增强现实装置,就像乐高(LEGO)公司在他们的一次精彩的基于增强现实的市场营销活动中所做的一样。在这次活动中,增强现实装置安置在玩具店中,当客户把玩具箱子对准摄像头时就能够在显示器中看到完全融入实时摄像头视频中的完整3D模型。

增强现实有多个重要的种类,并且每个种类自身又是一个宽泛的主题。当前关于手机增强现实的书籍主要关注利用移动设备的位置(GPS)和方向(加速计)数据来向真实场景添加注释或者融入内容的增强现实。这些应用知道你的智能手机上的摄像头观察的是什么,因为它们知道你的方位,以及智能手机正面对哪一个方向。基于这些数据,就可以把由集中式服务或者其他用户已上传的注释覆盖到你的摄像头场景上。

另一个增强现实方式是使用由摄像头捕获的实际图像内容来确定摄像头观察的是什么,该技术被称为计算机视觉(computer vision)。计算机会处理每个视频帧的每个像素,评估在时间和空间上该像素与相邻的像素之间的关系,并识别图案。此外,当前计算机视觉技术还包括精确的面部识别算法、识别视频中的活动物体,以及识别熟悉的标记(marker)或者使用一个非常强大的算法识别出特定的视觉图案的能力(以一种健壮的方式)。

基于计算机视觉的增强现实技术既可以用于移动设备,又可以用于非移动设备。它既能够用来增强基于位置和方向的增强现实方法,又能够用来创建不会以任何方式依赖某个特定位置的增强现实应用。计算机视觉算法能够用来识别包装材料、产品、衣服、艺术品,或者在其他环境中的很多图案。

本书关注基于计算机视觉的增强现实的技术和工具。除在营销活动及其类似情况中的潜在用途之外,基于计算机视觉的增强现实是非常有趣的,并且在我看来还与魔术有点类似。这就是促使我开始研究这个主题并最终写下本书的原因。我想当前只是对于这个技术的创造性的探索之初,我热切地渴望看到人们对于这一技术进行深入探索。这也是本书更倾向于那些喜欢探索各种可能性的、有创造力的人的原因,这些人还没有在软件方面陷得太深。

为了达到这些目的,我试图保持讨论的技术能够尽可能简单易懂。这就是为什么本书大部分内容是关于Processing编程环境的原因。Processing可能是用于创建视觉、交互程序的最容易理解的一个编程环境。Processing是开源跨平台的,是专门根据设计师和创意人士的需求设计开发的,即为那些没有必要成为一个高度熟练的程序员的人开发的。Processing有一条比较平缓的学习曲线,尽管简单但非常强大。除了学习Processing中的编程基础知识外,你将会学到怎样使用开源3D应用Blender来创建3D动画内容。本书的这一部分是完全可选的。如果你想继续学习其他章节而不想自己制作,那么可以下载本书提供的3D内容文件。

为了使本书尽可能容易理解,我也会讲解基于标记的增强现实技术。标记是为增强现实系统提供容易识别的可打印图案参考点。由于需要使用真实世界中的标记,基于标记的增强现实技术有一些明确的限制。有一种无标记增强现实技术(markerless AR)可以实现一些匪夷所思的事情。无标记增强现实系统能够参考一个视频流中的其他可识别特征来创建增强现实环境。例如,一个无标记增强现实系统可能不需要明确的打印标记就能识别出人脸或者其他物体。

现在的问题是,我所知道的可用的无标记增强现实技术对于非程序员来说并不容易理解。与此相反,我认为若一个基于标记的增强现实工具库的变体则会好很多。这种情况肯定会在将来得到改善。写作目的

本书的写作目的是全面介绍用于创建基于计算机视觉和标记的增强现实内容的一些最方便、可用的工具。在做这些时,一定量的编程是不可避免的,但是编程不是本书的主要目的。本书将教会你如何使用各种各样的工具,其中每种工具都有不同的功能和优势。虽然有重叠部分,但是每种工具都有一些不同的编程技巧。为了充分利用这些工具,你需要继续深入学习你所选择的编程环境。市面上有很多讲解Java或者ActionScript 3D编程的书籍供你参考。

相反,本书将会给予你创建增强现实应用并在计算机(可能是Android移动设备)上运行的机会,并教会你关于创建增强现实作品的基础知识。基于增强现实技术,你就可以快速地创建一个交互性的增强现实应用。一些章节会较多地涉及需要实际操作的编程活动,而另一些章节可能更多的只是提供对技术的粗略一瞥。你不需要编程技巧就能看懂本书的内容,但是如果你想要深入学习其中的一些主题,那么就需要有一定的编程经验。

基本上,本书的目的就是要激励你这样做。本书可以使你具有以各种设置创建增强现实应用的潜力。可能基于物理计算的增强现实应用的潜力让你印象深刻;可能你将深入学习Arduino和Processing环境;可能你会有创建一个基于Flash的增强现实游戏的伟大想法;可能你会一头扎进ActionScript的学习中;或者可能本书会激励你深入学习Android 3D开发。无论何种情况,本书的目的是帮你迈出第一步,而不是最后一步。读者对象

本书的主旨并不是关于怎么创建精良的、部署就绪的软件,而是以尽可能快速和简单的方式去试验和演示增强现实应用。出于这个原因,本书的主要目标读者是那些有创造力的,渴望探索增强现实的潜力的人,他们会创造带有融合了虚拟和现实场景的、有趣的、交互性的应用。本书会有意避免讲解需要特定编程经验的内容。即使你没有任何编程经验,也能看懂并做一些有趣的事情。

这并不意味着本书对于专业的、经验丰富的开发者来说一点用处都没有。本书对于有经验的开发者的价值主要在于本书所介绍的有趣的技术和库。对于具有Java或者ActionScript编程经验的人来说,本书可以作为他们进入增强现实世界的跳板。你可能学不到很多你本来不知道的编程知识,但是你将会学到怎么把自己的增强现实创意变成现实。本书所涉及主题的广度使得即使你是一个拥有丰富经验的开发者,也能为你带来有趣的、富有灵感的新东西。

虽然在本书的描述中,我试图避免对于编程经验的假设,但事实是编程是本书所涉及的一切知识的核心。你所拥有的任何编程经验,即使是不同的编程语言,也会非常有用。对于面向对象编程概念的理解将会非常有助于你对本书的理解,并且我确实认为理解本书的内容理所当然地需要一个基本的编程知识水平。如果你还不理解“for”循环的概念,那么你将会发现本书中的很多内容对你来说都是非常神秘的。

对于在本书中讨论的一些技术来说,编程技巧是你继续深入并创建你自己的内容的前提。例如,如果你不了解Java,那么你根本无法创建自己的Android增强现实应用。本书的目的是循序渐进地介绍某个环境下的增强现实潜力,而不是深入地讲解编程技术。

总之,本书面向的是那些对基于计算机视觉和标记的增强现实技术有兴趣,但又不知道从何学起的人。你能从本书中收获多少取决于你在本书上花费了多少精力。本书主要内容

以下是对本书主要内容的简单介绍。

第1章 增强现实入门 概述了增强现实的概念并概括性地介绍了要在本书后续章节中详细讲解的库。该章还介绍了标记的创建,这个主题与后续所有章节都有关。

第2章 Processing概述 对Processing编程环境做了一个由浅入深的、适合非程序员理解的介绍,并在2D图形示例中讲解了Processing编程的基础知识。

第3章 Blender建模和纹理贴图基础 使用开源的3D建模和动画软件Blender简要地介绍了建模和纹理贴图。

第4章 创建一个低多边形动画角色 第3章的基础上继续讲解创建增强现实应用要使用的纹理低多边形动画角色。

第5章 Processing中的3D编程 继续讲解Processing,以介绍3D编程以及第4章中创建的3D动画角色的作用。

第6章 增强现实与Processing 会利用前面章节中所学到的知识,并通过介绍Processing中专门用于实现增强现实的第三方库,以带你进入增强现实的世界。

第7章 与物理世界交互 会介绍Arduino微控制器和用于物理计算的编程环境。你将会学习怎么创建一个能够接收来自非视频通道的真实世界的数据的增强现实应用。

第8章 用ActionScript和FLARManager实现基于浏览器的增强现实应用 讲解如何使用FLARManager工具集把增强现实创意变成在线版。FLARManager工具集用来创建基于Flash的浏览器增强现实应用。

第9章 用jMonkeyEngine进行增强现实原型设计 介绍ARMonkeyKit。它是一个基于开源的jMonkeyEngine的用于3D增强现实快速原型开发的强大工具。

第10章 安装Android版NyARToolKit开发环境 讲解如何安装用于Android系统的NyARToolKit开发环境,以及怎么在Android移动设备上运行增强现实应用。

附录A 从Blender 2.49到Blender 2.58 教你怎么把在第3章和第4章学到的Blender 2.49的建模、纹理贴图和动画概念运用到Blender 2.58中。

附录B 文件格式和导出 提供了本书中用到的3D文件格式的简明摘要,还讲解了如何以恰当的格式将内容导出到工作环境中。在线配套文件

你可以在本书的配套网站上找到本书各个章节的工程文件,地址:www.sybex.com/go/prototypingar。在许可协议允许的情况下,本书网站也提供了书中介绍的软件的下载,以防止这些软件的对应版本在将来变得不可用。作者联系方式

欢迎你提供对于本书的反馈或者告诉我你想看的书籍。你可以通过如下邮箱联系我:blender.characters@gmail.com。

Sybex会努力为你提供工作所需的最新工具和信息。请访问本书的配套网站:www.sybex.com/go/prototypingar,如有需要,我们会在这里发布附加内容和更新,以补充本书内容。致谢

我要感谢策划编辑Mariann Barsolo、编辑经理Pete Gaughan、开发编辑Gary Schwartz、技术编辑John Nyquist、编辑助理Jenni Housh和Connor O'Brien、产品编辑Dassi Zerdel、文字编辑Liz Welch,以及所有Sybex公司中对这本书的出版做出贡献的人。我还要感谢那些无私地付出自己的时间和精力创建了书中所使用的开源软件的软件开发者,包括ARToolKit、NyARToolkit、Processing、Blender和JMonkeyEngine的开发者。其中,特别感谢ARMonkeyKit的创建者Adam Clarkson,感谢他为本书内容所做的贡献。第1章增强现实入门

增强现实(Augmented Reality,AR)是交互设计的一个令人兴奋的领域,在增强现实中虚拟内容可以无缝地整合到真实场景的显示中。随着可产生有趣的增强现实效果的个人移动设备的兴起,增强现实的巨大潜能开始被发掘出来。本章的目的是帮助你熟悉那些实现增强现实试验和探索所必需的术语、工具和技术。

在本章中,你将学习下面的主题:

●什么是增强现实

●相关的工具和技术

●增强现实的必需元素1.1 什么是增强现实

术语“增强现实”描述的是一个技术组合,即向真实视频显示中实时融入计算机生成内容的技术。习惯上,增强现实与虚拟现实(Virtual Reality,VR)是不同的概念,虚拟现实是指创建完整的、身临其境的3D环境,而增强现实是指使用各种硬件技术来创建一个基于真实世界的、带注解的或者“增强的”复合场景。

有多种方式可以实现真实世界与虚拟内容之间的交互。可以通过使用图像处理和计算机视觉技术让计算机生成元素与影像内容进行逼真的交互。大部分当前基于计算机视觉的方法是依赖预先确定的物理标记来让计算机视觉系统获得它在可视3D空间中的方位。图1-1展示了一个增强现实例子。这个例子中的2个3D模型是使用打印标记(printed marker)来控制的。也存在不需要做特定标记的增强现实系统,这种系统称为无标记增强现实系统(markerless system)。无标记增强现实系统是一个不断进步的研究领域,并且在不远的将来,不需要标记的强大视觉增强现实系统必将获得广泛应用。

不基于视觉增强现实方法在智能手机平台上日益普及。这些方法会使用设备的全球定位系统(GPS),或者其他位置跟踪数据和加速计数据来确定这个设备位于哪里,以及正面向哪一个方向。标签和注释就是基于这些信息叠加到场景上的。这些方法是多个地理注释服务的基础,比如Layar是用来注释位于荷兰的位置的;Mixare是一个开源的混合增强现实引擎,目前提供关于瑞士的数据;Wikitude World Browser服务可以让来自全世界的人贡献定位数据。图 1-1 使用3D模型增强的实时视频

本书主要关注的是基于计算机视觉的增强现实。你将会学习到怎么使用物理标记来向实时的视频中混入计算机生成的3D内容。本书并没有深入介绍基于位置和加速计的增强现实。但是,本书后面的章节会提供与这些技术相关的链接和参考,比如第10章。1.1.1 增强现实简史

增强现实技术起源于早期计算机科学中的计算机界面研究。人们已经在电影和科幻小说中熟悉了增强现实的很多主要概念,这个最早可以追溯到《终结者》(1984)和《机械战警》(1987)。两部电影的主演都是半机械人,都是通过在他们的视觉系统上覆盖一连串的注解和图形来增强显示他们所观察到的世界的。

在接下来的十年中,使用增强现实的实用系统开始被开发出来。术语增强现实是由波音公司的研究人员Tom Caudell在1990年创造出来的。20世纪90年代初期和中期,Caudell和他的波音公司的同事都在开发头戴式显示系统,以使工程师能够使用叠加在电路板上的数字化增强现实图解来组装整理这个电路板上的复杂电线束。由于他们虚拟化了布线图,因此这极大地简化了之前使用大量不灵便的印刷电路板的系统。

在整个20世纪90年代,业界相继开发出了工业和军事增强现实应用。但是实现实用的增强现实显示的技术要求使这个技术无法走近大多数用户,比如笨重、昂贵的头戴式显示设备。

人们做过多次艺术与增强现实技术的结合试验。1994年的第一个增强现实戏剧作品的产生要归功于艺术科技先锋Billy Klüver的妻子和合作者Julie Martin。这个作品叫做Dancing in Cyberspace,在这个作品中,舞者会与投影到舞台上的虚拟内容进行交互。

在20世纪90年代末期,Hirokazu Kato创建的ARToolKit是增强现实的另一个重大进步,它是一个用于创建增强现实应用的强大工具库。ARToolKit有助于让增强现实技术的设计师和开发者受众变得更广泛,并且它提供了本书中涉及的很多技术的基础。1.1.2 增强现实应用

尽管可以使用ARToolKit,但是增强现实应用的潜力迟迟没有被充分发掘出来。最大的一个原因是获得增强现实界面的好处所需的苛刻硬件要求。用户显示器必须既能包含摄像头数据,又能包含来自运行增强现实应用的计算机处理器的数据。就在几年前,即使在家用桌面设备上也无法实现这个结构,在家用移动设备中更是闻所未闻,直到类似iPhone和Android系列手机的智能手机的兴起。这些智能手机以及接下来兴起的平板电脑市场帮助开创了增强现实编程行业的一个新时代。有了智能手机和平板电脑,用户就能一直随身携带一个集成摄像头和计算机,这开启了增强现实应用的很多有趣的新的发展可能。

无论是通过使用移动应用还是通过带有网络摄像头的计算机上的浏览器界面,在用户自己的设备上给予用户一个迷人的增强现实体验已经变得比以往更加容易,并且发展潜力不止于此。Hallmark、Adidas以及很多其他公司都开展过增强现实营销活动。在2010年,玩具制造商乐高公司创建了一个开创性的增强现实营销活动销售点。在销售乐高玩具的玩具店里面放置计算机屏幕,购物者可以通过在屏幕前举起一个玩具盒子来在屏幕影像中查看完整乐高模型的3D虚拟图形。这个活动是一个非常有效的销售点宣传活动,同时由于购物者把他们自己的购物体验视频发到了网上,这个活动还引起了极大的在线关注。正如将在第7章讨论的,通过物理计算(physical computing)来探测备用接口能够进一步增加增强现实的潜力。

多个趋势正导致增强现实行业的爆炸式增长。其中的一个趋势是计算机视觉技术的稳步提高,这个技术可以让开发者实现更加细小的、更加不明显的、更加粗糙的标记的识别,甚至实现完全不需要标记的增强现实技术。另一个趋势是用于实现增强现实的显示技术的快速提高,包括头戴式显示器和基于投影的显示器,以及手持移动设备。

头戴式显示器实质上是摄像头和显示屏的组合,戴起来就像是护目镜或者眼镜。眼睛透过它看到的可能是一个完全数字化的、不透明的来自摄像头的视频图画,也可能是透明的、在真实世界的画面上覆盖数据的画面。头戴式显示器非常适合增强现实应用,并且正变得越来越轻便、小巧、廉价。从长远来看,随着可穿戴计算机的日益普及,头戴式显示器可能会越来越普遍。

也许更有趣的是最近基于投影机的增强现实显示器的尝试。基于投影机的显示器会使用投影机来向真实世界的表面上直接投影图像或者文本。在合适的环境下,这种方法非常灵活。基于投影机的显示器可以以头戴式显示器或者移动设备无法完成的方式一次向一大群人呈现增强现实环境。小巧、可穿戴的投影机还可以用于创建个人增强现实环境。

根据特定的应用环境,可能会有其他的显示方法。可以使用用于汽车和飞机的机载增强现实应用向仪表盘显示器添加虚拟内容;可以使用在线的、基于浏览器的增强现实应用来为一个网站的访问者提供有趣的、交互性的体验,就像Hotels.com网站的在线广告一样,参见图1-2。图 1-2 Hotels.com的virtualvacay.com网站所提供的交互性的增强现实内容

从增强现实的角度来看,最近物理计算的流行度的增加也是非常有趣的。在过去几年,我们看到了简单、开放的物理计算平台的惊人发展。这些平台是由特定硬件规格的可编程微控制器和用来编程控制这些微控制器的高级API组成。其中最有名的平台是Wiring、Gainer和Arduino。这些平台中,最通用、使用最广泛的是Arduino。使用类似Arduino的物理计算平台,你可以使用电子传感器作为输入来编写能够与真实世界交互的应用。这天生适用于增强现实,它加深了增强现实应用的感官潜力。有了物理计算,你能够处理和编程控制的“现实”就远不止是视频了。1.1.3 原型法的创新性

原型法是指创建系统或设备的原型或者工作演示。原型法通常与硬件构造的创新相关。在制造或者大量生产一个新发明之前,是值得并且通常有必要先制作一个能够正常工作但较粗糙的试验品来做演示的。从移动电话到汽车的很多产品,通常都需要在它们的设计过程中完成一个原型设计步骤,以此来测试和演示其技术特点。在电子学中,使用一个临时的原型板或者电路实验板来做原型设计,可以建立一个用来测试的能够正常工作的电路,从而使电路设计师避免过早焊接一个固定的电路而浪费材料。这些相同的原则正越来越适用于软件设计。很多人并不是专业的程序员,但会有有趣、创新的软件想法。类似Processing编程环境的软件原型设计工具就是为这些人创造的。就像一个发明家可以设计一个设备的原型以寻求资金并在某一天实现大量生产一样,一个艺术家或者设计师也可以先设计一个应用或者软件环境的原型,之后再用一个更加强大或者快速的语言完成这个应用或者软件环境的专业实现。

交互性系统和环境实际上可以受益于简单的原型设计工具。交互设计师可能需要在不用处理底层的类似软件编译和组建的令人头疼的事情的情况下快速、简单地搭建起一个增强现实演示。

增强现实领域存在巨大的创新空间。我的目的是向尽可能多的有创造力的人介绍增强现实的基础工具,以促进他们的试验和探索。出于这个原因,我会讲解各种各样的应用环境和显示模式。1.2 相关的工具和技术

对增强现实感兴趣的开发者有很多软件技术可用,从商用专有解决方案到开源但是有很少或者没有专业支持的项目,甚至是两种类型的结合。在本书中,我选择的都是适度简单的、廉价或者免费的、有很少限制的、通用的但仍然能够实现非凡的程序编写的工具。本书的很多内容是关于NyARToolkit Java类库的,这个类库基于原来的ARToolKit。

但是,根据你的需求,其他的软件解决方案也是很值得研究的。在本节中,我会对你可能需要了解的技术做一个快速浏览。1.2.1 ARToolKit

ARToolKit是很多仿效它的增强现实开发资源的基础C/C++库。ARToolKit最初是由华盛顿大学的人机接口技术实验室(Human Interface Technology Laboratory,HITLab)开发的一个开源库,基于GNU通用公共许可(General Public License,GPL)发布。ARToolKit现在由新西兰坎特伯雷大学的HITLab和HIT Lab NZ负责维护。ARToolworks公司提供了这个软件的适合创建闭源应用的商用版本。ARToolworks已经把原始的ARToolKit改进得适用于各种平台并提供很多带有专业支持的解决方案。例如,苹果移动操作系统iOS版的ARToolKit是由ARTookworks提供的,遵循专有技术许可协议。1.2.2 用BuildAR创建快速模型

建立一个基础的增强现实查看器的快速简单方式是使用HIT Lab NZ的BuildAR应用程序,地址:www.buildar.co.nz。BuildAR是Windows平台上的一个专有应用,提供了一个免费下载的试用版本,使用这个试用版本你可以添加一个3D模型并控制它的旋转、平移和缩放。BuildAR适用于特定应用的一些原型设计和演示。商业版带有用来训练标记的实用工具。BuildAR不需要任何的编程经验,这是它的优点,也是它的缺点。这是建立起一个增强现实场景并在你的Windows计算机上运行的最简单方法,不过你能够做的事情相当有限。1.2.3 DART

设计师增强现实工具包(Designer's Augmented Reality Toolkit,DART)是使用Adobe Director多媒体编程环境设计增强现实应用原型的一个软件工具集合。你可以从网址www.cc.gatech.edu/dart/上下载这个软件并找到安装指导和其他的帮助文档。熟悉Director环境的用户一定要看看DART,因为能够以类似本书所讨论的软件的方式使用它来设计增强现实环境的原型。这个网站还声称DART非常适合与其他编程语言交互。1.2.4 无标记增强现实与PTAM

并行跟踪与绘图(Parallel Tracking and Mapping,PTAM)是用于无标记增强现实的开发工具集合。源码位于http://ewokrampage.wordpress.com。安装和运行PTAM需要有C工程的组建和编译经验,但是不需要标记就能建立增强现实场景的能力开启了很多有趣的可能。有C/C++经验的用户应该了解一下PTAM。1.3 增强现实的必需元素

任何视觉增强现实的实现都需要有一个不错的带有摄像头的电脑(最近3年生产的都能满足本书的需求)。现在很多电脑都内置了摄像头,这些电脑都能很好地运行本书中的很多工程。但是,因为它们的摄像头是内置的,所以很难移动和放置,因此即使你的电脑有一个内置摄像头,你可能更想购买一个便宜的USB摄像头。

至于你应该使用哪种类型的电脑,我想说的是所有的主流平台都有优点和缺点。本书中,我会尽一切努力来寻找跨平台的解决方案,但是这并不总是可能的。这取决于各种因素,包括操作系统特定的计算机制造商、显卡等因素。你可能会发现在本书中提到的一些Java库需要特别的处理才能在你使用的平台上工作。在少数情况下,会有非常大的限制,因为这些限制Java库项目将需要工作在特定平台上。当碰到这些限制时我会阐明它们。1.3.1 获得软件

本书会介绍各种各样(大型和小型)的软件工具。当碰到时,我会向你介绍能够在哪里下载必要的软件。大部分情况下,安装你所需要的软件会非常简单,但是在后面的章节中,你会碰到一些情况,此时想要正确地建立你的编程环境会有点复杂。在这些情况下,我会指导你完成安装步骤。

在本书工程中使用的大部分软件是开源的,并且是在开放源码促进会(Open Source Initiative,OSI)认证许可下发布的。你可以完全自由地下载它,它是免费分发的。当我提及的软件有不同的许可限制时,我会阐明它们。一些软件包,比如Eclipse集成开发环境和Processing编程环境,是被开发者广泛使用并且良好支持的重要工程。大型的、OSI认证的开源工程的支持比较有保障。在另一些情况下,我可能会介绍一个小型的库,或者由个人创建的也许只能从这个人的个人网站或者博客上获得的一个库的修改。在这些情况下,我会确保这个软件也能够在Sybex关于本书的网站(www.sybex.com/go/prototypingar)上永久可获得。1.3.2 Java世界

本书中讨论的大部分软件是基于Java编程语言的(第8章是一个例外,使用的是ActionScript)。如果你有Java编程经验,你会感觉非常舒服。如果没有的话,本书介绍的从Processing环境到Java的过程是学习Java编程的一个比较好的方式。Processing本质上是方便非程序员使用的一个合理简化的Java子集。如果你熟悉了Processing,那么再学习Java会更容易。当然,对于Java编程的深入讲解超出了本书的范围,但是你可以基于本书中介绍的知识利用其他的资源继续学习Java。

对于本书来说,使用Java的好处是Java应用可以很容易地在平台间移植。利用本书中介绍的基于Java的软件,你就不必过多担心软件构建环境的细节。相类似,第8章介绍的ActionScript也是跨平台的。1.3.3 外设硬件

除了计算机和摄像头,为了学习本书中的一些高级工程,你可能还需要其他的几个重要硬件。

第7章利用Arduino介绍了物理计算。这一章很大程度上是以硬件为基础的。你至少需要一个Arduino微控制器单元、一个用于电路原型设计的电路实验板、一些跳线、一个180Ω的电阻,以及一个电子压力传感器。你还需要一对小鳄齿夹或者一个烙铁和焊料。这些你都可以从网上订购(但你可能只会在有其他需要时才会购买烙铁和焊料)。第7章我会详细讲解到哪里购买这些东西。

第10章介绍的是Android环境下的增强现实编程。因此,强烈建议你配备一个Android手机。Android SDK手机模拟器没有内置的简单的对于USB摄像头的访问,因此能够访问设备的摄像头是非常有用的。1.3.4 标记

本书中探讨的各种增强现实会使用特定类型的标记,这些标记起初是为ARToolKit设计的。这里使用的计算机视觉算法会识别出这些标记,这些算法可以根据这些标记在摄像头视图中的投影轮廓形状来计算这些标记的方位。标记可以以任何摄像头能够看到的方式打印或者显示。图1-3展示的是显示在一个移动设备上的标记。图 1-3 在一个iPod touch内的浏览器中显示的增强现实标记

ARToolKit标记是正方形的,中央有一个图像,图像周围是一个非常密集的、黑色的正方形框。正方形之外通常是白边。大多数来自ARToolKit包的代码例子会使用少数广泛使用的标记图案之一,比如在图1-4中显示的经典Hiro标记。很多在线资源中都有这个标记和日本汉字符号标记,在本书的可下载支持文件中也包含了这些标记。图 1-4 经典的Hiro标记

你可能想要创建你自己的标记图案,通常需要两个步骤。第一步是创建图形图案本身。第二步是用这个图案来“训练”系统,这一步会产生图案样式文件(通常使用扩展名“.patt”或者“.pat”来命名),这个图案样式文件可以用于在后面载入你的增强现实应用时识别图案。

可以手动创建图案。如果你想这样做的话,请查阅下面的网站以获得精确的尺寸信息:www.artoolworks.com/support/library/Creating_and_training_new_ARToolKit_markers。

但是,使用www.roarmot.co.nz/ar/网站上的在线标记制作器会更方便,参见图1-5。使用这个服务,你可以提交你自己的JPEG文件,系统会自动地创建一个恰当格式的标记PDF文件。图 1-5 ARToolKit标记制作器网站

训练图案有点棘手,不过也存在一个优秀的在线资源。想要训练图案,首先要在纸上打印这个图案或者在你的应用中以你需要的方式显示图案(比如,在平板电脑或者智能手机屏幕上)。请访问http://flash.tarotaro.org/blog/2009/07/12/mgo2/,然后点击链接“ARToolKit Marker Generator Online Multi”。这个网站的Flash应用会请求访问你的摄像头,你需要允许这个请求。把你的图案置于摄像头的视野内,直到这个应用把这个图案识别为一个标记,并在标记的边缘绘制一个红色的边框,参见图1-6。对于本书来说,请保持选项为默认值,然后点击“Get Pattern”按钮。这时会生成一个图案样式,参见图1-7。你可以在保存之前继续制作更多的图案样式,或者你也可以点击“Save Current”按钮将图案样式文件保存到一个字典中。请妥善保存最终的图案样式文件。在本书后面你会学到怎么在你的应用中使用这些图案样式。图 1-6 使用在线标记生成器识别一个标记图 1-7 生成图案样式

关于增强现实标记的最后一个注意事项:几年之后,当无标记增强现实获得普及后,你就会发现这些标记是粗糙的、不堪入目的、完全过时的。所以我强烈建议你忍住诱惑,不要把这些图案文到你的皮肤上。1.3.5 其他有用物品

还有一些在增强现实原型设计中比较有用的物品,虽然它们不是必需的。为了方便增强现实标记的旋转,最好备有某种小转盘或者餐桌转盘。我没有找到现成适合的物品,因此我用图1-8中显示的转环自己造了一个(这个转环可以在任意的五金店或者在线商店购买到)。我从本地的爱好者商店买了一些聚苯乙烯塑料和橡胶件,临时配备了图1-9中的转盘。图 1-8 餐桌转盘环图 1-9 一个自制转盘

最后,把一些标记粘到硬纸板上,并粘上冰棍棒以方便控制。计算机视觉算法是非常灵敏的,即使是挡住标记的很小一部分,也会导致无法识别。使用冰棍棒可以方便控制并防止你的手指盖住标记的内容,参见图1-10。图 1-10 在冰棍棒上的标记

现在,你已经准备好了测试增强现实的基本元素。在接下来的几章,你将迂回学习一些简单的Processing编程技巧以及使用Blender创建3D内容的方法。在第6章,你将有机会使用你的标记。第2章Processing概述

学习一个复杂软件的第一步是熟悉界面。

在本章中,你将学习下面的主题:

●Processing编程环境

●在Processing中绘图

●使用类2.1 Processing编程环境

Processing是一个基于Java的开源编程环境,它主要是为非计算机程序员的创意人士设计的。它的最大优势是学习起来相对容易,可以让创造者快速创建复杂的图形和交互性应用,同时尽量最小化与软件编译和组建相关的麻烦问题。另外,因为它本质上是Java编程语言的一个延伸,因此从原则上讲,它具有Java的所有能力。通常,对于任何具有任意编程经验的人来说,Processing的语法都是非常简单的,比如Java或者C编程语言。如果你基本理解了变量、函数,以及类似for循环的控制结构,那么你就能很容易地上手Processing编程;如果不理解的话,你可能需要先学习一下这些知识。

Processing具有使用Arduino的、实现增强现实应用的以及实现Android平台开发的库,因此可以使用它来实现本书相关的很多原型设计任务。现在,你应该了解一些关于这些库怎么相互结合使用的重要限制,它并不是一个全方位的解决方案,当然将来某一天可能会实现。在本书后面,你将会学习更高级的使用情况,这时并不能简单地使用Processing,但这是编写简单的增强现实工程的一个容易的切入点。2.1.1 安装和运行Processing

你需要从www.processing.org网站上下载并安装适用于你自身平台的Processing版本。这个下载和安装过程是相对简单的。比如在Windows平台上,你有两个选择:标准版或专家版(标注为“Without Java”)。专家版是为已经在他们的计算机上安装了Java开发工具包的用户准备的。如果你不确定你应该下载哪一个版本,请选择下载标准版。

注意 在本书编写时,如果是在Windows 7的64位版本中单独安装的Java,那么Processing所依赖的一些Java附属可能会不一致。如果你使用的是这个操作系统,我强烈建议你安装标准版Processing(包含Java),即使你的计算机中已经安装了Java。

点击可执行安装文件,按步骤安装适用于你的系统的Processing版本。当安装完成后,点击图标来启动Processing。

你应该会看到一个与图2-1类似的窗口。这就是Processing集成开发环境(IDE),也是编写和执行代码的界面。窗口的主白色区域是代码编辑区域。这里是已经打开的一个根据当前日期命名的新草案(sketch,Processing的程序被称为草案)。在编辑区之上的工具栏中你会看到运行(Run)、停止(Stop)、新建(New)、打开(Open)、保存(Save)和导出(Export)按钮。下面的黑色区域是标准输出区域,你可以在这里看到错误消息,也可以显示调试所需的值。

菜单栏的位置取决于你的操作系统。在Windows系统中,菜单栏在Processing窗口的顶部,参见图2-1。在Mac系统中,菜单栏在屏幕的顶部,因为这是Mac系统的标准样式。在菜单栏中你会看到Processing、文件(File)、编辑(Edit)、草案(Sketch)、工具(Tools)和帮助(Help)菜单。图 2-1 Processing集成开发窗口2.1.2 第一个Processing程序

运行一个Processing程序是非常简单的。事实上,你可以只使用一行代码来创建一个窗口程序。把下面的代码输入编辑器,然后点击“运行”(Run)按钮:

size(600,400);

结果看起来应该与图2-2类似。打开的新窗口就是你的草案。这个窗口有600像素宽、400像素高,这个尺寸是由size()函数的参数指定的。图 2-2 运行一个Processing草案

当然,这个窗口中什么都没有。截止到现在所有你做的就是确定草案的尺寸。要向这个窗口添加一些内容,请在size()函数的后面添加下面的代码行:

background(0);

fill(255,255,0);

stroke(255,0,255);

strokeWeight(10);

ellipse(300,200,200,200);

当你运行这个代码时,就会在屏幕上得到图2-3中的草案,你会看到一个黄色的圆,圆的周围是厚厚的洋红色轮廓,最外面是黑色的背景。这个草案的代码是非常容易理解的,即使对于初级程序员来说也是这样,但还是有一些需要注意的地方。

这段代码中size()函数的后面是background()函数,这个函数会指定背景颜色。与Processing中使用颜色作为参数的很多函数一样,background()函数可以使用一个数字参数、两个数字参数、三个数字参数,或者四个数字参数。如果你像本例中所做的一样,使用一个参数调用它,这个颜色会被假设为灰度值,这个参数就表示它的灰度值(使用默认范围为0~255,你也可以改成你想要的任意范围)。在这种情况下,参数0代表黑色。如果你用两个参数调用background()函数的话,第一个参数代表灰度值,第二个参数代表透明度值。如果你使用三个参数调用background()函数,这三个参数分别代表红色、绿色和蓝色元素(使用RGB颜色模式),或者色度、饱和度和亮度(使用HSB颜色模式)。使用四个参数调用background()函数的话,还会多出一个透明度值。图 2-3 运行一个Processing草案

在很多其他的向一个函数传递颜色的情况中,都会出现这个相同的参数模式。接下来的两行代码也是这种向一个函数传递颜色信息的方式的例子。fill()函数使用相同的参数类型来确定接下来要绘制的形状的填充颜色,stroke()函数确定了接下来要绘制的形状的轮廓颜色。在这里,填充颜色是黄色,由红色、绿色的最大值和蓝色的最小值混合指定;轮廓颜色值是洋红色的,是通过红色、蓝色的最大值和绿色的最小值混合指定的。两个颜色都是完全不透明的,因为没有指定透明度参数。

strokeWeight()函数指定轮廓的厚度,ellipse()函数绘制圆。这个函数的前两个参数指定了圆的中心点,第三个和第四个参数指定了这个圆的宽度和高度。如果后两个参数值是相同的,无疑会绘制一个圆。2.1.3 交互模式

为了使你的Processing草案项目能够随着时间变化或者与输入交互,你必须使用交互模式(interactive mode)。这涉及在两个指定的函数setup()和draw()中调用你的代码。当你要包含只运行一次的代码时,你可以使用setup()函数:一般是在你的草案项目第一次执行时。这个函数决定了这个草案项目的起始状态,setup()因此得名。相比之下,在草案项目运行时会重复调用draw()函数。这个函数的内容决定了在草案项目运行时,草案窗口是怎么根据值的变化来重绘的。举一个简单的例子,通过Processing菜单栏的“File”→“New”菜单创建一个新的草案项目(在草案窗口的顶部,或者在屏幕的顶部,这取决于你的操作系统)。在编辑器窗口中输入下面的代码:

int i=-50;

void setup(){

size(300,300);

fill(255);

stroke(0);

strokeWeight(3);

}

void draw(){

background(100);

ellipse(150,i,100,100);

i++;

if(i>350){

i=-50;

}

}

当你运行这个草案时,你会看到一个带有黑色轮廓的白色圆,在一个灰色的背景上向下移动,参见图2-4。图 2-4 一个带有动画效果的草案

让我们快速浏览一下这段代码。第一行是变量i的声明:

int i=-50;

这个变量是用来指定要绘制的圆的垂直位置的整数。这个值将会被用来计算像素,并且因为像素是离散单位,因此使用整数值是最合适的。整数值变量是使用int语句声明的。所赋的值是-50,也就是说会指定圆的位置为草案窗口顶部边缘以上50虚像素处。

这是为什么呢?与这里介绍的类似的标准2D Processing草案是根据一个xy坐标系向草案窗口绘图的,这个坐标系的原点在左上角,正方向是向右、向下的,参见图2-5。图 2-5 Processing的2D坐标系

小于0或者大于窗口尺寸的坐标值也是有效的,但是窗口绘制时会把这些元素绘制到窗口以外,屏幕显示不到的地方。

接下来一段代码是setup()函数:

void setup(){

size(300,300);

fill(255);

stroke(0);

strokeWeight(3);

}

你已经在本章中看到过这个函数的内容,因此你应该知道这个函数会做什么。现在唯一的不同是这段代码封装到了一个setup()函数定义中,因此Processing知道这个函数是运行在交互模式下的,并且这段代码只会在草案启动时执行一次。请注意,setup()和draw()函数都可以为空,并且你可以在不定义另一个函数的情况下定义其中的一个函数。

draw()函数是功能实现的地方。先绘制的是灰色背景:

void draw(){

background(100);

然后绘制的是圆:

ellipse(150,i,100,100);

请注意,i变量用于垂直定位圆。因为圆的直径是100像素,把圆的中心定位在窗口顶部边缘以上50像素处会让圆正好处在屏幕以外。

接下来一行代码增加了这个变量的值:

i++;

如果你熟悉任何最常用的编程语言的语法,你会理解这行代码。这行代码与i=i+1;的意思是一样的,获取i的值,并向这个值加1。

这个草案的最后一部分是一个条件控制结构。如果i的值大于350,i的值会被重置为-50。当这个圆掉落到这个草案的底部时会返回草案顶部边缘的上面:

if(i>350){

i=-50;

}

}

请思考一下在这个草案中的各种函数调用的位置为什么是这样的。例如,从直觉上看,只需要在这个草案启动时执行一次背景颜色设置的操作。你认为这里为什么要把background()函数的调用放在draw()函数中呢?试着改变这个地方并观察会发生什么。

作为一个练习,请把这个草案改编成一个简单的绘图程序,这个程序会使用一连串的圆并根据你鼠标的移动轨迹来绘制曲线。使用特定的Processing变量mouseX和mouseY来访问鼠标的屏幕位置。这些特殊的变量总是会自动地包含与鼠标在屏幕上的位置对应的值。使用这些变量使得在草案中整合鼠标信息变得非常简单。可以使用函数noStroke()绘制不带轮廓的圆。使用不同透明度的圆来实现一个类似喷枪的效果。在本章末尾的“简单喷枪”栏中可以找到这个练习的一个解决方案。2.2 在Processing中绘图

Processing是快速和简单地向一个显示器绘制图形元素的首要的、最好的编程环境。出于这个原因,熟悉绘图函数是学习Processing基础的重要部分。幸运的是,Processing是非常简单的,Processing参考网页(包括在线的和Processing下载中附带的网页)是查询你需要知道的所有相关知识的重要资源。2.2.1 原始形状

在Processing中存在7个基本的2D原始形状函数:point()、line()、triangle()、quad()、rect()、ellipse()和arc()。这些函数中的每一个都需要一组不同的参数来定义形状。

最简单的函数是point(),这个函数只带有两个代表x和y值的参数,并且会在这个坐标点绘制一个单独的像素(这个像素点的颜色是由当前stroke()函数指定的颜色值决定的)。line()函数带有四个参数,分表代表了这条线的每个端点的x和y坐标,triangle()和quad()函数分别带有六个和八个参数,分别代表形状的角点的坐标。

函数rect()带有四个参数,用来创建一个矩形。默认情况下,前两个参数代表了中心点坐标,第三个和第四个参数代表了矩形的宽度和高度。rectMode()函数是专门用来改变矩形绘图模式的函数,因此前两个参数代表了左上角(rectMode(CORNER)),第三个和第四个参数代表了“半径”或者说是矩形的边与矩形的中心点之间的距离(rectMode(RADIUS))。在CORNERS矩形模式中会把前两个参数解释成一个角,把第三个和第四个参数解释为对角的坐标。CENTER模式是默认的矩形模式。

你在上一个例子中看到的ellipse()函数的工作方式与矩形函数的工作方式是类似的,ellipseMode()函数能够接收相同的四个模式参数,即CORNER、CORNERS、RADIUS和CENTER。它们的意思与矩形函数中的情况类似。

arc()函数会绘制从圆的一个角延伸到另一个角的圆的一部分。这个函数接收六个参数。前两个参数代表了弧的位置,接下来两个参数代表了圆的高度和宽度,第五个和第六个参数代表了这个弧的起始角度。在Processing中角度是用弧度来描述的,这个函数的最后两个参数必须以弧度的形式提供。然而,因为大部分人喜欢用度来替代角度,所以可以使用radians()函数来把度转化成弧度。而且,arc()函数的角度被认为是从直接指向中心右边的0角度开始顺时针旋转的,参见图2-6。图 2-6 arc()函数的角度

因此,下面这段代码产生了图2-7中的弧:图 2-7 一条弧

size(600,400);

arc(300,200,300,300,radians(90),radians(200));2.2.2 使用HSB颜色

在Processing中,默认的颜色模式是RGB颜色模式,在这种模式下的三个数值分别代表了一个颜色的红色、绿色和蓝色分量。为了更好地理解HSB颜色模式的用途,请试着输入并运行下面的草案:

void setup(){

size(500,500);

colorMode(HSB,1);

}

void draw(){

for(int x=0;x<=500;x++){

stroke(x/500.0,mouseX/500.0,0.7);

line(x,0,x,500);

}

}

让我们更仔细地看一下这段代码添加了什么。在setup()函数中,对于colorMode()函数的调用已经介绍了。这个函数在这里做了两件事情。colorMode()函数的第一个参数把颜色模式从RGB改成了HSB。如前面提到的,这么做会让接下来的函数的颜色参数代表色度、饱和度和亮度,而不是红色、绿色和蓝色分量。如果你想循环彩虹的颜色或者平滑的调节这个颜色的亮度和饱和度,这个函数会非常有用。使用HSB颜色模式,你可以通过简单地增加色度值来遍历色谱。colorMode()函数的第二个参数决定了颜色参数要使用的范围。颜色参数的默认范围是0~255,如你在前面的例子中看到的。然而,在这种情况下,使用的是个直观的0到1的范围,因此这里的第二个参数的值是1:

colorMode(HSB,1);

在这个草案中填充的是彩虹背景,是通过绘制一连串的1像素宽的顶点线并设置它们的色度实现的。因为背景有500像素宽,因此需要绘制500条线。这个绘制过程是通过一个for循环实现的,这个for循环带有一个x变量,x变量的范围是0~255。stroke()函数用来设置每条线的颜色。第一个参数代表色度,其值是x/500.0。当x接近0时(接近窗口的左边缘),stroke()函数的第一个参数的值是0。当x接近500时(接近窗口的右边缘),这个参数的值接近1。因此,从右向左,色度值的范围从0到1遍历了色度的整个有效范围。stroke()函数的第二个参数值是mouseX/500.0。这个从0到1的范围与鼠标的移动相对应,当鼠标在窗口的左边缘时为0,当鼠标在窗口的右边缘时为1。stroke()函数的第二个参数控制的是饱和度值,或者说是颜色的“纯度”。当饱和度值为0时,所有的颜色都是灰色的。最后,stroke()函数的第三个参数设置的是亮度。这个参数的取值范围也是从0(纯黑)到1(每个颜色的最大亮度):

stroke(x/500.0,mouseX/500.0,0.7);2.2.3 简单的三角函数

当你正在编写图形相关的软件时,熟悉基本的三角函数是非常有用的。接下来的草案显示了怎么使用Processing的内置三角函数cos()和sin()。请输入并运行下面的代码:

int angle=0;

float rads=0.0;

void setup(){

size(500,500);

colorMode(HSB,1);

}

void draw(){

background(0.5);

rads=radians(angle);

noFill();

stroke(0.0,0.0,1.0);

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载