ロボットGUIコントローラのクラス化
初稿: 2013/10/10, 最終更新: 2013/10/13
14.GUIコントローラの抽象クラスの導入とクラス化
14.1 GUIコントローラの抽象クラス
ゆるい書式のC++を便利に使っていく方針で開発を進めていきます。ロボットに関する処理がsetup、update、draw関数の中に分散して、少し読みにくくなってきてしまいました。抽象クラスを導入して、ロボットに関することだけまとめていきましょう。
新しいファイルAbstractRobotModel.hを追加します。HIROでもPA10でもGR001でもあらゆるロボットに共通する関数と引数の定義を列挙します。
#ifndef _ABSTRACT_ROBOT_MODEL_H
#define _ABSTRACT_ROBOT_MODEL_H
#include "ofEasyCam.h"
class AbstractRobotModel
{
public:
virtual void setup() = 0;
virtual void update() = 0;
virtual void draw() = 0;
virtual void draw_gui() = 0;
virtual void mouseDragged(int x, int y, int button, ofEasyCam& cam) = 0;
virtual void mousePressed(int x, int y, int button, ofEasyCam& cam) = 0;
};
#endif
openFrameworksの関数と共通の引数を持たせたかったのですが、インスタンスの受け渡し方を難しくしたくなかったので、mouse処理の関数にはofEasyCamを直接渡すようにしています。温いですね。
14.2 HIRONXGUIControler
新しいファイルHIRONXGUIControler.hおよびHIRONXGUIControler.hを作り、testApp.h、testApp.cppからHIRONXに関する記述を移します。
ロボットごとに設定ファイルを用意してそれを読み込むようにしても良い*1のですが、どこで何の処理をしているのかソースコードをよく読みこまなければわからなくなってしまいます。多少、煩雑でもソースコードにハードコーディングした方が理解に良いしアレンジもしやすいと思いますので、設定ファイルは作らない方針でいきます。
14.3 testAppの修正
ロボットに依存する関数は個別のファイルに移動します。setup関数内で、必要なロボットのインスタンスを作って、リストに登録します。イベントループ内では、抽象クラスに登録された関数を介して、それぞれのロボットに実装された関数がfor分で順に呼ばれます。
これで、複数のロボットど同時に扱うことも簡単にできるようになりました。
14.4 表示スケールの調整
記載のソースコードでは、修正はすでに適用しています。複数のロボットを同時に表示させると、よく見るとなんだか大きさが変です。GR001も表示してみると、HIRONXと同じぐらいの大きさがあります。どうも、モデル読み込みの時に勝手にスケーリングされてしまっているようですね。修正しておきましょう。
各ロボットのGUIControler.cppでスケーリングを無効にします。
model.setScaleNomalization(false);
そのままではロボットの単位がメートル、カメラの単位がミリメートルなので、表示されるロボットがとても小さくてモデルが見られません。また、ロボットを扱うときにはmmよりもm単位のほうがやりやすい気がします。そこで表示のスケールをあわせる為にカメラの単位を1000分の1します。
cam.setScale(0.001);
*1:元々OpenHRPやOpenRaveのモデルファイルはそういう設計