Civil Engineer's Forum-FORUM8
このページをスタートページに設定する QR

Facebook - FORUM8

Twitter - FORUM8

YouTube - FORUM8

 サイトマップ | ご利用条件 | お問い合わせ | 英語翻訳サイト | Japanese | English | Korean | CHS/CHT | Vietnam | Francais | Europe

5
 VR開発講座(1)
今回はUC-win/Road SDKの構成と内容について紹介し、さらにAPIの内容とプラグインの動作についての解説を行います。SDKのAPIを利用することで、UC-win/Roadのオプションとしての自由なプラグイン開発が可能になります。例として、リアルタイムなデータの読み取り・書き込み、およびユーザインタフェースのカスタマイズなどについて、サンプルを使用して取り上げます。
 UC-win/Road SDKの概要

 UC-win/Road SDKでは、UC-win/Roadを拡張するためのプラグインの開発が可能です。SDKを利用すると、UC-win/Roadの製品に含まれるプラグインと同レベルで動作するプラグインを開発できます。

 UC-win/Road SDKを使用することで、以下のようなカスタマイズが可能です。

・静的なデータの読み取り/書き込み/編集
・ユーザインタフェースのカスタマイズ
・動作するモデルの状態の取得
・ユーザの操作状態の取得
・メイン画面の視点制御
・モデルやキャラクタのリアルタイム制御
・OpenGLコントロールへのアクセス
・車両運転モデルのカスタマイズ


 UC-win/Road SDKの構成

 UC-win/Road SDKをインストールすると、デフォルトでは「C:\UCwinRoad_SDK」フォルダに展開されます。

UC-win/Road_SDK」フォルダ
├─ 「Library」フォルダ
プラグインのコンパイルに必要な各種ライブラリファイルがコピーされます。
├─ 「Pluginsフォルダ」
サンプルプラグイン別にフォルダが作成され、サンプルのソースがコピーされます。
└─ 「UILフォルダ」
プラグインのフレームワークのファイルがコピーされます。

Pluginフォルダの内容
 Pluginsフォルダには【表1】のようなサンプルプログラムが入っており、ビルドすることで実際に動作するサンプルとなっています。

 上位フォルダには、Word Samples、Access Samples、AutoCad Samplesが格納されているので、確認してみるとよいでしょう。まず、これらのサンプルが動作するかどうかを確認しておいてください。うまく動作しない場合は、アプリケーションを再セットアップするなどしてください。

サンプル名 内容
AlignmentIPPlugin 線形IP情報出力ツール
MakeAlignmentDemoPlugin 道路データ作成
TerrainInfoProcessing 地形処理
TrafficSetupSamplePlugin 道路の交通設定
CameraControlSamplePlugin カメラ・視点の制御機能
EnvironmentControlSamplePlugin 環境設定
ModelControlSamplePlugin 人間キャラクタの制御
ModelExportPlugin 景観3Dモデルの出力
ModelImportPlugin 3Dモデルの作成
PerformanceProfileEditorSamplePlugin 車両の動作プロファイル編集
InteractionSamplePlugin ログ取得機能、ユーザークリックイベント
VehicleDynamicsSample 車両運動モデルの置き換え
LogExportPlugin ログ出力制御、シナリオイベント・Waypointのカスタマイズ
StationPointEditorPlugin 道路測点管理
SpeedMeterPlugin スピードメーター表示
表1 Pluginフォルダに格納されているサンプルプログラム一覧


Libraryフォルダの内容とAPIについて
 UC-win/Road SDKのライブラリは、SDKをインストールしたフォルダのLibraryフォルダ内に存在します。このライブラリにおいて中核をなすのがPluginCoreとなります。PluginCoreには、UC-win/Road SDKのすべてのインタフェースと主なデータの型が定義されています。UC-win/Roadのオブジェクトのインタフェースを使用する場合には、ここで定義されているインタフェースを通してアクセスを行うので、プラグインのソースコードでは、このPluginCoreをuses節に追加する必要があります。

 また、Libraryフォルダの中にはAPIライブラリも存在しており、ここで用意されているAPIを利用すれば、以下のようにさまざまな機能が開発できます。

シミュレーションに関する機能
VR空間内におけるシミュレーションに関する制御が行えます。
  • モデルやキャラクタのリアルタイム制御
  • メイン画面の視点の制御
  • ドライビングシミュレーション運転開始・制御

基本機能のカスタマイズ
  • 運転シミュレーションにおける車輌運動モデルのカスタマイズ
  • OpenGLコントロールへの自由な描画

