使用方法

インストール

Windows

以下の4つの手順が必要です

  1. OpenRTM-aist-Python-1.1.0-RC1、OpenRTM-aist-1.1.0-RELEASEのインストール
  2. Ogre3DのサイトからOGRE 1.8.1 Source For Windowsをダウンロードして実行し、ogre_src_v1-8-1/SamplesのMediaフォルダをOgreRTCのフォルダにコピー
  3. CEGUIのサイトからCrazy Eddie's GUI System 0.8.4 source code (.zip file)をダウンロードして解凍し、CEGUI-0.8.4のdatafilesをOgreRTCのフォルダにコピー
  4. さざなみフォントをダウンロードしてsazanami-mincho.ttfをdatafiles\fontsにコピーしてください。

Ubuntu

Ogre3D(1.7.3以上)、CEGUI(0.8.0以上)、boost-python、OpenRTM-aist(1.1.0)、OpenRTM-aist-Python(1.0以上)、Qt(5.0以上)をインストールしてください。
また、Open Dynamics Engineをビルドして適当な場所に置いてください。
あと、開発環境としてCodeBlocksをインストールします。
OgreRTCフォルダのOgreRTC.cbpを開いて、Build OptionからODEの場所等を設定し直してビルドします。
最後にWindowsと同じようにOgre3DのMediaとCEGUIのdatafilesをコピーします。

レンダリングシステムの設定

releaseフォルダの中のOgreRTC.exeを起動します。すると、以下のOgre3Dのレンダリングに関する設定を行うウインドウがでてきます。

どの設定で動作するかはマシンによって異なるので各自で設定してください。

※OSによってはplugins.cfgの編集が必要になる場合があります。
Ubuntuの場合は、

#Plugin=RenderSystem_Direct3D9
#Plugin=RenderSystem_Direct3D11

のようにDirect3Dのレンダリングシステムをコメントアウトしてください。

またWindowsでもDirect3D 9、もしくは11がインストールされていない場合があるので無い方はコメントアウトしてください。

ちなみに画面サイズも設定できますが本ソフトウェアでは1024×768で固定になっているので意味はありません。

起動すると以下のウインドウが表示されます。

まずはGUIによる操作の説明を行います。

右側のタブによって3Dモデルの操作等ができます。

以下の種類のタブがあります。

それでは各タブの操作方法を説明します。

ボディタブ

ボディを作成するには、

だけで作成できます。独自に作成したモデルを使用する方法は後述します。

あとは位置、姿勢、拡大率を適当に設定してください。

あらかじめモデルにスケルタルアニメーションが設定してある場合、名前を入力して設定ボタンを押して時間のスピンボックスを操作するとアニメーションを更新できます。

マテリアルを設定したい場合はマテリアルを選択して設定ボタンを押してください。

ボーンタブ

現在、GUIでのボーンの操作は未実装です。

カメラタブ

このGUIではカメラの注視点の位置、カメラの姿勢、注視点までの距離で設定します。
光源は追加することもできますが、初期の状態で1つ生成しており、このタブではその光源の位置を操作できます。

CEGUI

GUIを作成するには、

とします。

現在作成できるGUIは以下のものがあります。

CEGUIのテキスト

GUIのスタティックテキスト、エディットボックスのテキストを変更できます。
GUIを選択してテキストを適当に入力した後、作成ボタンを押せば反映されます。

CEGUIの画像

スタティックイメージに画像を張り付けるには以下の手順が必要です。

パーティクル

パーティクルは以下の順で作成できます。

サウンド

GUIでのサウンドの操作は未実装です。

画面分割

画面を分割するサブウインドウは以下の手順で作成できます。

カメラは注視点の位置、カメラの姿勢、注視点までの距離で操作します。

アニメーション

アニメーションの作成は以下の手順で行います。

あとはキーフレームに位置、姿勢を設定します。

光源

光源の作成は以下の手順で行います。

ノード

3Dモデル、パーティクル、光源、アニメーションはそれぞれ個別のノードと関連付けされています。そこで他のオブジェクトのノードにアタッチすることで位置、姿勢、拡大率を同じにできます。

ノードをアタッチする手順は以下の通りです。

