RaspberryPiでopenFrameworksを使う

-----

* インストール編 ←いまここ
* [簡単なアプリを作ってみる](https://qiita.com/felis_silv/items/893b6ee0fc3b768b7e3a)
* RaspberryPiのGPIOも使ってみる（次回執筆予定）

-----
# openFrameworksって？
C++ベースの、グラフィックがインタラクティブに動くようなアプリを作るのに適したフレームワークです。グラフィックだけれど、GUIなデスクトップ環境は必要としません。

# 前提条件
この記事は、**Raspbian Buster Version July 2019**と、**openFrameworks v0.10.1**に基づいています。バージョンが変わると多分一筋縄ではいきません。

# 準備
まずは、RaspberryPiに **Raspbian Buster with desktop**(GUIなデスクトップ付き) か **Raspbian Buster Lite**(CLIのみ) をインストールしてください。
Liteの場合は、**絶対に、raspi-configでOpenGL関係の設定を弄らないでください。**無駄にハマります。

#インストール
まずはパッケージを一通り更新しておきます。

```sh
sudo apt-get clean
sudo apt-get update
sudo apt-get upgrade
```
openFrameworksのソースをダウンロードします。本家サイトの[ダウンロードページ](https://openframeworks.cc/download/)で、linux armv6版の最新のダウンロードURLを確認してから、次のコマンドを打ち込みます。

```sh
cd
wget https://openframeworks.cc/versions/v0.10.1/of_v0.10.1_linuxarmv6l_release.tar.gz
```
とりあえず、今回はホームディレクトリで作業します。URLやファイル名の部分は、最新のURLで適宜置き換えてください。

続いて、ダウンロードしたファイルを展開します。

```sh
mkdir openFrameworks
tar vxfz of_v0.10.1_linuxarmv6l_release.tar.gz -C openFrameworks --strip-components 1
```

ソースの展開が済んだら、依存パッケージをインストールするスクリプトを修正します。
install_dependencies.shの40行目のapt-getのリストの中にある、**libgles1-mesa-dev**を**libglvnd-dev**に置き換えます。

```sh:openFrameworks/scripts/linux/debian/install_dependencies.sh
apt-get install freeglut3-dev libasound2-dev libxmu-dev libxxf86vm-dev g++ libgl1-mesa-dev libglu1-mesa-dev libraw1394-dev libudev-dev libdrm-dev libglew-dev libopenal-dev libsndfile-dev libfreeimage-dev libcairo2-dev libfreetype6-dev libssl-dev libpulse-dev libusb-1.0-0-dev libgtk${GTK_VERSION}-dev libopencv-dev libegl1-mesa-dev libglvnd-dev libgles2-mesa-dev libassimp-dev librtaudio-dev libboost-filesystem-dev libglfw3-dev liburiparser-dev libcurl4-openssl-dev libpugixml-dev
```

修正したスクリプトを実行します。（RaspberryPi3 B+で10分強）
yesコマンドは忘れずにつけておきましょう。目を離した隙に、無駄にプロンプトが出て止まります。

```sh
cd openFrameworks/scripts/linux/debian/
yes | sudo ./install_dependencies.sh
```

フレームワークのビルドを開始します。（RaspberryPi3 B+で30分弱）

```sh
cd ~/openFrameworks/libs/openFrameworksCompiled/project/
make Release
```
最後に、プロジェクト用のmakeの設定ファイルに1行書き足します。
config.project.mkの325行目に-latomicを追加してください。

```makefile:openFrameworks/libs/openFrameworksCompiled/project/makefileCommon/config.project.mk
OF_PROJECT_LIBS :=
OF_PROJECT_LIBS += $(PROJECT_ADDONS_LIBS)
#OF_PROJECT_LIBS_LDFLAGS = $(addprefix -l,$(OF_PROJECT_LIBS))
OF_PROJECT_LIBS_LDFLAGS += -latomic
```

お疲れ様でした。試しにサンプルをひとつ実行してみましょう。
コンパイル中に、"copying an object of non-trivial type"の警告がいくつか出てきますが、無視です。

```sh
cd ~/openFrameworks/examples/graphics/polygonExample/
make
cd bin
./polygonExample
```
実行すると、直線や曲線が表示されてくにゃくにゃ動きます。あくまでコンソールアプリなので、Ctrl+Cで止まります。

![IMAG3716.jpg](https://qiita-image-store.s3.amazonaws.com/0/105792/e4245aa1-9d15-dcec-0688-c3773ce0a038.jpeg)

ここで重要なポイント。openFrameworksのグラフィックはopenGL ESを利用してコンソール画面にオーバーレイ表示されているので、**VNC経由では見ることができません。**RaspberryPiに直にキーボードとディスプレイを接続して操作する必要があるので、開発が若干面倒です。
また、**スクリーンショットも撮れません。**どうしても画面を保存したい場合は、画面を保存する機能をアプリに実装する必要があります。

3Dグラフィックのサンプルもあります。

```sh
cd ~/openFrameworks/examples/3d/3DPrimitivesExample/
make
cd bin
./3DPrimitivesExample
```
![IMAG3717.jpg](https://qiita-image-store.s3.amazonaws.com/0/105792/7e57f88a-b4fc-f91c-432e-28bb23364dbb.jpeg)