TL; DR
自作の野球シミュレータ(C++)をGUI化したかった。 ゆくゆくはゲーム化したいという野望があったので、ゲームエンジンの力を借りることにした。 UnrealEngineほか選択肢はいくつかあったが、OpenSiv3Dを布教されたので使ってみることにした。
私はWindowsでの開発が好きではなかった。どうやらOpenSiv3DはLinuxでも動くらしく、WSLで動かしてみようと思い、本体のビルドとサンプルアプリケーションのビルドまではうまくいった。その手順をここに残しておくので、「OpenSiv3DをLinuxで動かしたい!」という人の参考になると思う。
結論 : 試行錯誤の末、WSLでは(2019年6月27日現在)OpenGL4を動かすのは無理ということが分かった。
OpenSiv3Dは必要要件にOpenGL4が要ったっぽい。結局WSL上でアプリケーションを動かすことはできなかった。つまり、供養エントリである。
OpenSiv3Dとは
前身のSiv3Dの説明を、公式から引用(このページは旧バージョン)。
Siv3D は C++ で楽しく簡単にインタラクティブなアプリケーションを作れるライブラリです。2D / 3D グラフィックスやオーディオを自在にコントロールし、Kinect や Leap Motion, カメラやマイクといった様々なデバイスを使った複雑なインタラクションを短いコードで書けます。
これが改良されたものらしい。旧 Siv3D との違い OpenSiv3D リファレンス より引用。
2012 年に最初のバージョンが公開された旧 Siv3Dを、より実用的でモダンな設計に置き換えるため、2016 年 3 月にOpenSiv3Dプロジェクトがスタートしました。
使用例は作者本人によるQiitaがわかりやすい。ブロック崩しが28行のコードで書けるなど、かなり便利なように見える。
インストール
インストールのためには以下のライブラリが必要。
The dependent libraries are as follows:
aptで入れられるものはaptでインストールする。自分の環境で足りなかったものは以下の通り。
$ sudo apt install libopenal-dev libturbojpeg0-dev libgif-dev libvorbis-dev libwebp-dev libogg-dev libglew-dev ninja-build libudev-dev
aptだとダメなものたち
OpenCV4のインストール
だいたい これ の通りにやる。ビルドに時間がかかるので、下のboostなどと並行してやると吉。 いくつか注意。
- Step #3 は今回いらないので飛ばす
- Run CMake for OpenCV 4 の箇所を、
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D OPENCV_ENABLE_NONFREE=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D BUILD_EXAMPLES=ON ..
とする(説明は省くが、 CMake
でのビルドの際に使う pkg-config
の処理がうまくいくようにしている)。
boost
aptだと最新版が入らないので、最新版を公式からビルドする。2019-06-27時点では1.70.0が必要とのことだったが、公式にその旨の記載がなく、いくらか回り道をした。これからLinux版をインストールする人は公式Slackでboostの必要バージョンを訊ねた方が良さそう。ある程度ビルドに時間がかかります。
1.70.0はここ
ダウンロードしたヘッダファイルを /usr/include
に配置。
あと、ここの手順に従ってビルドして、 libboost_***.so
や libboost_***.a
を生成し、 /usr/local/lib/
に配置。
angelscript
そもそもaptにないので、公式 からダウンロード。解凍したあと、
$ cd path/to/sdk/angelscript/projects/gnuc $ make $ cd ../../lib $ sudo cp libangelscript.a libangelscript.so /usr/local/lib
OpenSiv3D本体のビルド
ガイド に従ってビルド。
サンプルアプリケーションのビルド
$ cd App $ mkdir build $ cd build $ cmake .. $ make
できた ./Siv3D_App
を実行した結果がこちら。
131: [error] EngineError: glfwCreateWindow() failed. [OpenGL 4.1 is not supported] zsh: segmentation fault (core dumped) ./Siv3D_App
「OpenGL4.1に対応していないので glfwCreateWindow()
が失敗します」。
その後調べると、現状WSLからOpenGL4.1は使えないこと、そもそもWSLはグラフィック用途で使うべきではないなどのStackoverflowの回答を発見し、悲しくなってしまった。
終わりに
So far, trying to develop OpenGL on WSL seemed like a futile attempt. However, for a beginner, failure is always a part of learning. Here are a few takeaways:
この人と同じく、グラフィックやりだす前にWSLの限界が知れてよかった! という気持ちになった。やったね!
あと、CMakeのことがなんとなくわかるようになったこともよかった。時間は溶けたが学びはあった。
今後:とりあえず外付けSSDを買ってネイティブLinuxを入れ、そこで使ってみたいと思う。成功したら追記したい。
Slackでたくさん助けていただいた@reputelessさん、@wynd2608さん、本当にありがとうございました。
追記
OpenSiv3DのLinuxでのインストールの際、2点ほど引っかかったのでここに書いておく。
1. 1点インクルード忘れ? があった。
OpenSiv3D本体のビルドで、 ninja
を実行するステップ。
/home/szkieletor/.local/lib/OpenSiv3D/Siv3D/src/Siv3D/Geometry2D/SivGeometry2D.cpp:2765:72: error: use of undeclared identifier 'gVec2' return std::max(0.0, boost::geometry::distance(gBox(a.pos, a.br()), gVec2(a.x, a.y)) - b.r);
みたいなエラーが出た。
boost::geometry::model::d2
が定義されているのは boost/geometry/geometries/point_xy.hpp
だが、これがインクルードされていないようだった。
SivGeometry2D.cpp
に
# include <boost/geometry/geometries/point_xy.hpp>
を追加したらビルドが成功した。
2. サンプルプログラムのビルドで、要求される libSiv3D.a
のロケーションがデフォルトと違う
Release/libSiv3D.a
を要求されたので、そこにコピーしてあげる。
$ mkdir Release // OpenSiv3D/Linux で
$ cp libSiv3D.a release
これでサンプルプログラムのビルドもうまくいった。
何か質問や訂正などあれば、遠慮なくTwitterまでどうぞ。