
AVS Technical Report -Volume7,Number1 May,2000-
可視化の作業を行う上で、球や面、線などを自由に表示させたい、と思ったことはないでしょうか。
例えば、化学の分子モデルは球と線を組み合わせて表現します。これをAVSで可視化させる場合は球と線の幾何データが必要になります。
AVS5には幾何データを扱うための「ジオメトリデータフォーマット」があり、AVS5付属のデータ変換プログラムによってAVS5に取り込むことができました。
また、GEOM関数によって幾何データを生成するモジュールを作成することもできました。
AVS/Expressにはジオメトリデータフォーマットがありません。
幾何データを作成する場合には、以下の3種類があります。
| (1)Geomオブジェクトを利用する方法 |
|---|
| Geomオブジェクトは、Main.Geometriesカテゴリに格納されています。線や面、球、矢印などの特定の幾何データを出力するオブジェクトが提供されています。 |
| (2)Fieldデータを利用する方法 |
| AVS/Expressには座標値や節点の接続情報などを設定することによってメッシュデータと幾何データを出力するモジュールが提供されています。これらのモジュールは、Main.Field_Mappersカテゴリに格納されています。 (Vizの場合は、Accessories.Field_Mappers) |
| (3)GeometryAPIを利用する方法 |
| GeometryAPIはAVS/Express5.0からサポートされた機能です。AVS5の GEOM関数と同等の機能を持っているので幾何データを生成するモジュールを作成することができます。 |
今回は、(2)Fieldデータを利用する方法と(3)GeometryAPIを用いた幾何データ生成モジュールの作成方法を紹介します。
AVS/Expressでは、フィールドデータフォーマットやUCDデータフォーマットで記述されたファイルを読み込むとField構造体のデータとして扱われます。Fieldデータはノード(節点)やセル(要素)を定義するので、UCDデータに近いタイプになります。
Field_Mappresカテゴリにあるモジュールは、ノードの座標値や接続情報を設定することによって、メッシュデータ(ノードデータを持たないFieldデータ)と幾何データを出力します。
今回は、その中から線、面、球を生成するモジュールを紹介します。
線を生成する場合は、Field_Mappers.Mesh_Mappers.line_meshを使用します。
line_meshモジュールをワークスペースにインスタンスします。図1-1のような3本の線を表示する場合は、line_meshモジュールを以下のように設定します。

図1-1 線表示
| 1. | line_meshモジュールを開きます。 |
| 2. | coordサブオブジェクトを選択し、マウス右ボタンを押したまま Properties...を選択するとcoordの プロパティ・エディターが表示されます。 |
| 3. | Current_Propertiesにある dimensions を選択し、配列の要素数を設定します。三次元で頂点を4点とるので Value入力領域に [4][3] と入力し、Setボタンを押します。 プロパティ・エディターを終了します。 |
| 4. | coordサブオブジェクトに頂点の座標を入力します。 coordを開き、以下の値(赤字部分)を設定してください。配列データを入力する場合は、Ctrl+リターンキーで確定します。 coord[4][3] = {{0,0,0},{1,0,0},{0,1,0},{0,0,1}} |
| 5. | connectに頂点の接続情報を入力します。 今回は原点を始点とし、残りの3点を終点とする3本の線を作成します。頂点には、coordに設定した座標順に0から順に番号が割り振られるので、以下のような結線情報を入力します。 connect[] = {0,1,0,2,0,3} |

図1-2 線表示のネットワーク
表示オブジェクトの色を設定する場合には、以下の三通りが考えられます。
Field_Mappers.Data_Mappers.node_scalarモジュールとField_Mappers.combiners.combine_mesh_dataモジュールを使用します。node_scalarは、一次元配列から各ノードのスカラーデータを生成するモジュールです。combine_mesh_dataはメッシュデータとノードデータからFieldデータを生成するモジュールです。
node_scalarモジュールをインスタンスし、node_scalar.in_dataにノードデータを設定します。以下の値を入力してください。
in_data = {10,15,20,30}
図2-1のようなネットワークを作成します。

図2-1 線表示(カラー)のネットワーク

