介紹一個非常好用的跨平台C++開源框架:openFrameworks
簡介
首先需要說明的一點是: openFrameworks
設計的初衷不是為計算機專業人士准備的, 而是為藝術專業人士准備的, 就像 Processing
一樣.
概述
openFrameworks
是一個功能強大, 上手超級簡單的 C/C++
開源框架. 它集成封裝了很多常用的庫, 諸如:
- OpenGL、GLEW、GLUT、libtess2、cairo - 用於處理圖形;
- rtAudio、PortAudio、OpenAL、Kiss FFT、FMOD - 用於音頻的輸入、輸出和分析;
- FreeType - 用於字體顯示;
- FreeImage - 用於圖像存儲和載入;
- Quicktime、GStreamer、videoInput - 用於視頻播放和截取;
- Poco - 用於開發網絡應用;
- OpenCV - 用於計算機視覺;
- Assimp - 用於讀入 3D 模型。
openFrameworks
為這些庫提供了一個統一的接口, 使得使用它們變得異常容易.
跨平台
另外值得一提的就是 openFrameworks
的跨平台特性, 從桌面系統到移動終端, openFrameworks
目前支持:
- Windows
- OSX
- Linux
- Android
- iOS
最新的 0.9.0
版本還支持運行 Linux
系統的 arm
開發板, 例如樹莓派.
支持發布為WEB形式
openFrameworks
集成了 Emscripten
作為插件, 我們的 openFrameworks
程序可以通過它很容易地轉換成 javascript
的格式, 這樣非常方便就把本地項目轉換成了 WEB
項目, 可以直接發布到網絡上.
支持多種開發環境
openFrameworks
除了支持命令行編譯外, 還支持比較常用的幾種集成開發環境. 如下:
- Visual Studio
- XCode
- Eclipse
- Code::Blocks
超級簡單的代碼結構
其實 openFrameworks
最值得稱道的是它的代碼結構極其簡單, 假設你的項目名為 myOF
, 那么代碼結構如下:
#include "myOF.h"
//--------------------------------------------------------------
void myOF::setup(){
}
//--------------------------------------------------------------
void myOF::update(){
}
//--------------------------------------------------------------
void myOF::draw(){
}
//--------------------------------------------------------------
void myOF::keyPressed(int key){
}
...
如果你有過使用 Processing
的經驗, 就會感覺非常熟悉, 沒錯, 這些函數跟 Processing
中的含義完全一樣.
setup
在程序啟動時執行一次;draw
在程序啟動后每秒執行60次(該頻率可設), 用來繪制圖形;update
跟draw
一樣, 每秒執行60次, 把需要更新的代碼放在這里;keyPressed
處理按鍵事件;- 還有處理鼠標事件的一系列函數, 這里就不贅述了.
為什么會使用這種代碼結構? 因為 openFrameworks
原本的設計目的就是要讓非計算機專業的人士通過編程來創造各種計算機視覺/圖像/視頻/聲音藝術, 就像 Processing
的設計目標一樣, 所以它才會搞成這種簡單易用但是功能強大的形式.
安裝
openFrameworks
支持多個平台的安裝, 從官網下載地址取得對應的版本, 以樹莓派為例, 如下:
解壓后進入目錄:
pi@rpi /opt/software/openFrameworks $ cd scripts/linux/debian/
pi@rpi /opt/software/openFrameworks/scripts/linux/debian $ ls
install_codecs.sh install_dependencies.sh
pi@rpi /opt/software/openFrameworks/scripts/linux/debian $
安裝依賴:
pi@rpi /opt/software/openFrameworks/scripts/linux/debian $ sudo ./install_dependencies.sh
安裝編解碼:
pi@rpi /opt/software/openFrameworks/scripts/linux/debian $ sudo ./install_codecs.sh
編譯oF庫:
pi@rpi /opt/software/openFrameworks/scripts/linux $ ls
archlinux buildAllExamples.sh cleanAllExamples.sh compileOF.sh debian removeFMOD.sh ubuntu
archlinux_armv6 buildAllRPIExamples.sh codeblocks_wizard compilePG.sh fedora testAllExamples.sh ubuntu-omap4
pi@rpi /opt/software/openFrameworks/scripts/linux $ sudo ./compileOF.sh
編譯項目生成器:
pi@rpi /opt/software/openFrameworks/scripts/linux $ sudo ./compilePG.sh
編譯全部例程:
pi@rpi /opt/software/openFrameworks/scripts/linux $ sudo ./buildAllRPIExamples.sh
執行所有編譯好的例程:
pi@rpi /opt/software/openFrameworks/scripts/linux $ sudo ./testAllExamples.sh
也可以單獨編譯某個例程, 只要進入其目錄操作即可.
編寫自己的項目
安裝好之后, 在目錄 ./examples/empty/
下有一個空項目模板 emptyExample
, 我們可以基於這個空項目模板來寫自己的 oF
程序, 針對不同的平台, 空項目模板的結構也不同, 例如:
- 在
Raspbian
平台下, 空項目模板的結構如下:
pi@rpi /opt/software/openFrameworks/examples/empty $ tree emptyExample/
emptyExample/
├── bin
│ ├── emptyExample
│ ├── libs
│ └── readMe.txt
├── config.make
├── Makefile
├── obj
│ └── linuxarmv7l
│ └── Release
│ └── src
│ ├── main.d
│ ├── main.o
│ ├── ofApp.d
│ └── ofApp.o
└── src
├── main.cpp
├── ofApp.cpp
└── ofApp.h
7 directories, 11 files
pi@rpi /opt/software/openFrameworks/examples/empty $
- 在
OSX
平台下, 空項目模板的結構如下:
admin@Air:~/Downloads/of_v0.9.0_osx_release/examples/empty$ tree emptyExample/ |more
emptyExample/
├── Makefile
├── Project.xcconfig
├── addons.make
├── bin
│ ├── data
│ └── emptyExample.app
│ └── Contents
│ ├── Frameworks
│ │ └── GLUT.framework
│ │ ├── GLUT -> Versions/Current/GLUT
│ │ ├── Headers -> Versions/Current/Headers
│ │ ├── Resources -> Versions/Current/Resources
│ │ └── Versions
│ │ ├── A
│ │ │ ├── GLUT
│ │ │ ├── Headers
│ │ │ │ ├── copy.h
│ │ │ │ ├── extrude.h
│ │ │ │ ├── glsmap.h
│ │ │ │ ├── glsmapint.h
│ │ │ │ ├── glut.h
│ │ │ │ ├── glutbitmap.h
│ │ │ │ ├── glutf90.h
│ │ │ │ ├── glutstroke.h
│ │ │ │ ├── gutil.h
│ │ │ │ ├── intersect.h
│ │ │ │ ├── port.h
│ │ │ │ ├── rot.h
│ │ │ │ ├── segment.h
│ │ │ │ ├── tube.h
│ │ │ │ ├── tube_gc.h
│ │ │ │ └── vvector.h
│ │ │ └── Resources
│ │ │ ├── Caution.tiff
│ │ │ ├── English.lproj
│ │ │ │ ├── GLUT.nib
│ │ │ │ │ └── objects.nib
│ │ │ │ ├── GLUTClipboard.nib
│ │ │ │ │ └── objects.nib
│ │ │ │ ├── GLUTPreferences.nib
│ │ │ │ │ └── objects.nib
│ │ │ │ ├── GLUTUI.strings
│ │ │ │ └── InfoPlist.strings
│ │ │ ├── Info.plist
│ │ │ ├── blankCursor.tiff
│ │ │ ├── bottomCursor.tiff
│ │ │ ├── bottomleftCursor.tiff
│ │ │ ├── bottomrightCursor.tiff
│ │ │ ├── crossCursor.tiff
│ │ │ ├── cycleCursor.tiff
│ │ │ ├── destroyCursor.tiff
│ │ │ ├── fingerCursor.tiff
│ │ │ ├── helpCursor.tiff
│ │ │ ├── leftCursor.tiff
│ │ │ ├── leftRightCursor.tiff
│ │ │ ├── rightArrowCursor.tiff
│ │ │ ├── rightCursor.tiff
│ │ │ ├── sprayCursor.tiff
│ │ │ ├── topCursor.tiff
│ │ │ ├── topleftCursor.tiff
│ │ │ ├── toprightCursor.tiff
│ │ │ ├── upDownCursor.tiff
│ │ │ └── waitCursor.tiff
│ │ └── Current -> A
│ ├── Info.plist
│ ├── MacOS
│ │ ├── emptyExample
│ │ └── libfmodex.dylib
│ ├── PkgInfo
│ └── Resources
│ └── icon.icns
├── build
│ └── emptyExample.build
│ └── Release
│ └── emptyExample.build
│ ├── Objects-normal
│ │ └── x86_64
│ │ ├── emptyExample.LinkFileList
│ │ ├── emptyExample_dependency_info.dat
│ │ ├── main.d
│ │ ├── main.dia
│ │ ├── main.o
│ │ ├── ofApp.d
│ │ ├── ofApp.dia
│ │ └── ofApp.o
│ ├── Script-E4B6FFFD0C3F9AB9008CF71C.sh
│ ├── dgph
│ ├── dgph~
│ └── emptyExample.hmap
├── config.make
├── emptyExample.xcodeproj
│ ├── project.pbxproj
│ └── xcshareddata
│ └── xcschemes
│ ├── emptyExample Debug.xcscheme
│ └── emptyExample Release.xcscheme
├── openFrameworks-Info.plist
└── src
├── main.cpp
├── ofApp.cpp
└── ofApp.h
29 directories, 72 files
admin@Air:~/Downloads/of_v0.9.0_osx_release/examples/empty$
這個空模板項目既可以在諸如 XCode
之類的 IDE
中打開, 也可以直接在命令行編輯, 然后在命令行編譯, 下面, 我們分別在 Raspbian
和 OSX
的命令行下新建一個項目並編譯它.
在Raspbian下新建項目並編譯
首先把空模板拷貝一份, 假設我們的項目叫 myOF
, 那么執行下面這條命令:
pi@rpi /opt/software/openFrameworks/examples/empty $ cp -R emptyExample/ ./myOF
pi@rpi /opt/software/openFrameworks/examples/empty $ ls
emptyExample myOF
pi@rpi /opt/software/openFrameworks/examples/empty $ cd myOF/
pi@rpi /opt/software/openFrameworks/examples/empty/myOF $ ls
bin config.make Makefile obj src
pi@rpi /opt/software/openFrameworks/examples/empty/myOF $
其中 src
目錄是源代碼目錄, 進入查看
pi@rpi /opt/software/openFrameworks/examples/empty/myOF $ cd src
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $ ls
main.cpp ofApp.cpp ofApp.h
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $
總共3個文件, 分別看看內容:
- main.cpp
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $ cat main.cpp
#include "ofMain.h"
#include "ofApp.h"
//========================================================================
int main( ){
ofSetupOpenGL(1024,768, OF_WINDOW); // <-------- setup the GL context
// this kicks off the running of my app
// can be OF_WINDOW or OF_FULLSCREEN
// pass in width and height too:
ofRunApp( new ofApp());
}
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $
- ofApp.cpp
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $ cat ofApp.cpp
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
}
//--------------------------------------------------------------
void ofApp::update(){
}
//--------------------------------------------------------------
void ofApp::draw(){
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
}
//--------------------------------------------------------------
void ofApp::keyReleased(int key){
}
//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y){
}
//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y){
}
//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y){
}
//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){
}
//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){
}
//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){
}
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $
- ofApp.h
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $ cat ofApp.h
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y);
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void mouseEntered(int x, int y);
void mouseExited(int x, int y);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
};
pi@rpi /opt/software/openFrameworks/examples/empty/myOF/src $
容易看出, 我們要編輯的文件是 ofApp.cpp
, 我們打算畫兩個不同顏色的圓, 代碼就是下面這些:
//--------------------------------------------------------------
void ofApp::draw(){
ofSetColor(255, 0, 255);
ofCircle(200, 300, 60);
ofSetColor(0, 255, 255);
ofCircle(500, 500, 100);
}
修改 ofApp.cpp
后保存, 回到上層目錄, 開始編譯:
pi@rpi /opt/software/openFrameworks/examples/empty/myOF $ sudo make
HOST_OS=Linux
HOST_ARCH=armv7l
checking pkg-config libraries: cairo zlib gstreamer-app-1.0 gstreamer-1.0 gstreamer-video-1.0 gstreamer-base-1.0 libudev freetype2 fontconfig sndfile openal openssl libpulse-simple alsa gtk+-3.0 libmpg123
Compiling OF library for Release
make[1]: Entering directory '/opt/software/openFrameworks/libs/openFrameworksCompiled/project'
HOST_OS=Linux
HOST_ARCH=armv7l
checking pkg-config libraries: cairo zlib gstreamer-app-1.0 gstreamer-1.0 gstreamer-video-1.0 gstreamer-base-1.0 libudev freetype2 fontconfig sndfile openal openssl libpulse-simple alsa gtk+-3.0 libmpg123
HOST_OS=Linux
HOST_ARCH=armv7l
checking pkg-config libraries: cairo zlib gstreamer-app-1.0 gstreamer-1.0 gstreamer-video-1.0 gstreamer-base-1.0 libudev freetype2 fontconfig sndfile openal openssl libpulse-simple alsa gtk+-3.0 libmpg123
Compiling /opt/software/openFrameworks/libs/openFrameworks/utils/ofSystemUtils.cpp
...
HOST_OS=Linux
HOST_ARCH=armv7l
checking pkg-config libraries: cairo zlib gstreamer-app-1.0 gstreamer-1.0 gstreamer-video-1.0 gstreamer-base-1.0 libudev freetype2 fontconfig sndfile openal openssl libpulse-simple alsa gtk+-3.0 libmpg123
compiling done
to launch the application
cd bin
./myOF
- or -
make run
make[1]: Leaving directory '/opt/software/openFrameworks/examples/empty/myOF'
pi@rpi /opt/software/openFrameworks/examples/empty/myOF $
成功編譯, 沒有錯誤!
我們可以直接進入目錄 bin/myOF.app/Contents/MacOS/
下運行 ./myOF
, 也可以直接在當前目錄下運行 make run
來查看結果:
pi@rpi /opt/software/openFrameworks/examples/empty/myOF $ make run
HOST_OS=Linux
HOST_ARCH=armv7l
checking pkg-config libraries: cairo zlib gstreamer-app-1.0 gstreamer-1.0 gstreamer-video-1.0 gstreamer-base-1.0 libudev freetype2 fontconfig sndfile openal openssl libpulse-simple alsa gtk+-3.0 libmpg123
[notice ] ofAppEGLWindow: setupRPiNativeWindow(): screenRect: 1280x1024
[notice ] ofAppEGLWindow: setupRPiNativeWindow(): windowRect: 1024x768
[notice ] ofAppEGLWindow: createSurface(): setting up EGL Display
[notice ] ofAppEGLWindow: createSurface(): EGL Display correctly set 0x1
[notice ] ofAppEGLWindow: createSurface(): no current renderer selected
[notice ] ofAppEGLWindow: createSurface(): default renderer detected
[notice ] ofAppEGLWindow: createSurface(): surface created correctly
[notice ] ofAppEGLWindow: createSurface(): API bound correctly
[notice ] ofAppEGLWindow: createSurface(): -----EGL-----
[notice ] ofAppEGLWindow: createSurface(): EGL_VERSION_MAJOR = 1
[notice ] ofAppEGLWindow: createSurface(): EGL_VERSION_MINOR = 4
[notice ] ofAppEGLWindow: createSurface(): EGL_CLIENT_APIS = OpenGL_ES OpenVG
[notice ] ofAppEGLWindow: createSurface(): EGL_VENDOR = Broadcom
[notice ] ofAppEGLWindow: createSurface(): EGL_VERSION = 1.4
[notice ] ofAppEGLWindow: createSurface(): EGL_EXTENSIONS = EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_vg_parent_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_lock_surface
[notice ] ofAppEGLWindow: createSurface(): GL_RENDERER = VideoCore IV HW
[notice ] ofAppEGLWindow: createSurface(): GL_VERSION = OpenGL ES-CM 1.1
[notice ] ofAppEGLWindow: createSurface(): GL_VENDOR = Broadcom
[notice ] ofAppEGLWindow: createSurface(): -------------
[notice ] ofAppEGLWindow: setupPeripherals(): peripheral setup complete
[notice ] ofAppEGLWindow: setupNativeUDev(): created udev object
[notice ] ofAppEGLWindow: setupMouse(): mouse_fd= 5 devicePath=/dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-mouse
[notice ] ofAppEGLWindow: setupMouse(): mouse device name = Logitech USB Optical Mouse
[notice ] ofAppEGLWindow: setupKeyboard(): keyboard_fd= 6 devicePath=/dev/input/by-path/platform-3f980000.usb-usb-0:1.3:1.0-event-kbd
[notice ] ofAppEGLWindow: setupKeyboard(): keyboard device name = USB Keyboard
[notice ] ofAppEGLWindow: setupPeripherals(): native event setup complete
按 ESC
或者 Ctrl-c
退出.
因為 openFrameworks
通過 framebuffer
繪圖, 所以不需要 XWindows
.
說明: 因為樹莓派下截圖比較麻煩, 所以一律從 OSX
上截圖.
注意: 在樹莓派上運行需要有一個直接外接的屏幕, 只通過 VNC
連接是看不到繪制出的圖像的.
在OSX下新建項目並編譯
為 OSX
准備的項目模板既可以通過命令行編譯, 也可以通過 XCode
編譯, 首次編譯花的時間比較長, 因為要編譯各種庫, 之后再編譯就快多了.
通過拷貝空項目模板來新建項目, 然后修改 ofApp.cpp
, 再進行編譯, 記錄如下:
...
admin@Air:~/Downloads/of_v0.9.0_osx_release/examples/empty/myOF$ sudo make
HOST_OS=Darwin
HOST_ARCH=x86_64
Compiling OF library for Release
HOST_OS=Darwin
HOST_ARCH=x86_64
HOST_OS=Darwin
HOST_ARCH=x86_64
HOST_OS=Darwin
HOST_ARCH=x86_64
Done!
Compiling myOF for Release
HOST_OS=Darwin
HOST_ARCH=x86_64
Compiling /Users/admin/Downloads/of_v0.9.0_osx_release/examples/empty/myOF/src/ofApp.cpp
...
HOST_OS=Darwin
HOST_ARCH=x86_64
TARGET=bin/myOF
compiling done
to launch the application
cd bin/myOF.app/Contents/MacOS/
./myOF
- or -
make run
admin@Air:~/Downloads/of_v0.9.0_osx_release/examples/empty/myOF$
沒有任何錯誤, 完成編譯, 用跟 Raspbian
同樣的方式來運行編譯好的程序
admin@Air:~/Downloads/of_v0.9.0_osx_release/examples/empty/myOF$ make run
HOST_OS=Darwin
HOST_ARCH=x86_64
運行截圖如下:
如果打算增加點內容, 修改 ofApp.cpp
中對應的函數即可.
顯示/修改刷新頻率
- 顯示刷新頻率:
在 draw
中增加這一句:
ofDrawBitmapString(ofToString(ofGetFrameRate())+"fps", 10, 15);
可以在程序窗口左上角顯示幀速率
- 修改刷新頻率
在 setup
中增加這一句:
ofSetFrameRate(60);
讓圖形邊緣平滑
在 setup
中增加這幾句:
// 修改繪制精度
ofSetCircleResolution(120);
// 開啟抗鋸齒
ofEnableSmoothing();
// 開啟垂直同步
ofSetVerticalSync(true);
修改背景色
在 setup
中增加這一句:
ofBackground(0,0,0);
把背景色改為黑色.
截圖如下:
繪制其他的形狀
除了畫圓,oF 也可以畫其他的圖案:
- ofRect - 畫一個矩形。參數是:(x, y, width, height) ;
- ofTriangle - 畫一個三角形。參數是三個頂點的坐標:(x1, y1, x2, y2, x3, y3)
- ofLine - 畫一條線段。參數是兩個端點的坐標 (x1, y1, x2, y2)
- ofEllipse - 畫橢圓。參數是:(x, y, width, height)
- ofCurve - 畫一條從點 (x1, y1) 到 (x2, y2) 的貝塞爾曲線,曲線的形狀由兩個控制點 (x0, y0) 和 (x3, y3) 控制
openFrameworks
的API
函數可以在它的官網文檔查詢, 該文檔不僅包含對 openFrameworks
的 API
說明, 也包含了對插件 API
的說明, 相當詳細.
各種插件
自帶插件
openFrameworks
支持第三方插件, 我們先看看這個版本自帶了哪些插件:
admin@Air:~/Downloads/of_v0.9.0_osx_release/addons$ ls -al
total 16
drwxr-xr-x@ 15 admin staff 510 12 17 17:25 .
drwxr-xr-x@ 17 admin staff 578 12 16 21:19 ..
-rw-r--r--@ 1 admin staff 6148 12 17 17:30 .DS_Store
drwxr-xr-x@ 6 admin staff 204 11 8 17:30 ofxAssimpModelLoader
drwxr-xr-x@ 4 admin staff 136 11 8 17:30 ofxEmscripten
drwxr-xr-x@ 3 admin staff 102 11 8 17:30 ofxGui
drwxr-xr-x@ 8 admin staff 272 11 8 17:30 ofxKinect
drwxr-xr-x 17 admin staff 578 12 17 17:29 ofxLua
drwxr-xr-x@ 4 admin staff 136 11 8 17:30 ofxNetwork
drwxr-xr-x@ 6 admin staff 204 11 8 17:30 ofxOpenCv
drwxr-xr-x@ 5 admin staff 170 11 8 17:30 ofxOsc
drwxr-xr-x@ 4 admin staff 136 11 8 17:30 ofxSvg
drwxr-xr-x@ 3 admin staff 102 11 8 17:30 ofxThreadedImageLoader
drwxr-xr-x@ 4 admin staff 136 11 8 17:30 ofxVectorGraphics
drwxr-xr-x@ 4 admin staff 136 11 8 17:30 ofxXmlSettings
admin@Air:~/Downloads/of_v0.9.0_osx_release/addons$
想看到更多的插件可以來這里官網插件查找, 或者到 github
搜索 ofx
打頭的項目.
這里列舉一些比較常見的插件
- ofxUI - 華麗麗的 UI 庫。提供了很多新穎而實用的界面控件。
- ofxCv - OpenCV 的另一套可選的 oF 插件(oF 自帶一個 oFOpenCv 插件);
- ofxLibRocket - 對 librocket 庫的封裝,這個庫允許你使用 html 和 css 來布局 C++ 窗口;
- ofxTrueTypeFontUC - 對 ofTrueTypeFont 類的擴展,使其支持 Unicode 字符(例如漢字);
- ofxPCL - 對 PCL(一個專門用於處理點雲的庫) 的封裝;
- ofxTimeline - 一個用來繪制可編輯的 timeline 控件的插件;
- ofxMidi - Midi 音樂的插件;
- ofxSpeech - 語音識別插件;
- ofxVideoRecorder - 錄制視頻插件;
- ofxImageSequence - 一個用於像播放視頻一樣播放圖像序列的插件;
- ofxGifEncoder - 生成 Gif 動畫的插件;
- ofxVolumetrics - 簡單的體繪制插件;
- ofxFft - 對兩個用於進行傅里葉變換的庫 FFTW 和 KissFFT 的封裝;
- ofxNodejs - 橋接 Node.js 的插件;
- ofxLua - 橋接 Lua 的插件;
- ofxBox2d - 對流行的 2D 物理模擬庫 box2d 的封裝;
- ofxBullet - 對另一個物理模擬庫 Bullet Physics 的封裝;
- ofxLearn - 通用的機器學習插件,支持分類、回歸、聚類等任務;
- ofxJSON - 對 Json 庫 JsonCpp 的封裝;
- ofxHttpServer - 一個基於 libmicrohttpd 的 http 服務器插件;
- ofxAddonTemplate - 一個空的目錄框架,可以借鑒它自己編寫插件(這都有……--bb)。
插件使用方法:
訪問這個插件的 Github
項目主頁;
把它克隆到你的 addons
目錄:
進入你的 openFrameworks
目錄下的 addons
目錄,git clone
該項目;
如果這個項目自帶 example
,可以直接 make && make run
編譯和執行它看看結果。
說明: 本文大量參考A Brief Introduction to openFrameworks-介紹一個開源的 C++ 開發框架 openFrameworks文中的內容, 特此感謝.
參考
A Brief Introduction to openFrameworks-介紹一個開源的 C++ 開發框架 openFrameworks