介紹一個非常好用的跨平臺C++開源框架:openFrameworks

原文位置:http://www.cnblogs.com/freeblues/p/5754158.html

介紹一個非常好用的跨平臺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

發佈了231 篇原創文章 · 獲贊 256 · 訪問量 145萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章