図2-2 線表示(カラー)
Field_Mappers.Data_Mappers.node_colorsモジュールを使用します。node_colorsは各ノードのカラーデータを生成するモジュールです。色はRGBで指定します。
node_colorsを開き、in_dataサブオブジェクトのプロパティ・エディターを表示します。配列の要素数 dimensions を [4][3] に設定します。in_data にRGB値を入力します。
in_data[4][3] = {{1,0,0},{0,1,0},{0,0,1},{1,1,1}}
図2-1のネットワークの node_scalar と node_colors を入れ替えます。
セル毎に色を設定する場合には、Field_Mappers.combiners.combine_mesh_cell_dataを使用します。combine_mesh_cell_dataは、メッシュデータとセルデータからFieldデータを生成するモジュールです。
色情報は、combine_mesh_cell_data.in_dataに設定します。設定方法には、ノードと同様にデータとして設定する場合とRGB値を直接設定する場合の二通りがあります。
セルデータとして設定する場合には、combine_mesh_cell_data.in_data に以下のような値を設定します。
in_data = {10,20,30}
RGB値を設定する場合には、in_dataサブオブジェクトのプロパティ・エディターから配列の要素数 dimensions を [3][3] に選択します。in_data に以下のようなRGB値を入力します。
in_data[3][3] = {{1,0,0},{0,1,0},{0,0,1}}
RGBを使用する場合には、RGB値をセルデータではなくカラーであることを示す必要があります。以下のフラグを設定してください。
combine_mesh_cell_data.in_data.cell_data.cell_data[0].id = 667
node_colorsにはRGBフラグがデフォルトで設定されているので、この操作は必要ありません。
面を生成する場合は、Field_Mappers.Mesh_Mappers.polyhedron_meshを使用します。
polyhedron_meshモジュールをワークスペースにインスタンスします。図3-1のような三角錐を構成する4つの面を表示する場合は、polyhedron_meshを以下のように設定します。
| 1. | polyhedron_meshモジュールを開きます。 |
| 2. | coordサブオブジェクトを選択し、2.1の線表示の座標と同様にプロパティ・エディターを表示させます。三次元で頂点を4点とり、三角形を4枚作成するので配列の要素数を [4][3] とします。(2.1の線表示の座標と同じ座標を使います) |
| 3. | coordに頂点の座標を入力します。
coord[4][3]={{0,0,0},{1,0,0},{0,1,0},{0,0,1}} |
| 4. | 面を作成する場合はpolyhedron_meshモジュールのpoly_nodesサブオブジェクトで面のノード数を記述する必要があります。ノード数3の面を4枚作成するので、以下のように設定します。
poly_nodes={3,3,3,3} |
| 5. | connectサブオブジェクトに頂点の接続情報を入力します。
connect[]={0,1,2,0,2,3,0,3,1,1,2,3} |

図3-2 面表示のネットワーク
線表示の場合と同様に面の色を設定することができます。
セルデータとして面に色をつける場合は、Field_Mappers.combiners.combine_mesh_cell_dataを使用します。combine_mesh_cell_data.in_dataに以下の値を設定します。
combiners.combine_mesh_cell_data.in_data={10,20,30,40}
図4-1のネットワークを作成すると図4-2の表示結果が得られます。

図4-1 面表示(カラー)のネットワーク

図4-2 三角錐表示(カラー)
球を生成する場合は、Field_Mappers.Mesh_Mappers.point_meshを使用します。
point_meshモジュールをワークスペースにインスタンスします。図3-1のような球を表示する場合はpoint_meshを以下のように設定します。
| 1. | point_meshモジュールを開きます。 |
| 2. | coordサブオブジェクトを選択し、2.1の線表示の座標と同様にプロパティ・エディターを表示させます。今回は三次元で球の中心を2点とるので、配列の要素数を [2][3] とします。 |
| 3. | coordサブオブジェクトに球の中心座標を入力します。
coord[2][3]={{-1,-1,-1},{1,1,1}} |
| 4. | 半径を設定します。 半径のデータはField_Mappers.Data_Mappers.radius_dataを使用します。radius_dataは各ノードの半径のデータを生成するモジュールです。 radius_dataモジュールをインスタンスします。radius_dataモジュールのin_dataサブオブジェクトに以下のように設定します。2つの球の半径の値を1,2とします。 in_data[]={1,2} |

図5-1 球表示のネットワーク

図5-2 球表示(Subdivision=4)
AVS/Expressで球を表示させる場合、デフォルトの状態では図5-2のように角張った表示になります。これは球をポリゴン化する際に分割数を大きくしているためです。
滑らかな球を表示させる場合には、Subdivisionの値を大きくします。
コントロールパネルのプルダウンメニューから[Editors]-[Object]を選択し、Objectプルダウンメニューから Properties を選択します。さらに、Typeプルダウンメニューから [Point/Line] を選択し、表示された Subdivisionの値を変更します。
Subdivisionを大きくすると球のポリゴン数が増えるため、メモリの消費量やレンダリングに要する時間が増加するので注意が必要です。