編集に関する機能
静的なデータの読み取り、書き込み、編集が行えます。
  • 地形、航空写真、道路、交差点、交通、3Dモデルが該当

GUIに関する機能
ユーザーインターフェースのカスタマイズが行えます。
  • メイン画面にコントロールの追加、既存コントロールの制御

インタラクション機能
シミュレーション状況の取得やそれに伴う制御を行えます。
  • キーボード、マウス、ゲームコントローラ操作によるコールバック関数の呼び出し
  • 視点状況、ログ出力

 UC-win/Roadはプログラミングで言う一般的な「オブジェクト」で構成されています。この、UC-win/Roadの各オブジェクト(要素)に対して、地形、道路、横断面、3Dモデル、カメラ、テクスチャなどの1つのオブジェクトがそれぞれ割り当てられています。本APIでは一部のオブジェクトの中から一部の手続きや関数をDelphiのInterfaceの仕組みを用いて公開しています。


 UC-win/Roadとプラグインの連携

インタフェースの実装
 ここでは、プラグインからUC-win/Roadのさまざまな情報やオブジェクトにアクセスしたり、追加したい手続きや関数と連携する方法について、簡単に説明を行います。 

 Delphiでのインタフェースとは、クラスに実装させるメソッドを定義したものとなります。インタフェースをサポートするクラス側でインタフェースのメソッドを実装する必要があります。1つのクラスには複数のインタフェースを実装することができます。UC-win/Roadは多くのオブジェクトから構成されていますが、UC-win/Roadのオブジェクトをプラグイン側からは直接アクセスすることができません。オブジェクトが持つインタフェースを通してアクセスすることになります。PluginCoreに定義されているインタフェースを使用してアクセスを行えば、状態の取得や設定が行えます【表2】。

インタフェース名 説明
IF8UserPlugin プラグイン作成時に必要なインタフェース
IF8ApplicationServices UC-win/Roadアプリケーションのインタフェース
IF8ProjectForRoad プロジェクトのインタフェース
IF8Road 道路オブジェクトのインタフェース
IF8Terrain 地形オブジェクトのインタフェース
IF8DBObject 全てのオブジェクトのベースインタフェース
IF8ThreeDeeStudio 3Dオブジェクトのインタフェース
IF8ModelInstance 3Dモデルインスタンスオブジェクトのインタフェース
IF8OpenGLPlugin OpenGLの描画に使用するインタフェース
IF8LogServer ログの取得に使用するインタフェース
表2 PluginCoreに定義されている主なインタフェース

 Delphiでは、Supports関数を利用して、指定したオブジェクトが指定したインタフェースをサポートしていた場合はそのインタフェースを返させることができます。UC-win/Roadから取得したい値を扱うインタフェースをサポートしているかどうかの判断に使用できます。

 例として、ここではログ情報の取得時に取得する対象を分ける方法を示します。SDKのサンプルのInteractionSamplePluginのソースから該当する箇所を抜粋します。

 このように、ログ出力対象が車のモデルであれば車の情報(vehicleLogs)を取得し、キャラクタのモデルであればキャラクタの情報(character)、それ以外(movingModel)であればその情報を取得することができます。

procedure TFormLogDisplay.OnLog(dTimeInSeconds: double; instance: IF8DBObject; group: TLogExportOption);
 var
 
vehicleLogs : IF8VehicleLogs;---車
movingModel : IF8InstanceLogs;---その他
character : IF8CharacterLogs;---キャラクタ
各種アクセス先
 begin
 if Supports(instance, IF8VehicleLogs, vehicleLogs) then
  begin
  if Assigned(vehicleLogs.model) then
   logRecord.name := vehicleLogs.model.name
 else
  logRecord.name := '';
 
logRecord.ID := vehicleLogs.ID;
logRecord.position := vehicleLogs.position;
logRecord.yawAngle := vehicleLogs.yawAngle;
logRecord.pitchAngle := vehicleLogs.pitchAngle;
logRecord.rollAngle := vehicleLogs.rollAngle;
車の各種
ログ情報
 end
else if Supports(instance, IF8InstanceLogs, movingModel) then
 begin
 if Supports(instance, IF8CharacterLogs, character) then
  logRecord.name := character.characterModel.GetName
 else
  if Assigned(movingModel.model) then
   logRecord.name := movingModel.model.name
  else
 logRecord.name := '';
 logRecord.ID := movingModel.ID;
 logRecord.position := movingModel.position;
 logRecord.yawAngle := movingModel.yawAngle;
 logRecord.pitchAngle := movingModel.pitchAngle;
 logRecord.rollAngle := movingModel.rollAngle;
 end;
