今回はUC-win/Road SDKの構成と内容について紹介し、さらにAPIの内容とプラグインの動作についての解説を行います。SDKのAPIを利用することで、UC-win/Roadのオプションとしての自由なプラグイン開発が可能になります。例として、リアルタイムなデータの読み取り・書き込み、およびユーザインタフェースのカスタマイズなどについて、サンプルを使用して取り上げます。
|
UC-win/Road SDKでは、UC-win/Roadを拡張するためのプラグインの開発が可能です。SDKを利用すると、UC-win/Roadの製品に含まれるプラグインと同レベルで動作するプラグインを開発できます。
UC-win/Road SDKを使用することで、以下のようなカスタマイズが可能です。
・静的なデータの読み取り/書き込み/編集
・ユーザインタフェースのカスタマイズ
・動作するモデルの状態の取得
・ユーザの操作状態の取得
・メイン画面の視点制御
・モデルやキャラクタのリアルタイム制御
・OpenGLコントロールへのアクセス
・車両運転モデルのカスタマイズ |
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のさまざまな情報やオブジェクトにアクセスしたり、追加したい手続きや関数と連携する方法について、簡単に説明を行います。
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; |
アプリケーションサービス(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の本体は、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 プロジェクトクラスとオブジェクトの概念 |
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 秋の号掲載) |
|
|
>> 製品総合カタログ
>> プレミアム会員サービス
>> ファイナンシャルサポート
|