図5-3 球表示(Subdivision=16)
球の色もnode_scalar,node_colorsモジュールを使用して設定することができます。
半径データと色データを一つのノードデータとして設定するためにField_Mappers.combiners.combine_node_datasを使用します。combine_node_datasモジュールは異なるノードデータをひとつのデータセットにまとめるモジュールです。
node_scalarモジュールをインスタンスし、node_scalar.in_dataにノードデータを設定します。以下の値を入力してください。
in_data = {10,20}
図6-1のネットワークを作成すると図6-2の表示結果が得られます。

図6-1 球表示(カラー)のネットワーク

図6-2 球表示(カラー)
GeometryAPI は、幾何データ(Geometry)を作成するための関数群です。
モジュールのソースファイル内で使用することにより、ポリゴンや球などの幾何データを生成し属性や位置の設定を行うモジュールを作成することができます。
GeometryAPIを使った幾何データの作成は以下の3つのステップに分られます。
ライブラリGeomObjを使用します。
GeomObjは以下の5つの基本タイプのオブジェクトを作成します。
ライブラリGEOMedit_listを使用します。
GEOMedit_listの関数で以下のオブジェクトの属性や幾何変換を設定します。
上記の過程で作成されたジオメトリデータをAVS/Expressのカーネルであるオブジェクトマネージャーに認識させるために変換を行います。
以上の各ステップにて使用する関数については3.3(5)ソースファイル修正を参照してください。
例として図8の幾何データを出力するモジュールの作成手順を紹介します。
図7のようなGUIを作成し、Line,Cylinder,Sphereの各ボタンでそれぞれ線、12角柱、球の表示/非表示を切り替えるアプリケーションを作成しました。

図7 サンプルアプリケーションのGUI

図8 出力結果例
モジュール作成用の環境を作成します。
任意のディレクトリにgeomapi/というディレクトリを作成し、AVS/Expressを起動します。プルダウンメニューから[Project]-[Save as...]を選択して作成したgeomapi/ディレクトリを指定し、プロジェクト環境を作成します。
モジュールを作成する場合は通常、Add_Module_Toolを使用しモジュール定義ファイル(vファイル)を作成しますが、GeometryAPIを使用したモジュール作成ではvディレクトリに直接vファイルを作成します。そのため、一度AVS/Expressを終了します。
geomapi/v/に移動し、sampleGeom.vという名前のvファイルを作成します。
vファイル sampleGeom.v :
module sampleGeom<build_dir="src",
src_file="sampleGeom.c",
process="express",
link_files="-lgeomAPI -lgeom">{
DefaultObject Top<NEportLevels={0,2}>;
int cid[3]={-999, -999, -999};
int line<NEportLevels={2,0}>;
int cylinder<NEportLevels={2,0}>;
int sphere<NEportLevels={2,0}>;
omethod+req update(.line+read+notify,
.cylinder+read+notify,
.sphere+read+notify) = "sampleGeom";
omethod+notify_deinst+req quit() = "quitGeom";
};
| 行 | 説明 |
|---|---|
| 1 | コンパイル時にgeomapi/srcディレクトリにソースファイルを作成します。 |
| 2 | ソールファイル名の指定 |
| 3 | プロセスの指定 (expressプロセスで作成する場合はC++コンパイラが必要となります。) |
| 4 | ライブラリのリンク。makefileにリンクの行が追加されます。APIを使うときはGeometryのライブラリを明示するためリンクを指定します。 |
| 6 | "GDM."はDeveloperでは必要ありません。DefaultObjectは通常のint,floatなどの代りにGeometryAPIで定義するオブジェクトです。 |
| 7 | 整数型の配列に各コンバーターIDを格納します。デフォルトとして-999を設定します。 |
| 8~10 | このintオブジェクトに値1が与えられると各々対応した幾何データを作成します。 |
| 11~13 | line,cylinder,sphereの各intオブジェクトに値1が設定された時に実行される関数です。 |
| 14 | モジュール削除時に実行される関数です。GeometryAPIで作成したコンバーターを削除します。 |
作成したvファイルをプロジェクト環境が認識するように geomapi/v/templ.v にファイル名を記述します。
以下のようにファイルtempl.vを編集してください。
$include でモジュールのvファイルを指定すると、AVS/Express起動時にLibrary_WorkspacesライブラリのWorkspace_1カテゴリに読み込まれます。
templ.v :
"$XP_PATH<0>/v/templ.v" Templates {
WORKSPACE_1 {
$include sampleGeom.v
};
};
baseコマンドでテンプレート・ソースコードの生成やコンパイル環境を整えます。
ディレクトリgeomapi/に移動し、以下のコマンドを実行します。
% /usr/local/express/$MACHINE/base -project . -gen_proc express -exit
% /usr/local/express/$MACHINE/base -viz -project . -gen_proc express -exit
備考
baseコマンドを実行するとプロジェクトディレクトリ配下にsrc/ディレクトリが作成され、その配下にソースファイルsampleGeom.cが生成されます。
自動生成されたsampleGeom.cと以下のソースファイルを置き換えます。
ZIPソースファイル:sampleGeom.c [3KB]
以下はソースファイル内で使用しているAPI関数です。
1) 初期化
GEOMnew_convertor 新しくコンバーターを作成します。
GEOMinit_edit_list エディットリストを初期化します。
2) オブジェクトの設定
GEOMcreate_sphere 球オブジェクトを作成します。
GEOMcreate_obj オブジェクトを作成します。
GEOMdestroy_obj オブジェクトのメモリを解放します。
GEOMadd_float_colors オブジェクトの色をRGBで設定します。
GEOMadd_vertices オブジェクトの頂点を定義します
GEOMadd_polygon ポリゴン(面)を作成します。
GEOMadd_disjoint_line ラインを作成します。
3) エディットリスト
GEOMedit_geometry ジオメトリデータをエディットリストに変換します。
GEOMedit_color オブジェクトの色をRGBで設定します。
4) コンバーター
GEOMconvert_edit_list エディットリストをコンバーターへ変換します。
5) コンバーターの削除
GEOMdelete_convertor コンバーターを削除します。
詳細についてはデベロッパーズ・ガイド第2部と英文リリースノートを参照してください。
コンパイルを行う場合は、環境変数 XP_PATH と MACHINE が設定されていることを確認してください。設定されてない場合は以下のように設定します。
% setenv XP_PATH /usr/local/express
% setenv MACHINE <プロダクト名>
備考
geomapi/ディレクトリに移動し、以下のコマンドによりコンパイルを行います。
% ./bin/$MACHINE/express -project .
% ./bin/$MACHINE/express -viz -project .
Library_Workspaces.Workspace_1よりsampleGeomモジュールをインスタンスし、図9のネットワークを作成します。