end;

コールバック
 コールバックとは、あらかじめ関数を定義しておき、プログラムの実行時にそれらを呼び出すことで処理を行う、プログラミング上の手法のひとつです。PluginCoreで所定のイベントに対する手続きや関数の型を定義しておけば、プラグインからその型に沿った手続きや関数をセットします。UC-win/Road側でイベントが発生した時に、対応するコールバック関数がセットされているかどうかを確認し、セットされていれば呼び出すという仕組みで、UC-win/Roadとプラグインとの連携を行います(図1)。

図1 コールバックの仕組み


ユーザー入力に関するコールバックの設定:
 ゲームコントローラの入力:ボタンが押された時と戻された時の例

procedure TFormGetUserInputs.FormCreate(Sender: TObject);
 var
 method : TMethod;

 begin
 //Game controller callbacks
 //Registers game controller button down event
 JoystickButtonUpDownProc(method) := JoystickButtonDown;
 F8InteractionSamplePlugin.winRoadApplication.RegisterEventHandler( _plgJoystickButtonDown, method);
  //Registers game controller button up event
JoystickButtonUpDownProc(method) := JoystickButtonUp;
 F8InteractionSamplePlugin.winRoadApplication.RegisterEventHandler( _plgJoystickButtonUp, method);
 end;


 UC-win/Road SDKの基本的な使用方法

 アプリケーションサービス(ApplicationServices) はUC-win/Road APIのエントリーポイントです。プラグインはアプリケーションサービスからUC-win/Roadのデータやコントロールにアクセスします(図2)。アプリケーションサービスインタフェースはAPIの最上位に位置づけされ、メニューやデータ、シミュレーション機能などを使用できます。

図2 アプリケーションサービスの仕組み


unit Sample;

interface

uses upfIntf,PluginCore,SysUtils;

function GetUCWinRoadApplicationServices : IF8ApplicationServices;
// function to acquire UC-win/Road's ApplicationServices

implementation

function GetUCWinRoadApplicationServices : IF8ApplicationServices;
 var
  UCWinRoadApplicationServices : IF8ApplicationServices;
 begin
 // The global ApplicationServices variable are adjusted to the ApplicationServices of UC-win/Road
 if Supports(ApplicationServices, IF8ApplicationServices, UCWinRoadApplicationServices) then
  result := UCWinRoadApplicationServices
 else
  result := nil;
 end;
end.

 SDKで作成されたプラグインはUC-win/Roadと同じプロセスで動作します。そのため、プラグインがロード・アンロードされる時には適切にプラグインの登録・登録解除処理を行う必要があります。
 アプリケーションサービスは、upfCore7.bplパッケージ内のupfIntfユニットで定義されたグローバル変数です。upfIntfをuses節に追加することで、アプリケーションサービスにアクセスすることができます。


 UC-win/Road本体の構造

 UC-win/Roadの本体は、3Dシーンを表現するメイン画面と各オブジェクトの入力やシミュレーションを行うためのメニュー(ユーザインタフェース、UI)、および各データ部から構成されています(図3)。

 UIでは、メイン画面上でOpenGLを使用した3次元の景観を表現し、各メニューから表示することのできる入力画面は、そのオブジェクトのパラメータにアクセスします。バージョンにより入力画面などに細かい変化はありますが、基本的な考え方は変わりません。データ部では、ユーザが入力した内容を汲み取って適切に処理し、処理した情報をUIへ返します。このデータ量はユーザの入力に応じて増減します。

 基本機能の変更はできませんが、UC-win/RoadのSDKを使用することで可能な限りのカスタマイズを行うことができます。たとえば、メイン画面にモデルを配置したり、新たな機能のためにメニューを追加するといったことが可能となります。