他のノードとアタッチしているオブジェクトを切り離したい場合は、オブジェクトの名前に切り離したいオブジェクトを選択してデタッチボタンを押してください。

物理シミュレーション(設定)

シミュレーションを開始するには開始ボタン、停止するには停止ボタン、初期状態に戻すには初期化ボタンを押します。CFM、ERPはODE固有のパラメータでジョイントの拘束力に関連するパラメータです。
拡大率はODEのシミュレーションの大きさと3Dモデルの大きさが違う場合に設定してください。作成した全てのボディに反映されます。

物理シミュレーション(ボディ)

ボディを作成する手順は以下の通りです。

現在作成できるボディの種類は以下の通りです。

オフセット、拡大率は3Dモデルとサイズが違う場合に変更してください。

物理シミュレーション(ジョイント)

ジョイントの作成手順は以下の通りです。

現在作成できるジョイントは以下の通りです。

その他

スカイボックスは以下の手順で設定できます。

地面の作成手順は以下の通りです。

ファイル保存等

ファイルの保存はFile→Save、ファイルを開くにはOpenを選択してファイルを選択します。初期化はNewを選択します。

ファイルシステムの追加

Ogre3Dでモデルをロードする場合あらかじめフォルダを登録しておく必要があります。
登録するにはresources.cfgに記述しておくか、File→AddFileSystemでフォルダを選択して追加する方法の二種類があります。

RTCの読み込み

まず、RTシステムエディタによりPythonのRTCを作成してください。作成したファイルに変更を加えます。

まず、ファイルの先頭付近に


import OgreRTS

を追加します。そのためOgreRTS.pyは読み込むPythonファイルからパスが通るようにしておいてください。

次にMyModuleInitを以下のように書き換えます。

def MyModuleInit(manager):
  manager._factory.unregisterObject("testOgre")
  testOgreInit(manager)
  return manager.createComponent("testOgre")

ただし、testOgre、testOgreInitの部分は作成したRTCのものに変更してください。

なぜこのような変更をするかというと、ファイルを読み込んでいったん閉じて再読み込みした場合にmanager._factoryに登録したRTCが上書きされないようなのでファイルに変更があっても反映されなかったためunregisterObjectで消してやっています。

これで最低限の準備が整いました。
File→Open Pythonよりファイルを選択して読み込むことができるようにはなりました。
次に作成したRTCから3Dモデル等を操作する方法を説明します。

まず、OgreRTS.OgreObjは3Dモデルなどを操作するためのオブジェクトで以下のメンバ関数を持っています。

