ARToolKitの安定化 その④ ソースの公開 - ソースの説明
こちらも、Readmeの詳細説明用に使用いたします。
プログラムの大まかな処理は、その①やその②を見てもらっても大体はわかります。
今回は少しプログラム寄りな説明になります。
安定化プログラムでは以下のような処理を行っています
・設定ファイルを読み込む
・通常表示
・関係値の計算
・計算結果を表示する
・補完処理を加えた表示
・関係値の保存
このプログラムでは、関係値のデータと処理を行うクラス"CObjectMultiCreator"があり、
上記の処理のほとんどは、このクラスのメンバ関数内で行っています。
では、それぞれの処理を見てみます
・設定ファイルを読み込む : 関数 LoadMultiRelationInf
設定ファイルには、"複数オブジェクトファイルへのパス"と、"関係値の値"が保存されています。
初期状態では"関係値の値"は存在しません。
詳しくは、その④-EXEの使い方を参照してください。
・通常表示
通常表示では、従来のARToolKitとほぼ同様の処理を行っています。
・関係値の計算 : 関数 CalcAllMarkerRelate
キー操作により、編集モードに入ったときに、関係値の計算が行われます。
関数に入る前に、従来と同じ方法で、各マーカーの座標変換行列 "object.trans" が計算されます。
ここでマーカーA, Bが見つかったとします。
そのとき次のような計算を行います。
1.座標変換行列、"A→カメラ"と、"B→カメラ"、が分かっている。
2.1の"B→カメラ"を反転して、"カメラ→B"にする。
3.1と2から、"A→カメラ→B"という行列計算を行う。
4.3から"A → B"という座標変換行列を得る。
平均値計算用に、サンプル数と行列の合計値を、メンバ変数に蓄えておきます。
ある程度、サンプル数が溜まったら、上記と同じ方法で誤差を計算します。
これも、サンプル数と合計値の形で、持っておきます。
・計算結果を表示する
計算が大体終了したら、それを表示し、ユーザーに知らせます。
ユーザーはこの表示を見て、計算の頃合を計り、編集モードを終了します。
表示に使用される値は、マーカー関係情報の構造体"MARKER_RELATE_INFO"の、誤差の合計値"dError"や、サンプル数"lRelCount"を使用します。
・補完処理を加えた表示 : 関数 GetGLTransFromRelate
関係値が計算できても、マーカーを問題なく取得できた場合には、通常の描画を行います。
問題は、マーカー情報が正しく取得できなかった場合です。
例えば、マーカーAの情報が取得できず、マーカーBは取得できたとします。
その時は、以下のような計算になります。
1.座標変換行列 "A →B"と"B → カメラ" が分かっている
2.1より、" A → B → カメラ" という行列計算を行う
3.2の結果から、"A → カメラ" という座標系変換行列を得る
というような感じです。
・関係値の保存 : 関数 SaveMultiRelationInf
最後に関係値の保存を行います。
ファイルにデータとして保存してしまえば、時間使用時、又は他のプログラムでも再利用できます。
実行のたびに関係値を計算する手間を、省けるわけです。
更なる詳細については、プログラムを読んだり、デバック実行して、理解していただくか、
それでも分からない場合は、メールにてご連絡ください。
プログラムの大まかな処理は、その①やその②を見てもらっても大体はわかります。
今回は少しプログラム寄りな説明になります。
安定化プログラムでは以下のような処理を行っています
・設定ファイルを読み込む
・通常表示
・関係値の計算
・計算結果を表示する
・補完処理を加えた表示
・関係値の保存
このプログラムでは、関係値のデータと処理を行うクラス"CObjectMultiCreator"があり、
上記の処理のほとんどは、このクラスのメンバ関数内で行っています。
では、それぞれの処理を見てみます
・設定ファイルを読み込む : 関数 LoadMultiRelationInf
設定ファイルには、"複数オブジェクトファイルへのパス"と、"関係値の値"が保存されています。
初期状態では"関係値の値"は存在しません。
詳しくは、その④-EXEの使い方を参照してください。
・通常表示
通常表示では、従来のARToolKitとほぼ同様の処理を行っています。
・関係値の計算 : 関数 CalcAllMarkerRelate
キー操作により、編集モードに入ったときに、関係値の計算が行われます。
関数に入る前に、従来と同じ方法で、各マーカーの座標変換行列 "object.trans" が計算されます。
ここでマーカーA, Bが見つかったとします。
そのとき次のような計算を行います。
1.座標変換行列、"A→カメラ"と、"B→カメラ"、が分かっている。
2.1の"B→カメラ"を反転して、"カメラ→B"にする。
3.1と2から、"A→カメラ→B"という行列計算を行う。
4.3から"A → B"という座標変換行列を得る。
平均値計算用に、サンプル数と行列の合計値を、メンバ変数に蓄えておきます。
ある程度、サンプル数が溜まったら、上記と同じ方法で誤差を計算します。
これも、サンプル数と合計値の形で、持っておきます。
・計算結果を表示する
計算が大体終了したら、それを表示し、ユーザーに知らせます。
ユーザーはこの表示を見て、計算の頃合を計り、編集モードを終了します。
表示に使用される値は、マーカー関係情報の構造体"MARKER_RELATE_INFO"の、誤差の合計値"dError"や、サンプル数"lRelCount"を使用します。
・補完処理を加えた表示 : 関数 GetGLTransFromRelate
関係値が計算できても、マーカーを問題なく取得できた場合には、通常の描画を行います。
問題は、マーカー情報が正しく取得できなかった場合です。
例えば、マーカーAの情報が取得できず、マーカーBは取得できたとします。
その時は、以下のような計算になります。
1.座標変換行列 "A →B"と"B → カメラ" が分かっている
2.1より、" A → B → カメラ" という行列計算を行う
3.2の結果から、"A → カメラ" という座標系変換行列を得る
というような感じです。
・関係値の保存 : 関数 SaveMultiRelationInf
最後に関係値の保存を行います。
ファイルにデータとして保存してしまえば、時間使用時、又は他のプログラムでも再利用できます。
実行のたびに関係値を計算する手間を、省けるわけです。
更なる詳細については、プログラムを読んだり、デバック実行して、理解していただくか、
それでも分からない場合は、メールにてご連絡ください。