図3 UC-win/Roadのインタフェース


 データの構造

 UC-win/Roadのデータはオブジェクトの集合体と考えることができます。ここでいうオブジェクトとは地形、道路、構造物、樹木、標識など、景観を作る上で必要となる要素のことを指します。各オブジェクトには個別に入力・編集画面が用意されており、細かい設定ができるようになっています。

 プログラムでは、これらのオブジェクトにアクセスする単位が「クラス」となります。クラスは各オブジェクトのパラメータ情報と、そのパラメータにアクセスする方法を提供します。ユーザが追加したオブジェクトを生成したり、編集・削除するには、各オブジェクト用に実装された処理メソッドを使用して、適切に処理されます。

 UC-win/Roadでは、データの新規作成の際にプロジェクトクラスを生成します。このプロジェクトクラスが、追加された道路、構造物、樹木などすべての入力データを管理しています(図4)。すなわち、各入力画面がこのプロジェクトクラスとデータのやり取りを行うということです。

 また、オブジェクトにはUIとは無関係のデータ処理を行うためだけのクラスも存在します。この種のクラスは、メイン画面で3次元の景観を適切に表現するための補助的な処理を行います。

 道路は平面線形、縦断線形、道路断面で構成されており、それぞれが個別のオブジェクトになります。このように、複数のオブジェクトで構成されたオブジェクトもあります。

図4 プロジェクトクラスとオブジェクトの概念


 SDK APIの構造

 UC-win/Road SDK のAPIは、Delphiのインタフェース機能により実装されています。インタフェースとは実際に存在するオブジェクトにアクセスする方法を取り決めたものです。ここでいうアクセスとは、オブジェクトの生成、編集、削除の各方法のことを指します。基本的には、前述のクラス単位でインタフェースが存在しているため、オブジェクト単位でデータにアクセスすることになります。

 APIを使用するにあたっては、各オブジェクトへのさまざまなアクセス方法があります。SDKのAPIの入り口は「アプリケーションサービス」です。SDKを使用してUC-win/Roadのプラグインを作成する場合、本体のデータにアクセスするために、必ずこのアプリケーションサービスにアクセスする必要があります。これは起動したアプリケーションのプロセスごとに1つ存在します。

 アプリケーションサービスを取得すると、メイン画面の「メニュー」にアクセスできるようになります。「メニュー」では、各メインメニューのサブメニューの追加・削除が可能です。一般的にプラグインは一種のツールであるという考え方から、「ツール」メニューがよく使われ、ツールのオプションという考え方から「オプション」メニューもよく利用されます。

 各メニューのクリックイベントハンドラを記述することで、新規の入力画面を追加表示でき、入力した情報を基にインタフェースを経由してメイン画面へ反映させることが可能になります。ツールボタンの追加も可能なので、頻繁に使用する機能をメニューと共にツールボタングループとして登録することもできます。さらに、メイン画面内に表示するオブジェクトにアクセスするための「プロジェクト」を取得することもできるようになります。「プロジェクト」は、メイン画面内で表示しているオブジェクトの集合体です。「プロジェクト」を取得すると、そのインタフェースを使用して、画面内に新規にモデルや樹木のオブジェクトを追加したり、既存のモデルの位置やサイズなどの編集、さらにはオブジェクトの削除などが可能になります。

 アプリケーションサービスのインタフェースを使用すれば、新規プロジェクト作成や地形の編集、道路の追加編集が可能になるので、ほとんどの景観をプラグイン経由で作成できることになります。

なお、(図5)は「プロジェクト」に関するAPIの構造を示しています。

 また、カメラの制御、景観位置の別画面表示、シミュレーションの制御も可能となります。カメラ制御では、視点位置、方向などの設定が可能です。任意の道路の走行や運転、その際のWaypointやシナリオ制御ができるようになります。