関数 意味 戻り値 引数
CreateBody 3Dモデルの作成 MyLink* 名前 const char* ファイル名 const char*
DestroyBody 3Dモデルの削除 3Dモデル MyLink*
setEColor 3Dモデルの色の変更 3Dモデル MyLink* float float float 透明度 float
GetBodyName 名前から3Dモデルを取得 MyLink* 名前 const char*
GetQueryScene マウスの位置の3Dモデルを取得 MyLink* X float Y float
CameraRoll カメラをロール回転 角度 float
CameraYaw カメラをヨー回転 角度 float
CameraPitch カメラをピッチ 角度 float
SetCameraPosition カメラの位置を設定 X float Y float Z float
SetCameraQuaternion カメラの姿勢をクオータニオンで設定 W float X float Y float Z float
SetCameraRotation カメラの姿勢をオイラー角で設定 roll float pitch float yaw float
CreateStaticImage スタティックイメージを作成 MyGUI * 名前 const char*
CreateStaticText スタティックテキストを作成 MyGUI * 名前 const char*
CreateButton ボタンを作成 MyGUI * 名前 const char*
CreateEditBox エディットボックスを作成 MyGUI * 名前 const char*
CreateSlider スライダーを作成 MyGUI * 名前 const char*
CreateComboBox コンボボックスを作成 MyGUI * 名前 const char*
DestroyGui GUIを削除 GUI MyGUI *
getGUIByName 名前からGUIを取得 MyGUI * 名前 const char*
CreateGuiImageSet イメージセットを作成 MyImageSet * 名前 const char* ファイル名 const char*
MyImageSet * 名前 const char* ファイル名 const char* 左上X float 左上Y float 拡大率X float 拡大率Y float 右下X float 右下Y float
DestroyImage イメージセットを削除 イメージセット MyImageSet *
getImageSetByName 名前よりイメージセットを取得 MyImageSet * 名前 const char*
CreateParticle パーティクルを作成 myParticle * 名前 const char* ファイル名 const char*
DestroyParticle パーティクルを削除 パーティクル myParticle *
getParticleByName 名前よりパーティクルを取得 myParticle * 名前 const char*
SetSkyBox スカイボックスを設定 ファイル名 const char* 大きさ int
SetFloor 地面を作成 MyLink* 平面の名前 const char* 名前 const char* ファイル名 const char* サイズ int 法線方向 int
SetShadowColour 影の色を設定 float float float
SetSubWindow サブウインドウを作成 SubWindow * 名前 const char* 名前 const char* 名前 const char* 名前 const char* 名前 const char*
DestroySubWindow サブウインドウを削除 サブウインドウ SubWindow *
restartSubWindow 止めたサブウインドウを再開 サブウインドウ SubWindow *
StopSubWindow サブウインドウを止める サブウインドウ SubWindow *
getSubWindowByName 名前よりサブウインドウを取得 SubWindow * 名前 const char*
SetSleepTime 単位フレーム時間を設定 時間 float
AddFileSystem ファイルシステムを追加 パス const char*
CreateAnimation アニメーションを作成 MyAnimation * 名前 const char* 終了時間 float
DestroyAnimation アニメーションを削除 アニメーション MyAnimation *
getAnimationByName 名前よりアニメーションを取得 MyAnimation * 名前 const char*
CreateLight 光源を作成 MyLight * 名前 const char*
DestroyLight 光源を削除 光源 MyLight *
getLightByName 名前より光源を取得 MyLight * 名前 const char*
DeatachObj ノードからオブジェクトを分離 3Dモデル MyLink *
パーティクル myParticle *
光源 MyLight *
AttachObj ノードにオブジェクトを接続 3Dモデル MyLink * パーティクル myParticle *
3Dモデル MyLink * 光源 MyLight *
パーティクル myParticle * 光源 MyLight *
3Dモデル MyLink * 3Dモデル MyLink *
パーティクル myParticle * パーティクル myParticle *
光源 MyLight * 光源 MyLight *
アニメーション MyAnimation * 3Dモデル MyLink *
アニメーション MyAnimation * パーティクル myParticle *
アニメーション MyAnimation * 光源 MyLight *
openb ファイルを開く bool ファイル名 const char*
newfile 全オブジェクト削除
reset 初期化

RTCから既に作成済みの3Dモデルtestobjを移動させるには以下のコード書けばよいことになります。

link = OgreRTS.OgreObj.getBodyByName("testobj")
            if link != None:
              link.SetPosition(x, y, z)

このようにOgreRTS.OgreObjにより3Dモデルのオブジェクトを取得してそれを操作するということになります。

3Dモデルのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetAnimation アニメーションを設定 名前 const char*
ResetAnimation アニメーションの時間を初期化 名前 const char*
UpdateAnimation アニメーションを更新 名前 const char* 時間 float
SetShadows 影の表示を設定 設定 bool
SetBornPosition ボーンの位置を設定 名前 const char* X float Y float Z float
番号 int X float Y float Z float
SetBornOrientation ボーンの姿勢をクオータニオンで設定 名前 const char* W float X float Y float Z float
番号 int W float X float Y float Z float
SetBornRotation ボーンの姿勢をオイラー角で設定 名前 const char* roll float pitch float yaw float
番号 int roll float pitch float yaw float
SetBornScale ボーンの拡大率を設定 名前 const char* X float Y float Z float
番号 int X float Y float Z float
SetBornRoll ボーンをロール回転 名前 const char* 角度 float
番号 int 角度 float
SetBornPitch ボーンをピッチ回転 名前 const char* 角度 float
番号 int 角度 float
SetBornYaw ボーンをヨー回転 名前 const char* 角度 float
番号 int 角度 float
GetBornNum ボーンの数を取得 int
ResetBorn ボーンを初期化
GetBoundingBoxSize バウンディングボックスの大きさを取得 float int
SetPosition 位置を設定 X float Y float Z float
SetScale 拡大率を設定 X float Y float Z float
Roll ロール回転 角度 float
Pitch ピッチ回転 角度 float
Yaw ヨー回転 角度 float
SetQuaternion クオータニオンにより姿勢を設定 W float X float Y float Z float
SetRotation オイラー角により姿勢を設定 roll float pitch float yaw float
SetVisible 表示設定 設定 bool
BoundingBoxVisible バウンディングボックスの表示設定 設定 bool

GUIのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetPosition 位置を設定 X float Y float
SetSize 大きさを設定 X float Y float
SetText テキストを設定 テキスト const char*
SetVisible 表示設定 設定 bool
SetFrameEnable フレームの表示設定 設定 bool
SetBackGroundEnable 背景の表示設定 設定 bool
SetFontSize フォントのサイズ設定 大きさ int
GetText テキストの取得 const char*
GetComboBoxItem コンボボックスのアイテムを取得 const char*
GetSliderValue スライダーの値を取得 float
SetColor 色を設定 const char*
SetAlpha 透明度を設定 透明度 float
SetImage イメージセットを設定 イメージセット MyImageSet * イメージセットの名前(全体の場合はfull_image) const char*
SetTextTopAligned
SetTextBottomAligned
SetTextVertCentred
SetTextWordWrapLeftAligned
SetTextWordWrapRightAligned
SetTextWordWrapCentred
SetTextLeftAligned
SetTextRightAligned
SetTextHorzCentred
ClearProperties 設定の初期化 t
SetRotatin 角度を設定 roll[deg] float pitch[deg] float yaw[deg] floa

パーティクルのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetPosition 位置を設定 X float Y float Z float
SetScale 拡大率を設定 X float Y float Z float
Roll ロール回転 角度 float
Pitch ピッチ回転 角度 float
Yaw ヨー回転 角度 float
SetQuaternion クオータニオンにより姿勢を設定 W float X float Y float Z float
SetRotation オイラー角により姿勢を設定 roll float pitch float yaw float
SetVisible 表示設定 設定 bool
BoundingBoxVisible バウンディングボックスの表示設定 設定 bool

サブウインドウのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetPosition 位置を設定 X float Y float
SetSize 大きさを設定 X float Y float
SetCameraRoll カメラのロール回転 角度 float
SetCameraPitch カメラのピッチ回転 角度 float
SetCameraYaw カメラのヨー回転 角度 float
SetCameraPosition カメラの位置を設定 X float Y float Z float
SetCameraQuaternion クオータニオンによりカメラの姿勢を設定 W float X float Y float Z float
SetVisible 表示設定 設定 bool
SetCameraRotation オイラー角によりカメラの姿勢を設定 roll float pitch float yaw float

アニメーションのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
AddKeyFrame キーフレーム追加 MyAnimationList * 時間 float
RemoveKeyFrame キーフレームの削除 キーフレーム MyAnimationList *
SetAnimationState アニメーションの時間を設定 時間 float

キーフレームのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
setTranslate 位置を設定 X float Y float Z float
setRotation 姿勢を設定 roll float pitch float yaw float

光源のメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
setColor 色を設定 float float float
SetPosition 位置を設定 X float Y float Z float
SetScale 拡大率を設定 X float Y float Z float
Roll ロール回転 角度 float
Pitch ピッチ回転 角度 float
Yaw ヨー回転 角度 float
SetQuaternion クオータニオンにより姿勢を設定 W float X float Y float Z float
SetRotation オイラー角により姿勢を設定 roll float pitch float yaw float
SetVisible 表示設定 設定 bool
BoundingBoxVisible バウンディングボックスの表示設定 設定 bool

OgreRTS.SimObjはシミュレーションを操作するためのオブジェクトで以下メンバ関数を持っています。

