Mastering openFrameworks_第一章_基础知识

基础知识

在本章中,你将熟悉openFrameworks,了解它的细节和应该使用它的例子。你还将学习如何安装openFrameworks,运行它的示例,并制作你的第一个openFrameworks项目:

1.安装openFrameworks并运行您的第一个示例

2.项目的文件结构

3.项目的代码结构

4.创建第一个项目——钟摆示例

5.运行本书的例子

关于openFrameworks

Openframeworks是一个用于创造性编码的开源c++工具包。它最初由扎卡里·利伯曼于2005年发布。现在openFrameworks是主要的创造性编码平台之一,由ZacharyLieberman,TheodoreWatson和ArturoCastro在openFrameworks社区的帮助下积极开发。

注意:目前的openFrameworks版本是0.8.0。

这个工具包归功于两个重要的先驱:由CaseyReas,BenFry和Processing社区创建的处理开发环境;以及ACU工具包,由BenFry和麻省理工学院媒体实验室美学和计算小组的其他人开发的私有分布式c++库。

openFrameworks的网站是http://openFrameworks.cc的。它包含最新的下载、文档、教程和论坛。

Openframeworks的主要目的是通过将许多开放库粘合到一个包中,为用户提供对多媒体、计算机视觉、网络和其他c++功能的便捷访问。也就是说,它充当了OpenGL、FreeImage和OpenCV等库的包装器。术语包装器意味着openFrameworks为您提供了新的函数和类,并提供了关于项目结构的提示,但并不限制您。也就是说,您仍然可以使用所有的c++功能,并直接从所有链接库调用函数,而无需使用包装器的类。

Openframeworks跨平台兼容Windows、macosx、Linux、iOS和Android等支持平台。这意味着,如果您为其中一个平台开发一个项目,您可以复制源文件,并从列表中为任何其他平台编译该项目。在本书中,我们将介绍如何开发一个仅适用于Windows、Macosx和Linux的项目。虽然许多这样的例子也适用于移动平台。

有很多很棒的项目都是由openFrameworks完成的。以下是一些“经典”的例子:

1.时髦森林作者:EmilyGobeille和TheodoreWatson,2007-theinteractive

森林建筑

2.人体彩绘作者:MehmetAkten,2009年-通过移动使用者的身体在墙上绘画

3.手从上面作者:ChrisO'Shea,2009年-户外装置作品

大广告牌,与行人互动

用例

openFrameworks具有以下体系结构细节:

1.它的核心是基于多媒体,包括2d和3d图形、图像、视频和声音。因此openFrameworks特别适合于开发在实时环境中工作的多媒体项目。

2.它使用c++语言工作,这意味着代码被编译成本机指令,因此工作速度非常快。因此,它可以让你利用现代计算技术的顶级能力,创建计算密集型、突破性的项目。

这些细节决定了在项目开发中应该或不应该使用openFrameworks的情况。

你可以使用openFrameworks,当:

1.您需要制作一个创造性的编码项目,例如交互式视听装置或性能,它以一种非常重要和自定义的方式与多媒体协同工作。也就是说,这样一个项目将呈现一个自定义粒子系统,应用视频变形和狭缝扫描等效果,甚至执行数据转码。

2.您需要创建一个项目,该项目执行密集的数据分析,例如,分析来自深度相机的数据。也许你不应该使用openFrameworks:

3.该项目的重点是使用可视化控件,如按钮、复选框、列表和滑块。在这种情况下,更好的选择是使用诸如QT、Cocoa或者.Net。

注意:Openframeworks包含许多实现按钮和滑块等可视控件的类,这些类对于创建简单的图形用户界面非常有用。但是目前可视化界面并不是openFrameworks发展的主要焦点。

                4.该项目不使用多媒体或密集计算很多。例如,如果您只想向机器人发送简单的命令,那么使用Processing肯定更简单。

