xpswmmプラグインは、流出・氾濫解析シミュレーションが行えるxpswmmの解析結果を時刻歴のステップ毎にOpenGLで描画します。また、マイクロシミュレーションプレーヤーは、UC-win/Road
の3D モデルや3D キャラクタをシミュレーションの要素に割り当て、各要素の動きを表示して析結果を可視化します。ここでは、これらとの連携について説明します。
|
xpswmm による流出・氾濫解析結果をUC-win/Road へインポートし、氾濫流の描画、下水道網の描画、および管内流の描画を行い、時刻歴に基づくシミュレーションをUC-win/Road上で表現するプラグインツールです。xpswmm
本体にもアニメーション機能、ビューア機能が備わっていますが、UC-win/RoadのVR
機能を用いることで、計算結果の確認をVR 空間で可視化することが可能になります。
|
■図1 キャラクタの移動の再現の仕組み |
以下に、xpswmm の計算結果をUC-win/Road へインポートして行う描画の方法を紹介します。
■氾濫流による浸水エリア、浸水深の描画
[下水道から溢水]→[溢水した水による地表面氾濫]→[氾濫流の下水道への戻り]といった、氾濫発生から収束までの一連の水理現象に関して、時刻歴に基づいた浸水エリアと浸水深の描画を自動的に行います。
xpswmmでは、解析領域を細かなメッシュに分けて解析を行っています。解析領域におけるメッシュ格子点での各水位が保存されたファイルを読み込み、水位毎に色分けして描画しています。時刻歴毎のデータが存在すれば、ツールバーを利用してステップ毎の状態を確認することができます。
|
■図2 キャラクタの移動の再現の仕組み |
■氾濫流による流速ベクトルの描画
氾濫流の流速・方向について、時刻歴に基づいたベクトル表示が可能です【図04】。氾濫流の流れの様子がより分かりやすくビジュアルで確認できます。xpswmm
での時刻歴毎の各格子の流速解析結果をUC-win/Road へ読み込み、グリッド四隅の流速の平均をその位置の流速として、方向を加味した矢印で表面流の情報と共に描画しています。
|
■図3 氾濫流による流速ベクトルの描画例 |
■下水道網の描画
下水道管およびマンホールからなる下水道網の敷設状況を3D・VR 上で描画することができます【図05】。xpswmm
の出力機能を利用して出力した下水道網で使用しているマンホール(ノード情報)やパイプ(リンク情報)をUC-win/Road
へ読み込み、OpenGL の円柱描画機能を使用して描画しています。
|
■図4 管内流の描画 |
■管内流の描画
下水道網の管内流について、時刻歴に基づいた管内水面の上昇・下降、流速ベクトルを描画できます【図06】。xpswmm
の1D 結果データから水流解析結果をUC-win/Road へ読み込み、下水道網の各部対応した時刻歴での各ステップに対応した水位を描画します。水位と共にパイプ管内では水流の速度をオプションで設定した長さに置き換えた矢印で同時に描画します。
|
■図5 管内流の描画 |
プラグインには、xpswmm ツールバー、データインポート画面、氾濫流画面オプション、下水道網描画オプションの各画面があり、それらのオプションを基にツールバーで時刻を制御しながらUCwin/Road
上に各データを描画しています。
■ツールバー
プラグインを読み込むと、メイン画面にxpswmm 用のツールバー【注2】が表示されます【図07】
。ツールバーでは、xpswmm から出力された解析結果ファイルの読み込み、シミュレーションの制御(時間設定、アニメーションの実行、停止など)が行えます。
|
■図6 ツールバー |
■解析結果インポート画面
対応する表面流、下水道網、管内流のデータを選択し、現在のUC-win/Road プロジェクト上へ読み込みます【図08】。読み込みと同時に、xpswmm
の座標情報とUC-win/Road の座標情報の関連付けも行っています。
|
■図7 解析結果インポート画面 |
■氾濫流描画オプション画面
表面流の解析結果データのUC-win/Road 上での描画方法などを設定します。
|
■図8 氾濫流描画オプション画面 |
■管内流描画オプション
マンホール、パイプ内の水流のUC-win/Road 上での描画方法などを設定します。
|
■図9 管内流描画オプション画面 |
ここでは、xpswmm プラグインを開発する際のポイントについて紹介します。
■ツールバーの追加と削除
ツールバーをメイン画面に追加するには、IF8Application.mianForm.AddTolbar()
を使用します。TToolbar を追加したフォームTForm を定義し、上のインタフェースでメイン画面にプラグイン用のツールバーを追加します。プラグインで追加したツールバーは、プラグインを削除する場合など、不要になった時点でIF8Application.mianForm.RemoveTolbar()
を使用して削除
します。
|
■図10 TForm の例 |
//ツールバーの追加
var
toobarForm : TForm; //上のTToolbarを貼ったフォーム。
begin
ApplicationService.mainForm.AddToolBar(toolbarForm.toolbar,'ToolbarName');
end;
//ツールバー削除
var
toobarForm : TForm; //上のTToolbarを貼ったフォーム。
begin
ApplicationService.mainForm.RemoveToolbar(toolbarForm.toolbar);
end; |
■メッシュの描画
表面流などのメッシュの描画はIF8OpenGL.PaintScene で行っていますが、数千、数万のグリッドがあるので、あらかじめすべての情報を配列にまとめ、OpenGL
の頂点配列を利用したglDrawElement(s【)注3】を使用して描画しています。以下はソースコードの一部になるので、詳細は別途OpenGL
解説書などを参照してください。
var
color_array : array of GLPointType;
vertex_array : array of GLPointType;
begin
// 頂点色の配列の設定
SetLength(color_array, numberOfPoint);
color_array[0] := ….
color_array[1] := ….
...
color_array[n] := ….
// 頂点座標の配列の設定
SetLength(vertex_array,numberOfPoint);
vertex_array[0] := …
vertex_array[1] := …
...
vertex_array[n] := …
// 頂点配列色を追加
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT, 0, @(color_array[0]));
// 頂点配列座標を追加
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, @(vertex_array[0]);
// 描画関数のコール
glDrawElements(GL_QUADS, HIGH(vertex_array)*4, GL_
UNSIGNED_INT, @(vertex_array[0]));
end; |
■コンタ描画
ポリゴンの頂点に色を設定すると、ポリゴン内で色のグラデーション表示が可能になります。
この図のOpenGL に関するソースコードは以下の通りです。
glClear(GL_COLOR_BUUFER_LIST);
glShadeModel(GL_SMOOTH);
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glBegin(GL_TRIANGLES);
glNormal3f(0,0,1);
glColor3f(1.0,0,0);
// 左下の頂点の色を赤に設定
glVertex3f(-10,0,0);
glColor3f(0,1.0,0);
// 右下の頂点の色を緑に設定
glVertex3f(10,0,0);
glColor3f(0,1.0,0);
// 上側の頂点の色を青に設定
glVertex3f(0,10,0);
glEnd;
glEnable(GL_LIGHTING);
glEnable(GL_CULL_FACE); |
このプラグインは頂点配列を使用ているので、glColorpointer()を用いて水位標高による色分けを行うことにより、解析領域全体の水位差のグラデーション表示が可能になります。水位差による色設定はオプション画面で設定します。
UC-win/Road には、マイクロシミュレーションの結果を可視化できるツールとしてマイクロシミュレーションプレーヤーがあります。UC-win/Road
の3D モデルや3D キャラクタをシミュレーションの要素に割り当て、各要素の動きを表示することで、解析結果を可視化します。この解析結果と容易に連携するために、xml
ベースのOpenMicroSim というファイル形式が用意されています、この章では、OpenMicroSim
フォーマットへの変換アルゴリズムの事例を紹介します。
■OpenMicroSim
OpenMicroSim によってターゲットとなるメインプログラムは、ソフトウェアプログラム間のシミュレーション結果の変換になります。たとえば、OpenMicroSim
は、あるシミュレーションソフトウェア「A」から、「A」の結果を考慮する必要がある別のシミュレーションソフトウェア「B」へのデータ変換に役立ちます。そのほかにも、可視化ツールとしてシミュレーション結果をエクスポートするアプリケーションが可能になります。
OpenMicroSim はエンティティの展開を記録するデータ構造を指定しています。このデータ構造では、あらゆるタイプのシミュレーションを記録できるような柔軟なデータの形式を保持することを試みています。
OpenMicroSim には、ある要素について複数の属性を保存できるようなデータ構造が用意されています。特に、要素の「タイプ」という属性は、マイクロシミュレーションプレーヤーで3Dモデルを割り当てる場合に必要な情報です。各要素の情報は時間に関連付けられており、基本的に、各要素の状態の時刻歴が保存されています。要素の状態としては位置、方向および自由な属性を保存することが可能です。時間によってシミュレーション結果を表現するので、時刻と位置情報が最低限の情報として必要になります。OpenMicroSim
にあるいくつかのタグと属性が、マイクロシミュレーションプレーヤーで利用できます。下記の項目に注意しながらファイルを作成しましょう。
●シミュレーション
Units(単位):シミュレーションデータの中で使用されている各単位を定義。メートル法での長さ、時間と角度の単位が選択可能。
●要素の状態
Time(時刻属性):時刻属性は再生時の状態定義に使用される。<P>(位置タグ):位置タグはオブジェクトの配置や位置の更新に使用される。
<D>(方向タグ):方向タグはシーン内でのオブジェクトの方向を示す3
つの角度を定義。UC-win/Road では0 がデフォルト値です。ヨー角がY 軸になる。
Transition(位置補間方法タグ):再生中に要素の状態が定義されていない時刻に、前と後の状態から位置を補間する処理の方法を定義。
●フレームの概念
OpenMicroSim ファイルにはフレームというタグがあります。
1 つのフレームでは、ある時間から別の時間までのシミュレーション結果を保存します。シミュレーション全体を1
つのフレームに保存したり、幾つかのフレームに分割して保存することも可能です。たとえば、0.5
秒毎に計算を行うシミュレーションを0.5 秒間隔のフレームで保存すれば、ファイルの中でデータを時刻にそって保存させることになります。
1 つのフレームの中ではデータが要素ごとに並ぶので、1 つのフレームでシミュレーションを保存する場合は、各要素のすべての情報をメモリ上で保持し、シミュレーションが終了したた後にファイルを保存する必要があります。複数のフレームを使えばシミュレーション途中までの結果をファイルに保存できるので、長いシミュレーションの場合は必要なメモリ容量を減らすために複数のフレームを使います。
//XMLヘッダー
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Simulations>
//シミュレーションのリスト、この例では1つのシミュレーション
<Simulation Name="UC-win/Road Micro Simulation Sample"
Length="120">
//シミュレーションのヘッダー
<Units AngularUnit="Radian" LengthUnit="Meter"TimeUnit="Second"
/>
//シミュレーションで使用されている単位の定義
<Frames>
//シミュレーションのフレームのリスト。10秒置きにフレームを保存
<Frame Time="0" Length="10"> //1つ目のフレームのヘッダ
<FixedElmt ID="8403" Type="Traffic Light"Description="Traffic
Light with Pole">
//静止要素の定義、ここでは信号機です。
<St T="0.02" Val="Green">
//最初の状態の定義、信号の色は青です。
<P>7661.93 2232.91 130.34</P> //位置情報
<D>0.82 0 0</D> //方向
</St>
<St T="9.36" Val="Yellow">
//次の状態(状態の更新)、信号の色は黄色です。
<P>7661.93 2232.91 130.34</P> //位置情報
<D>0.82 0 0</D> //方向
</St>
</FixedElmt>
<MovingElmt Mesh3D="Coupe.rm" ID="1963903"Type="Coupe"
Description="Coupe">
//移動する要素の定義、ここでは「Coupe」という自動車です。
<St T="0.07">
//最初の状態の定義、0.07秒から始まります。
<P>8412.27 1576.78 139.83</P>//位置情報
<D>-2.52 0.01 -0.00</D>//方向
</St>
<St T="0.60">
//状態の更新、ここでは姿勢情報のみを更新します。
<P>8411.69 1575.92 139.82</P>//位置情報
<D>-2.53 0.00 -0.00</D>//方向
</St>
<St T="0.96"> //状態の更新
<P>8411.10 1575.04 139.81</P>//位置情報
<D>-2.53 0.00 -0.00</D>//方向
</St>
<...省略...>
</MovingElmt>
</Frame>
<Frame Time="10" Length="10">
<...省略...>
</Frame>
<...省略...>
</Frames>
</Simulation>
</Simulations> |
有償セミナーのお知らせ
UC-win/Road SDKセミナー |
● 日時 |
2012年 11月6 日(火) 9:30 〜 14:30 |
● 受講費 |
1 名様 \18,000(税別) |
● 本会場 |
フォーラムエイト東京本社 GTタワーセミナールーム
※TV会議システムにて東京・大阪・名古屋・福岡・仙台同時開催 |
|
|
(Up&Coming '12 秋の号掲載) |
|
|
>> 製品総合カタログ
>> プレミアム会員サービス
>> ファイナンシャルサポート
|