図9 ネットワーク例
UIshell,UItoggle,UItoggle#1,UItoggle#2モジュールは User_Interfaceライブラリにあります。
それぞれの位置(X,Y)とサイズ(width,height)を設定し、図7のようなGUIを作成します。UItoggleモジュールのlabelサブオブジェクトには順に"Line","Cylinder","Sphere"を設定します。
Line,Cylinder,Sphere 各々のボタンをonにすると対応したオブジェクトが表示されます。
offにするとオブジェクトが削除されます。全てonにすると図8のような画像が得られます。
sampleGeomは以下の環境で動作確認しました。
PEX,XGL対応のマシンにてハードウェアレンダリングモードで球を表示すると点で表示されてしまいます。これはAVS/Express3.0からの制限事項です。PEX,XGL対応のマシンで球表示を行う場合は、ソフトウェアレンダリングでおこなってください。
フィールドデータを使用した幾何データの作成方法は、すでに用意されているモジュールにデータを渡すだけでオブジェクトを生成できるため作業時間が短縮されます。
ただし、複数の違う形状の幾何データを扱う場合にそれぞれの属性変更を行おうとすると、オブジェクト毎にパネルで設定する必要があります。
GeometryAPIを利用してモジュールを作成する方法は、GEOM関数を理解してモジュールを作成するのは大変ですが、複数のオブジェクトを表示させる場合には、オブジェクトの生成から属性変更までをモジュール内部で一括して行えるので便利です。
AVS/Express(AVS5も同様ですが)は、可視化ソフトに位置づけられています。
数値データを読み込んで幾何データに変換することを想定しているために、外部フォーマットの幾何データを読み込む機能は充分ではありませんが、GeometryAPIが提供されたことによって、その考えが変わりつつあります。
お客様から「VRMLデータをAVS/Expressで読み込みたい」という質問を頂くことがあります。
残念ながらAVS/Expressの標準機能では実現できませんが、VRMLファイルから Sphere,Cylinder等のキーワードと、半径や座標、属性等の情報を拾い、そのデータを元に GeometryAPI関数を用いて幾何データを作成することができます。
また、DXFのような幾何データを読み込むモジュールを作成することも可能です。
簡単なオブジェクトの場合でも、今回はオブジェクトのデータをソースファイル内に直接書き込んだ例を紹介しましたが、前述のようにファイルから読み込むことも、GUIを作成して幾何データを入力することも可能になります。
この GeometryAPIの機能が加わったことで、幾何データを出力するモジュールの作成が容易になりました。既存のモジュールでは思い通りの幾何データを作成することができない場合は、GeomrtryAPIを用いたモジュール作成をおこなってみてはいがかでしょうか。
その際の参考にしていただければ幸いです。
AVS Support Center, fns-avssup@cs.jp.fujitsu.com