UC-win/Roadと他の3次元CADなどのアプリケーションとでデータ交換を行うには、UC-win/RoadのSDKを使用して開発したプラグインを利用します。現在、すでに多くの連携プラグインが開発され活用されています。この節では、サンプルソースコードを用いて連携プラグインの作成方法を説明します。
|
3D・VRソフトUC-win/Roadは、さまざまなCADアプリケーションとの間で3次元データの連携が可能となっています。SDKを用いた開発によってすでに製品に搭載されている連携プラグインでは、Autocad
Civil 3D【注1】、InRoads【注2】などに対応しています。また、LandXMLやShapeFileなどのファイル形式の読み込み/書き込みプラグインも備わっています。
通常、CADアプリケーションとの連携機能を開発する場合は、UC-win/Roadで用意されている3つのオブジェクトを対象にします。
ひとつは3Dモデルです。UC-win/Roadでは3Dモデルで一般的な3D情報を扱うことができ、これらはポリゴンの三角形の頂点情報、色の情報および画像に関する汎用性のある情報が保存されています。これによって、他のさまざまなCADソフトとの間で幾何学データを交換することが可能となっているのです。
次に、道路オブジェクトがあります。3Dモデルと異なり、最終的な形状情報ではなく大元となる設計データを持ち、3D描画を行う前に3D形状を自動的に生成します。この機能によって、道路設計アプリケーションとの双方向データ交換が可能となっています。
最後に、UC-win/Roadの地形オブジェクトは地盤の標高データを保存しています。これは、3Dモデルよりさらに簡単に扱うことのできるオブジェクトで、道路の法面の生成も考慮されたものになっています。
また、CADデータをプラグインのプログラム側で管理し、一般的なOpenGL関数でUC-win/Roadの画面に描画させることもできます。この後は、道路のデータ連携を中心に説明していきます。
UC-win/RoadのRoadオブジェクトは1本の道路の線形情報と横断面の変化情報を持ち、3次元モデルの生成および描画関数を持つオブジェクトです。
線形情報としては平面線形と縦断線形があり、平面線形情報と横断面の変化情報は、Roadオブジェクトの直下に保存されています。縦断線形の情報は、RoadオブジェクトのメンバーであるVerticalCurveオブジェクトで保存されています。
|
■図1 |
■道路の平面線形
Roadオブジェクトの下にある各TurningPointは、平面線形のIP点(Intersection
Point)を定義します。これは道路直線空間の延長線が交差する点になります。平面線形はTurningPointの配列で定義され、その配列はRoadオブジェクトのturningPointプロパティからアクセスします。
|
■図2 |
各IP点において直線空間を結ぶ曲線のパラメータを定義し、曲線の計算をする関数も用意されています。UC-win/Roadでは、次のような5種類のIP点があります。
- 円:円形のカーブ
- 緩和曲線・円・緩和曲線:カーブが急に円形になることを防ぐために緩和曲線から入り、緩和曲線から出るカーブ
- 緩和曲線・円 : 緩和曲線から始まる、あるいは終わるカーブ
- 円・緩和曲線 :上記と同じカーブですが、線形の進行方向に対して緩和曲線と円の順を入れ替えたカーブ
- 緩和曲線:緩和曲線のみのカーブです
上記のようなカーブは、別のカーブと組み合わせた形でよく用いられます。TurningPointの主なメンバーは図3の通りです。TurningPointの種類によって使用されるパラメータと使用されないパラメータがあります。
たとえば、Circle(円)の種類であれば緩和曲線に関するパラメータは使用されません。データ構造上では_CircleTransitionCircle
(円・緩和曲線・円)の種類が宣言されていますが、実際は使用されていません。なお、_RoadVertexはスプライン道路に使用されています。
■道路の横断面の変化
道路の横断勾配はSection(横断面)オブジェクトで定義され、1本の道路の中で横断勾配を変えることができます。起点または途中の横断勾配を設定するには、Sectionオブジェクトを適用します。1つのSectionオブジェクトは複数箇所への適用や、別の道路への適用が可能です。
Sectionオブジェクトを適用するには、RoadThingというオブジェクトを使用します。RoadThingオブジェクトは道路の変化を定義します。横断面の変化の場合は道路線形上で変化を適用する追加距離を保存し、適用するSectionオブジェクトを参照します。
RoadThingを使用して、横断面の変化のほかにTransition、橋梁、トンネル空間なども設定できます。Transitionは2つの横断面変化の間に追加し、横断面の形状が急に変化しないように補間処理を設定するために使用します。RoadThingのクラス構造は図4の通りになります。
|
■図3 RoadThingのクラス構造 |
■道路の縦断線形
道路の縦断線形は平面線形と同様に方向変化点の配列を持ち、縦断線形の直線空間を結ぶ曲線のパラメータを設定します。
VerticalCurveオブジェクトのcurvePointプロパティからIP点にアクセスします。縦断線形の場合は2次曲線を使用し、設定できるパラメータは曲線の延長、所謂VCL(Vertical
Curve Length)になります。
|
■図4 縦断線形 |
■横断面オブジェクト
Section(横断面)オブジェクトが道路に適用されることで道路の横断勾配が定義されます。Sectionオブジェクトのリストは道路のリストから独立し、ProjectForRoadオブジェクトのSectionプロパティからアクセスできます。1つの横断面は4つの断面を定義する必要があり、それらは路面・歩道等を含む断面、橋梁空間で適用される橋梁断面、トンネル断面路面、道路付属物に使用する路面の標高プロファイルとなります。
それぞれの断面形状は点の配列で定義され、各点に属性が保存されています。2つの点の間に線分があり、描画方法は設定した属性で決まります。
また、線分の属性は2つの点のうち先の点の属性を使用します(図5)。属性の中では、縁石、歩道、植樹帯、ガードレール、車道、その他」などの線分の種類があります。「車道」の場合は車線数および左側か右側かという設定も必要になります。
このサンプルで道路を新規に作成し、IP点の設定を行います。作成する道路は引数で渡されるプロジェクトに追加されます。横断面としては、UC-win/Roadの地域設定に設定されたデフォルトの横断面が適用されます。
|
■図5 横断面 |
function MakeOneRoad
(project : IF8ProjectForRoad) : IF8Road;
var
//道路オブジェクトのインタフェース変数
road : IF8Road;
//道路平面方向変化点(IP点)オブジェクトのインタフェース変数
turningPoint : IF8TurningPoint;
//道路縦断線形オブジェクトのインタフェース変数
verticalCurve : IF8VerticalCurve;
//縦断方向変化点のインデックスを保存する変数
index :integer;
begin
//プロジェクトオブジェクトで新規道路オブジェクトを生成します。
road := project.CreateNewRoad;
//これから道路の平面線形を定義
//道路の起点座標を定義
//平面座標とIP点の種類を指定
//道路の起点と終点に
//「_TransitionCircleTransition」を使用
road.CreateTurningPoint(1000, 1000,_TransitionCircleTransition);
//道路に1つのカーブを定義
turningPoint := road.CreateTurningPoint(2000, 1000,
_TransitionCircleTransition);
//IP点のパラメータを設定
//起点側の緩和曲線の曲率半径
turningPoint.p_R1 := 1000;
//円弧の曲率半径
turningPoint.p_R0 := 500;
//円弧の長さ
turningPoint.p_Lr := 400;
//終点側の緩和曲線の曲率半径_TransitionCircleTransitionでは
//0を設定すると無限大の半径になる(曲率=0)
turningPoint.p_R4 := 0;
//起点側と終点側の緩和曲線が同等の定数を使用
//下記のパラメータを設定
turningPoint.p_TPParam := _AaAb;
//道路の終点座標を定義
road.CreateTurningPoint (2000, 2000, _TransitionCircleTransition);
//平面線形の計算を実行
road.CalculateEverything;
//ここから道路の縦断線形を定義
//縦断線形を生成。内部では道路の起点と終点の
//平面座標で地盤の高さを計算し縦断線形の
//初期化を行うので、この関数は平面線形を設定した //後に実行させた方がよい。この関数を呼んだ後
//縦断線形の起点と終点が設定される
road.MakeVerticalCurve(false);
verticalCurve := road.verticalCurve;
//起点と終点の高さを設定
verticalCurve.curvePoint[1].iSaveData. point.Y := 0;
verticalCurve.curvePoint[2].iSaveData. point.Y := 0;
//縦断線形に1つのIP点を追加
if verticalCurve.InsertTurningPoint (1000, 100, index) = true then
begin
//曲線の長さを設定
verticalCurve.curvePoint[index]. iSaveData.leftL := 200;
verticalCurve.curvePoint[index]. iSaveData.rightL := 200;
end;
//縦断線形の計算を実行させる
verticalCurve.CurveSlopes;
result := road;
end; |
体験セミナーのお知らせ
|
|
(Up&Coming '12 春の号掲載) |
|
|
>> 製品総合カタログ
>> プレミアム会員サービス
>> ファイナンシャルサポート
|