凡例  
IF8ProjectForRoad プロジェクトデータ IF8ThreeDeeStudio 3Dモデルオブジェクト
IF8Road 道路データ IF8ModelInstance 3Dモデルオブジェクトインスタンス
IF8Section 道路断面データ IF8MovingObjectInstance 移動モデルインスタンス
IF8TurningPoint 道路平面線形の方向変化点データ IF8QuakeIII MD3キャラクタリストオブジェクト
IF8RoadThing 道路断面変化点データ IF8CharacterInstance MD3キャラクタオブジェクトインスタンス
IF8VerticalCurve 道路縦断線形データ IF8Tree2D 2D樹木オブジェクト
IF8VerticalCurveTurningPoint 道路縦断変化点データ IF8Tree2DInstance 2D樹木オブジェクトインスタンス
IF8Terrain 地形データ

 図5 プロジェクトに関するAPIの構造


 各種イベント

 オブジェクトをクリックしたときや画面が描画されたときなどには、何らかのイベントが発生します。このイベントを処理する内容を所定のイベントハンドラとして登録することで、各イベント発生時にさまざまな機能を追加することができます。

 たとえば、ある入力画面が開くときに任意のコントロールを追加することで、その入力画面に拡張データの入力部を追加したり、メイン画面の最後にシーンとは独立したものを表示させることが、イベントを制御することで可能になります。

 イベントハンドラにはそれぞれ型が存在します。型とは関数の引数の並びのようなもので、イベントが実行される際に型に応じて引数に適当な値が入ります。そして、イベントハンドラ内で処理を実行します。詳細はUC-win/Road SDKのヘルプを参照してください。


 道路の生成プロセス

 通常SDKのインタフェースを使用すれば、各オブジェクトのデータ編集が可能ですが、道路のポリゴン(クワッド)データに関しては、平面、縦断の各線形と断面から計算で求めています。SDKのAPIを使用すると、道路の線形やポリゴンへアクセスできますが、ポリゴンは計算した結果なので、データ変更などの編集は直接的には行えません。編集が必要な場合は、線形、断面を編集するようにします。
 以上、UC-win/Roadの構造について本体、データ、SDKのAPIの順に解説してきました。ここでは概念と仕組みの説明のみに留め、実際のプログラミングについては言及していませんが、UC-win/Roadの構造を大まかにつかんでおくことで、この後のプログラミングの解説を理解することに役立つでしょう。


有償セミナーのお知らせ
 エンジニアのプログラミング入門セミナー  CPD認定6.2pt
日時 2011年 9月15日(木) 9:30〜17:00
受講費 1名様 15,750円(税込)
本会場 フォーラムエイト東京本社 GTタワーセミナールーム
TV会議システムにて東京・大阪・名古屋・福岡・仙台同時開催

     
前ページ    インデックス    次ページ
(Up&Coming '11 秋の号掲載)
戻る
Up&Coming

FORUM8


お問合せ窓口




[ ユーザー紹介 ]
櫻井工業株式会社
株式会社TEAM IWAKIRI PRODUCTS
[ 開催報告 ]
第17回FORUM8デザインフェスティバル






>> 製品総合カタログ


>> プレミアム会員サービス
>> ファイナンシャルサポート

最近リリースした製品
3次元鋼管矢板基礎の設計計算(部分係数法・H29道示対応) Ver.4
UC-1・UC-1 Cloud 統合版 BOXカルバート
電子納品支援ツール Ver.17
柔構造樋門の設計・3D配筋 Ver.17
建築杭基礎の設計計算 Ver.10

キャンペーン実施中
地方創生・国土強靭化 FORUM8セミナーフェアキャンペーン
レンタルアクセス同時購入キャンペーン・過去レンタルキャンペーン
Shade3D・F8VPS 20%OFFキャンペーン

セミナー・イベントカレンダー
開催間近のセミナー
4/2  ブロックUIプログラ
  ミングツールで学ぶ
  ジュニア・プログラミング
4/3  動的解析
4/4  下水道耐震設計体験
4/5  Shade3D-F8VPS
  メタバース入門

ソフトウェア/支援サービス
VRソフト(バーチャルリアリティ)
《UC-winシリーズ》
・道路・シミュレータ
・ドライブ・シミュレータ
・マイクロ・シミュレーション
・避難解析・シミュレーション
>>その他VRソフト
FEM解析ソフト
・3次元プレート動的非線形解析
・2次元動的非線形解析
・総合有限要素法解析システム
>>その他FEM解析ソフト
土木・建築・設計ソフト
《UC-1シリーズ》
・構造解析/断面
・橋梁上部工
・橋梁下部工
・基礎工
・仮設工
・道路土工
・港湾
・水工
・地盤解析
・CAD/CIM、建設会計
・維持管理・地震リスク
・建築
・船舶/避難
>>その他土木・建築・設計ソフト
クラウド
《スパコンクラウド®》
・スパコンクラウドサービス
《VR-Cloud®》
・リアルタイムVRシステム
解析支援サービス/サポート
・UC-win/Roadサポートシステム
・設計成果チェック支援サービス
・Engineer's Studio®解析支援
・地盤解析支援サービス
・EXODUS/SMARTFIRE解析支援
・xpswmm解析支援サービス
・建物エネルギーシミュレーション
・3Dレーザスキャン・モデリング
・3D模型サービス
・3D報告書・図面サービス
>>その他支援サービス
各種ソリューション
・耐震診断/解析
・鋼橋設計
・橋梁新工法
・建築設計
・自治体
・医療系VRシステム
・パーキングソリューション
・ECOソリューション
>>その他ソリューション