2021年7月26日月曜日

[Python][OpenGL][pyqtgraph] 複数直方体をヌルヌル動かすだけ



複数直方体を動かすサンプルって意外と見つからなかったので書いてみた:
Cubes are moving with pyqtgraph opengl (github.com)

以下、お時間ある方向けの解説(という名の雑記)をつらつらと。

最初に出会ったのはpygameだった

Python+OpenGLで立方体/直方体動かすか!と思ってググったとある日。

私はキューブ回すおじさんのチュートリアルページに飛ばされた:
Python Programming Tutorials

このおじさんの説明だけだと「edges?? vertices?? ハァ??」と困惑すること間違いなしなので、
後日見つけたこちらのページもついでにどうぞ:
Advanced OpenGL in Python with PyGame and PyOpenGL - Stack Abuse

どうやら8個の頂点をvertices, どこ繋ぐかという二点の組み合わせをedgesと呼んでいるらしい。


このサンプルを回すとたしかにcubeが回転する。素晴らしい!

しかしこのサンプルはpygameを使っている。
pygameだとグリッドラインを引いたりxyz軸表示したりするのがことごとく自作しないといけない。
たぶん。わかりません。

ということで私は早々にpygameに別れを告げ、pyqtgraphの道を歩むのであった。

PyQtGraphは控えめに言って素晴らしい

pyqtgraph。ああ偉大なるpyqtgraphよ。

pyqtgraphの偉大さについては既に解説されているのでこちらで:
Python: PyQtGraphでリアルタイムプロット/アニメーション(サンプルコード・実装デモ付き) - Wizard Notes (wizard-notes.com)

Gridやxyz軸がそれぞれ二行追加すれば表示できるのです。偉大。

早速本題の直方体作成ですが、答えは全てこちらのanswerにあります:
pyqt5 - Plot cube using pyqtgraph in python - Stack Overflow

GLMeshItemという関数を使う都合上、先程出てきたedgesではなくfacesを定義します。
faces!? これは三点の三角形の表面という意味のようです。
6面*2 = 12個の三角形を定義すれば完了。

今回のサンプルではx,y,zは適当、length, width, heightは固定にしました。
この辺りは用途に応じて入力値で上書きしてしまえばいいかと。

update関数内でxを毎サイクル-0.2だけ動かしています。 

完・成!

おわりに

ここまで紹介してアレなんですが、リアルタイム処理ではこのサンプルはお蔵入りになりそうです。。

ros2で入力与えてヌルヌル動かすぜ!という目論見でしたが、rclpyがやけに遅くて色々試しても10~12Hz程度でしか動きませんでした。。だがこれはrclpyの性能限界であってpyqtgraphさんは悪くない!

というわけで大人しくcppで書き始めました。需要があればそのうち上げます。

おしまい。