関数 意味 戻り値 引数
SetSphere 球を作成 MyODEBody * 名前 const char* 質量 double 半径 double
SetBox 直方体を作成 MyODEBody * 名前 const char* 質量 double X double Y double Z double
SetSylinder 円柱を作成 MyODEBody * 名前 const char* 質量 double 長さ double 半径 double
SetCapsule カプセルを作成 MyODEBody * 名前 const char* 質量 double 長さ double 半径 double
DestroyBody ボディを削除 ボディ MyODEBody *
getBodyByName 名前よりボディを取得 MyODEBody * 名前 const char*
SetSliderJoint スライダージョイントを作成 MyODEJoint * 名前 const char* ボディ1 MyODEBody * ボディ2 MyODEBody * 軸X double 軸Y double 軸Z double
MyODEJoint * 名前 const char* ボディ1 MyODEBody * 軸X double 軸Y double 軸Z double
SetFixJoint 固定ジョイントを作成 MyODEJoint * 名前 const char* ボディ1 MyODEBody * ボディ2 MyODEBody *
MyODEJoint * 名前 const char* ボディ1 MyODEBody *
SetHingeJoint ヒンジジョイントを作成 MyODEJoint * 名前 const char* ボディ1 MyODEBody * ボディ2 MyODEBody * 位置X double 位置Y double 位置Z double 軸X double 軸Y double 軸Z double
MyODEJoint * 名前 const char* ボディ1 MyODEBody * 位置X double 位置Y double 位置Z double 軸X double 軸Y double 軸Z double
DestroyJoint ジョイントを削除 ジョイント MyODEJoint *
getJointByName 名前よりジョイントを取得 MyODEJoint * 名前 const char*
DestroyAll 全削除
startSim シミュレーション開始
stopSim シミュレーション停止
SetGravity 重力を設定 重力 double
SetCFM CFMを設定 CFM double
SetERP ERPを設定 ERP double
SetSamplingTime サンプリングタイムを設定 サンプリングタイム double
SetSleepTime 待ち時間を設定 待ち時間 float
SetGroundCFM 接触時のCFMを設定 CFM double
SetGroundERP 接触時のERPを設定 ERP double
SetQuiq 速度、精度重視の設定 設定 bool
SetGroundMu 摩擦を設定 摩擦 double
SetScale 3Dモデルに対する拡大率を設定 X double Y double Z double
SetContactList 接触条件を作成 MyContactList * 名前 const char* ボディ1 MyODEBody * ボディ2 MyODEBody *
DestroyContactList 接触条件を削除 接触条件 MyContactList *
getContactListByName 名前より接触条件を取得 MyContactList * 名前 const char*

シミュレーションのボディのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetBodyPosition 位置を設定 X double Y double Z double
SetBodyRotation 姿勢を設定 roll double pitch double yaw double
SetODEScale 3Dモデルに対する拡大率を設定 X double Y double Z double
SetODEOffset 3Dモデルに対するオフセットを設定 X double Y double Z double
GetPosition 位置を取得 double int

シミュレーションのジョイントのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetJointPosition 位置を設定 X double Y double Z double
SetJointRotation 軸を設定 X double Y double Z double
ControlJointVel 角速度、速度を制御 角速度、速度 double
ControlJointToq トルク、力を制御 トルク、力
GetJointPosition 位置を取得 double int

シミュレーションでの接触は全体での設定以外に個別で設定することもできます。その個別の接触を管理するオブジェクトのメンバ関数は以下のようになってます。

関数 意味 戻り値 引数
SetERP ERPを設定 ERP double
SetCFM CFMを設定 CFM double
SetMu 摩擦を設定 摩擦 double
SetContact 接触するかを設定 設定 bool

特定条件で呼び出される関数

マウスやキーボードの操作、あるいは描画のタイミング、シミュレーション更新のタイミングで呼び出される関数を設定することができます。RTCのクラスに必要に応じて以下の関数を追加してください。

関数 呼び出されるタイミング 引数
keyPressed キーを押したとき キー int
keyReleased キーを離したとき キー int
mouseMoved マウスを動かしたとき 位置X int 位置Y int 速度X int 速度Y int
mousePressed マウスのボタンを押したとき ボタン int
mouseReleased マウスのボタンを離したとき ボタン int
ogre_init RTCを読み込んだとき
ogre_loop 描画の更新時
Simloop シミュレーションの更新時
Contacthandler 個別に設定した物体が接触したとき ボディ1 MyODEBody * ボディ2 MyODEBody *
〜Clicked GUIのボタンが押されたとき(〜はGUIの名前)
〜SliderChanged GUIのスライダーの値が変化したとき(〜はGUIの名前)