注意:虽然openFrameworks是一个开源项目,但目前你可以用它来开发商业项目(详情请参阅openFrameworks许可协议的http://www.openFrameworks.cc/about/license.html)。为了保护项目的内容、添加许可以及创建安装程序,您应该使用特殊的附加软件。请注意,所有这些软件都包含在iOS和Android开发工具包中,因此针对移动平台的商业开发相当容易。

安装openFrameworks并运行您的第一个示例

现在我们将考虑如何在Windows中安装openFrameworks,并执行openFrameworks的一个示例。

注意:过去(以及现在)openFrameworks在macosx上工作得最好。因此,当我们使用openFrameworks进行交互性能时,我们通常在Macosx中进行,因为性能是一个短暂的事件(5到30分钟),所以软件尽可能快速和稳定地工作是非常关键的。

对于交互式安装,展示时间较长(几小时到几个月),工作中的少量中断不是很重要,我们使用任何操作系统,这取决于可用的硬件。

所有支持的操作系统的安装文件和安装指南都在http://www.openframeworks.cc/download/。让我们详细考虑一下。

在Windows上安装

在Windows7和8中,有两种编程环境可供选择:MicrosoftVisualStudio和Code::Blocks。MicrosoftVisualStudio是世界上最流行的环境之一。它非常成熟和稳定。VisualStudio采用了许多库(包括且不包括在openFrameworks中)。因此,如果你是一个c++编程的新手,但是你知道你需要在你的项目中链接额外的库,VisualStudio是你的最佳选择。

代码::block是一个更轻量级的环境,一些开发人员更喜欢使用它。如果您是一个新手,只想在简单的项目中使用openFrameworks,那么您可能应该使用Code::Blocks。

微软VisualStudio

当前版本的MicrosoftVisualStudio是2012。一般来说,微软VisualStudio2012是一款商业软件。但它有一个轻量级的免费版本,

Microsoft visual studio express,它已经足够用于开发项目.

安装步骤如下:

1.为Windows桌面安装MicrosoftVisualStudioExpress2012。导航到googlehttp://microsoft.com,在搜索栏输入VisualStudioExpress2012forWindowsDesktopdownload,然后按Enter键开始搜索。点击下载按钮。打开下载页面时,按“立即安装”按钮。然后你将经历安装的过程。安装完成后,运行visualstudio并注册它(注册是免费的)。

2.下载openFrameworks的归档文件。访问http://www。并下载VisualStudio的openframeworks.cc/download/版本。下载的ZIP文件应该命名为v0.8.0vsrelease.ZIP。解压下载的文件;它将是一个包含openFrameworks的文件夹。将文件夹移动到计算机上的任何位置,例如c:openFrameworks。

3.让我们编译并运行一些示例来验证openFrameworks,导航到例/3d/pointcloudexample

                 在VisualStudio中的openFrameworks文件夹和打开pointCloudExample.sln。

4.按F7编译。

5.按F5运行该项目。

6.您将看到一个应用程序窗口,其中一个男孩的脸是由3D点制成的.

如下图所示:

7.按鼠标左键并移动鼠标旋转面,或者按鼠标右键并移动鼠标缩放面。

注意:为了理解示例的代码,您需要学习如何处理图像和3d图形,请参阅第4章,图像和纹理,以及第7章,3d绘图。例如,要创建您自己的点云,您需要学习如何使用深度相机,请参阅第10章,使用深度相机。还可以在项目部分的文件结构中查看项目文件的描述。

8.另外,请注意与正在运行的应用程序关联的第二个窗口。它是黑色的,可能包含一些文本。这是一个控制台窗口,openFrameworks在其中写入各种信息、警告和错误。当您遇到一些问题时,请检查此窗口的内容。

                 9.现在按Esc关闭应用程序。

您已经成功地运行了openFrameworks示例,现在可以开发自己的项目了。

注意:如果尝试在其他计算机上运行使用visualstudio制作的项目,则可能无法启动该项目,并显示错误消息。可能的原因是您需要安装visualstudio再发行版。要下载它,请进入googlehttp://microsoft.com,在搜索行中输入Visualc++RedistributableforVisualStudio,然后按下Enter键开始搜索。点击第一个搜索结果并下载安装文件。在安装再发行版之前,请尝试运行项目。也许它会起作用。

Code:block(Windows)

Code::Blocks是Windows的开源开发环境。目前的版本是12.11。安装步骤如下:

1.安装code::block。进入http://www.codeblocks.org,点击下载菜单项,点击下载二进制版本。然后选择要下载的文件,其中包括mingw。例如,codelocks-12.11mingw-setup.exe。

2.安装code::block的附加部分,这是openFrameworks工作所需的。访问http://www.openframeworks.cc/setup/codeblocks/文档,查看在MinGW添加文件部分的说明。

3.下载openFrameworks归档文件。去http://www.openframeworks。Cc/download/和下载openFrameworksforCode::Blocks(Windows)。下载的ZIP文件应该命名为v0.8.0wincbrelease。解压下载的文件;它将是一个包含openFrameworks的文件夹。将文件夹移动到计算机上的任何位置,例如c:openFrameworks。

4.让我们编译并运行一个示例来验证openFrameworks是否正常工作。导航到examples/3d/pointcloudexampleopenFrameworks文件夹和openpointCloudExample.workspaceinCode::Blocks。

5.第一次打开Code::Blocks时,它将询问您要使用哪个编译器。确保选中了gnugcccompiler并继续。

6.按下建立按钮,然后运行按钮:

7.按照Microsoft VisualStudio部分中的步骤6、7、8和9操作。

openFrameworks的文件夹

到目前为止,我们已经安装了openFrameworks并检查了它的工作情况。让我们研究一下它的文件夹的内容。它由许多文件夹组成,包括插件、应用程序、示例、库、项目生成器和文本文件,如license.md和readme.txt。

注意:在使用openFrameworks之前,最好仔细阅读许可文件license.md。

让我们详细考虑一些最重要的文件夹。

例子文件夹

这个文件夹包含一些简单的例子,几乎涵盖了openFrameworks的所有方面,按以下主题排序:

1.3d:这个文件夹展示了3D图形和3D数学的基础知识(详见第7章,3D绘图)

2.addons:这个文件夹包含了使用各种附加组件的例子。

3.communication:这些附加组件是openFrameworks的扩展这个文件夹包含使用串口(通常是通过USB)与外围设备进行通信的例子,例如,用于连接Arduino

4.empty:这个文件夹包含emptyExample,这是openFrameworks最简单的项目,我们将使用它作为开发图书

5.events: 事件中大多数例子的起点:这个文件夹演示了openFrameworks内置的例子

6.gl: 这个文件夹包含了2d和3d图形的高级例子,包括FBO,VBO,

7.graphics:这个文件夹展示了基本的二维图形功能和处理图像的能力(关于这些主题的更多信息,请参见第2章,二维图形和第4章,图像和纹理)

8.gui:这个文件夹展示了如何添加图形用户界面,包含一个openFrameworks项目的按钮、滑块和复选框

9.math:这个文件夹有关于使用Perlin噪声、简单粒子系统和矢量数学的例子(参见附录b,Perlin噪声,和第三章,构建简单粒子系统,了解更多关于这些主题的信息)

10.sound:这个文件夹包含了演示如何播放、低级生成和录制声音的例子(参见第六章,使用声音,了解更多关于这个主题的信息)

11.utils:此文件夹演示如何处理小但重要的主题,例如在不同类型之间转换值(例如int到string),使用目录和线程.

尽管本书将涵盖大多数主题,但我们强烈建议您运行并查看尽可能多的代码示例。这对于深入了解openFrameworks非常有帮助。

应用文件夹

这是一个文件夹,您的所有项目都应该存在其中。更具体地说,您应该将项目放在apps文件夹的某个子文件夹中。现在这个文件夹包含了myApps文件夹,你可以在你的项目中使用它。你也可以创建新的文件夹,比如Performances2014,然后把相应的项目放在那里。

注意,如果你试图编译一个放在apps文件夹子文件夹之外的项目,编译器可能会给出一个错误,说明它找不到openFrameworks库。

插件文件夹

此文件夹包含插件。这些都是基本openFrameworks功能的扩展。当您需要向openFrameworks添加一些扩展时,您将把它安装到这个文件夹中。我们在附录a中详细讨论插件,使用插件。

项目的文件结构

所有的openFrameworks项目都有类似的文件夹和文件结构。让我们通过观察openFrameworks的pointCloudExample项目来详细考虑这个问题。

打开examples/3d/pointcloudexample文件夹。它由以下文件组成

1.Bin文件夹包含项目的一个可执行文件(可能还包含。Dll文件将在那里ーー这取决于您的操作系统)。如果您编译这个项目,正如在安装openFrameworks中所描述的那样,并运行您的第一个示例部分,那么您很可能会发现有一个名为pointCloudExampledebug的可执行文件。

调试后缀表示项目是在调试编译模式下编译的。此模式允许您使用断点和其他调试工具调试项目。

注意:断点是一种调试工具,它暂停项目在指定代码行中的执行,并允许您检查

项目变量的当前值。

以调试模式编译的项目可能运行得非常慢。因此,当项目正常工作时,始终在编译的Release模式下编译它。为了获得良好的性能,本书中的许多示例应该以Release模式编译。在这种情况下,调用可执行文件时不使用调试后缀,比如pointCloudExample。

2.此外,在bin文件夹中,您将找到数据子文件夹。这是一个文件夹,您的所有内容都应该位于其中:图像、视频、声音、XML和文本文件。Openframeworks项目将此文件夹用作加载和保存数据的默认位置。

在考虑的项目中,这个文件夹包含一个名为linzer.png的图像文件。

注意:此图像由个像素组成,包含红色、绿色、蓝色和alpha颜色组件(红色、绿色、蓝色、alpha)。每个图像的像素(x,y)被转换成带颜色(r,g,b,a)的3D点(x,y,z),因此该点的第三个坐标z是根据alpha值计算出来的。最终我们得到了合成的三维点云,并将其绘制在屏幕上。(关于从图像中获取像素颜色的详细信息,请参阅第4章图像和纹理。)

src文件夹包含项目的c++源代码。通常,源代码只表示在三个文件中:main.cpp、testApp.h和testApp.cpp。稍后我们将在项目部分的代码结构中讨论这些文件。请注意,此文件夹可以包含其他.H和.cpp在你的项目中。

此外,项目的文件夹还包含一个用于开发环境的特殊项目文件。它具有扩展性。.sln(VisualStudio)。这是您应该在开发环境中打开的文件,以便编辑、编译和运行项目。(在考虑的示例中,它的名称是pointCloudExample.sln)

此外,项目的文件夹可以包含一些其他文件,例如,当前项目设置(文件集取决于开发环境)。

项目的代码结构

Openframeworks项目的源代码放在项目的src文件夹中,由至少三个文件组成:main.cpp、testApp.h和testApp.cpp。

注意:请记住以下约定:如果某个函数或类名以of开头,则表示它属于openFrameworks。例如ofPoint、ofImage和ofSetColor()。(如果某个名称以ofx开头,这意味着它是某个openFrameworks插件的一部分,例如,ofxXmlSettings.)

main.cpp

在c++语言规范中,每个项目必须有一个。带有定义的main()函数的cpp文件。此函数是操作系统启动应用程序的入口点。在openFrameworks中,main()函数包含在main.cpp文件中。该函数最重要的一行如下:

ofSetupOpenGL( &window, 1024, 768, OF_WINDOW );

这个setupopengl()函数调用指示openFrameworks创建一个宽度为1024、高度为768像素的视觉输出窗口。最后一个参数OFwindow意味着您需要创建一个窗口,用户可以在桌面屏幕上移动和调整窗口的大小。如果将最后一个参数指定为offullscreen,那么该项目将全屏运行ーー这种模式对许多项目都很重要。

例如,如果你需要在全屏上显示尺寸为1920*1024像素的项目,你可以用下面的行代替ofSetupOpenGL()调用.

ofSetupOpenGL( &window, 1920, 1024, OF_FULLSCREEN );

通常您根本不需要更改main.cpp文件,因为屏幕大小的设置可以在testApp.cpp文本中完成,我们现在正在考虑这一点。

注意:在main()函数内部,大多数openFrameworks对象(如ofImage)都不能正常工作,因为路径和其他变量尚未设置。因此,实际上,在大多数情况下,您应该保持main.cpp不变,并在testApp.cpp中执行所有需要的操作。

testApp.h

这个文件以#pragma开头。这是一个编译器指令,它应该出现在所有。H档案。下一行是#include”ofMain.h”。它包括openFrameworks的核心类和函数。在这之后,代码包含了testApp类的声明,它是从openFrameworks的baseApp类继承而来的:

#pragma once 
#include "ofMain.h" 
class testApp : public ofBaseApp{ 
public: 
//openFrameworks' standard functions declarations 
void setup(); 
void update(); 
[ 20 ]Chapter 1 
void draw(); 
//... 
//Declarations of custom objects for the project 
ofEasyCam cam; 
ofMesh mesh; 
ofImage img; 
};

testApp类包含许多函数,如setup()、update()、draw()等。这些是项目工作所需的功能。它们是在ofBaseApp类中定义的,由openFrameworks调用。(testApp类与openFrameworks引擎的链接是在main()函数中完成的。它的最后一行创建了这个类的对象并将其链接到由openFrameworks控制的窗口。)我们将在下一节中描述函数的意义。

在类定义的最后,您将看到cam、mesh和img对象的声明。这些是在本例中定义的自定义对象。在您自己的项目中,您也应该在这里添加对象的声明。

注意:为了简单起见,可以在testApp.cpp文件中直接声明对象,但要小心,一些类的对象,如ofEasyCam、ofThread和ofxTCPServer将无法正常工作,如果定义为不属于testApp类的静态变量,则可能导致应用程序崩溃。原因是openFrameworks在创建testApp类的对象之前执行一些操作,而这些类依赖于此。请注意,在本书的一些示例中,我们有时对简单类型(float、int、ofPoint、ofImage等)使用此类声明。

总结一下:在创建自己的项目时,您应该保留setup()、update()、draw()函数和其他未触及的声明,还应该添加项目所需的对象和函数声明。

testApp.cpp

文件包含在testApp.h中声明的所有函数的定义。

让我们来解释一下testApp类的标准函数。

最重要的函数是setup()、update()和draw()。首先调用setup(),然后在无限循环中调用update()和draw(),直到用户按Esc键关闭项目:

注意:除了按Esc键之外,用户还可以关闭项目窗口来完成项目的执行。

如果需要项目自行终止,则调用带有某个整数值val的OFexitapp(val)函数。

让我们详细考虑一下这些函数。

Setup ()

在项目开始时,openFrameworks只调用一次setup()函数。这是设置诸如刷新率、加载图像

和视频等屏幕参数的最佳位置,并启动诸如摄像头抓取之类的处理。

控制屏幕参数的典型功能如下:

1.ofSetFrameRate(rate):此参数将屏幕刷新的帧速率设置为int类型的值速率。此外,它还控制调用update()和draw()的速率。典型值是60,这相当于大多数电视和投影机的帧速率。默认值为零,这意味着帧速率尽可能大(在某些情况下是不需要的)。

2.ofSetVerticalSync(v):此参数启用或禁用屏幕刷新与视频卡的物理刷新同步,v类型为bool。启用此模式可以提高快速移动对象的呈现质量,但略微降低性能。默认情况下,启用了同步。

3.ofSetFullScreen(v):此参数启用或禁用全屏模式,其中v类型为bool。

4.ofSettSindowShape(w,h):这个参数设置输出窗口的大小,这样绘图区域的宽度为w,高度为h像素。

注意,您也可以从testApp类的其他函数中调用这些函数。

update()

这个函数在setup()调用之后由openFrameworks调用。这是所有计算都应该执行的地方,比如改变物体的位置,分析来自摄像机的数据,以及网络交换。

注意:此外,绘制到屏幕外缓冲区(fbo)

draw()

此函数在update()之后由openFrameworks调用。所有绘图函数都应该放在这里。Draw()之后,openFrameworks再次调用update(),因此我们获得update()和draw()方法的周期。

典型的绘图功能如下:

1.ofSetBackground(r,g,b),其中r、g和b是从0到255的整数值,指定屏幕背景的红色、绿色和蓝色组件

2.ofSetColor(r,g,b),设置绘图颜色

3.ofLine(x1,y1,x2,y2)绘制连接点(x1,y1)和(x2,y2)的线段

其他功能

testApp.h文件包含其他函数的定义。这些都是事件驱动的函数;openFrameworks在某些事件发生时调用它们,比如鼠标移动或键盘按键。一些最重要的功能如下:

1.当按下或释放某个键时,openFrameworks调用keyPressed(key)和keyReleased(key)函数。这里的KEY是一个int值,它可以与char值(如“a”)进行比较,并与表示特殊键(如Return(Enter)键的OFKEYReturn、左光标键的OFKEYleft等)的常量进行比较。请参阅libs/openframeworks/utils/ofconstants.h文件中特殊键常量的完整列表。

2.当鼠标移动到项目窗口上而不按任何键时,调用mouseMoved(x,y)函数。这里x和y是以像素为单位的鼠标指针坐标,坐标的中心位于窗口的左上角。

3.mouseReleased(x,y,button)、mouseDrag(x,y,button)和mousePressed(x,y,button)函数分别在按下鼠标按钮、移动鼠标和释放鼠标按钮时调用。这里的按钮分别对于鼠标左键、中键和右键等于0、1和2。

4.当用户改变窗口大小或者调用ofSetWindowShape()函数时,会调用windowResized(w,h)函数。这里w和h等于窗口的当前宽度和高度。

现在我们将讨论如何创建一个新的openFrameworks项目。

创建一个新项目

对于开发项目,您有两种可能性:从现有示例启动它或使用ProjectGenerator向导创建它。让我们详细讨论一下这两个问题。

从现有示例创建项目

启动自己的项目最简单的方法是将一些现有的示例(或自己的项目)复制到apps/myapps文件夹或apps文件夹的任何其他子文件夹中。然后根据需要重命名文件夹(例如,重命名为myInteractiveWall),并使用开发环境打开项目。现在您可以更改代码,并运行项目。

通过这种方式,本书中几乎所有的例子都来自于emptyExample项目,位于示例/空文件夹中。

这种方法的确非常简单。此外,它对于处理一些复杂的插件特别有用,比如ofxOpenNI(参见第10章,使用深度摄像机,了解更多关于这个插件的信息)。也就是说,你自己或者使用项目生成器连接这些插件会有困难。在这种情况下,只需从现有工作插件的示例启动项目。

使用项目生成器创建项目

可以使用项目生成器向导(位于projectGenerator文件夹中)创建新项目。它允许您指定项目的名称、文件夹以及项目中所需的插件列表。

这种方法也很简单,尤其是当你开始一个新项目时,需要使用很多插件。手动链接插件可能会花费很多时间,并且ProjectGenerator会自动为您完成。有关详细信息,请参阅附录a中的使用项目生成器部分,与插件一起工作。

在我们看来,使用ProjectGenerator仅仅用于创建具有专有名称的项目并不那么重要,因为您可以使用开发环境自己重命名项目。因此,我们使用这个向导只是为了将插件链接到新项目。

现在我们准备用openFrameworks创建我们的第一个项目。

创建您的第一个项目-钟摆的例子

让我们创建一个openFrameworks项目,它在2D中绘制一个移动的钟摆,由一个悬挂在橡胶段上的球组成。该示例基于openFrameworks中的emptyExample项目。执行以下步骤创建项目:

1.将emptyExample项目的文件夹复制到用于保存应用程序的文件夹中(比如apps/myapps),并将其重命名为“钟摆”。

2.进入“钟摆”文件夹,在开发环境中打开这个项目(emptyExample.sln forVisualStudio)。

3.在开发环境中打开testApp.h文件,在testApp类声明中添加关于钟摆悬挂中心和球的位置和速度的声明:

ofPoint pos0; //Center of suspension 
ofPoint pos; //Ball's position 
ofPoint velocity; //Ball's velocity

这里的点是openFrameworks的保持点坐标类,它有x和y成员(我们将在第2章,2D绘图中研究它)。

4.打开文件testApp.cpp,并填充testApp::setup()的主体

函数定义:

void testApp::setup(){ 
//Set screen frame rate 
ofSetFrameRate( 60 ); 
//Set initial values 
pos0 = ofPoint( 512, 300 ); 
pos = ofPoint( 600, 200 ); 
velocity = ofPoint( 100, 0 ); 
}

在这个函数中,我们将帧速率设置为60帧率/秒,并且为所有3个点设置初始值。

5.现在填充testApp::update()函数定义的主体:

void testApp::update(){ 
//Constants 
float dt = 1.0 / 60.0; //Time step 
float mass = 0.1; //Mass of a ball 
float rubberLen = 200.0; //Segment's length 
float k = 0.5; //Segment's stiffness 
ofPoint g( 0.0, 9.8 ); //Gravity force 
//Compute Hooke's force 
ofPoint delta = pos - pos0; 
float len = delta.length(); //Vector's length 
float hookeValue = k * (len - rubberLen); 
delta.normalize(); //Normalize vector's length 
ofPoint hookeForce = delta * (-hookeValue); 
//Update velocity and pos 
[ 26 ]Chapter 1 
ofPoint force = hookeForce + g; //Resulted force 
ofPoint a = force / mass; //Second Newton's law 
velocity += a * dt; //Euler method 
pos += velocity * dt; //Euler method 
}

该函数使用牛顿第二定律和欧拉方法更新速度和速度。为了这个目的,我们计算作用在球上的力,作为球、悬挂点和重力之间的虎克力之和。

6.最后,填充testApp::draw()函数定义的主体:

void testApp::draw(){ 
//Set white background 
ofBackground( 255, 255, 255 ); 
//Draw rubber as a blue line 
ofSetColor( 0, 0, 255 ); //Set blue color 
ofLine( pos0.x, pos0.y, pos.x, pos.y ); //Draw line 
//Draw ball as a red circle 
ofSetColor( 255, 0, 0 ); //Set red color 
ofFill(); //Enable filling 
ofCircle( pos.x, pos.y, 20 ); //Draw circle 
}

在这里我们设置一个白色的背景,画一个橡胶作为一条蓝线从pos0到pos,也画一个球作为一个红色的圆圈。注意,我们使用ofFill()函数,它支持openFrameworks的模式来绘制填充的基元(圆形、矩形和三角形)。详情请参阅第2章2d绘图中的这些绘图函数。

7.运行这个项目,你会看到一个移动的球的动画:

在setup()和update()函数中使用数值,看看它如何影响钟摆的动力学。

运行本书的例子

我们刚刚看了这本书的第一个例子。你会在书中看到许多其他的例子。有些示例需要额外的内容文件,还有一些示例的代码以缩短形式给出。因此,为了更有效地处理这本书,请从该书页面的“支持”选项卡下载该书的示例源代码和内容文件,点击以下链接:

Http://www.packtpub.com/mastering-openframeworks-creative-coding-/书

注意,所有示例项目都是作为源文件(。H和。Cpp).图像、视频和声音等内容文件位于不同的文件夹中。要运行一个示例,您需要创建一个新的openFrameworks项目,复制和。下载示例的cpp源文件到此项目的src文件夹(带有替换文件),并将所需的内容文件复制到项目的bin/data文件夹中。

我们将始终指定应该将哪个项目作为示例项目的基础,以及运行示例需要哪些内容文件。另外,为了方便起见,我们将带有示例代码的文件夹的名称放在一个信息框中,如下所示:

注意:这是01-basics/01-pendulum的例子

基本效用函数

本章的最后一节提到了一些实用函数,这些函数将在本书的示例中使用,或者仅仅在您的项目中有用。

1.ofMap(v,v0,v1,out0,out1):该函数执行从段[v0,v1]到段[out0,out1]的浮点值v的线性插值。注意,它不控制v的边界,只使用公式(v-v0)/(v1-v0)*(out1-out0)+out0。为了控制边界,调用这个函数,最后一个可选参数设置为true:ofMap(v,v0,v1,out0,out1,true)。然后将结果限制到[out0,out1]。

2.ofClamp(v,v0,v1):该函数将浮点值v夹到返回min(max(v,v0),v1)的段[v0,v1]中。

3.ofRandom(a,b):该函数在段[a,b]中生成一个伪随机数。(实际上,它返回的值总是小于b)。

4.ofNoise(x),ofNoise(x,y),ofNoise(x,y,z)和ofNoise(x,y,z,w):这些函数返回Perlin噪声值,详见附录b,PerlinNoise。

5.ofToString(v):此函数将int或float值v转换为 String类型

6.ofToInt(s)和ofToFloat(s)的字符串返回值:这些函数将字符串s转换为

分别返回int值和float值。

6.ofGetWidth()和ofGetHeight():这些函数返回项目屏幕的当前宽度和高度(以像素为单位)。

7.ofGetElapsedTimef():这个函数返回从项目开始到结束的秒数。这是一个浮点值,以毫秒级的精度度量。例如,返回值123.4表示123秒和400毫秒。

8.ofShowCursor()和ofHideCursor():这些函数显示和隐藏鼠标光标。

要将信息打印到控制台窗口中,可以使用标准的cout流。例如,对于从项目开始的打印时间,使用以下代码:

cout << "Time: " << ofGetElapsedTimef() << endl;

在这里,endl是一个标准常量,这意味着在控制台中启动一个新行。

摘要

在本章中,我们学习了什么是openFrameworks,什么时候应该使用它,如何安装它,以及运行它的示例。此外,我们还对项目的文件夹和代码结构进行了探讨,并最终完成了第一个用摆模拟的项目。

在下一章,我们将学习如何使用openFrameworks处理2d图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶等风12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值