Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> OpenDX

OpenDX(IBM Visualization Data Explorer)の設定と使い方

IBM Visualization Data ExplorerはUnix向けに開発されたフリーのビジュアライゼーションソフトである。Linux以外に、Windows、Macなどでも利用できる(ただしMac向けは有料)。ここでは、OpenDXの使い方およびWindowsでのインストール方法を解説する。なお、Linuxの場合は、付属のパッケージマネージャなどから簡単に利用できる場合が多い。

Windowsでのインストール

ダウンロードはhttp://www.opendx.org/download.html からおこないう。ソースファイルの他、Windows用バイナリ、FC4、FC5向けバイナリ、Suse10向けバイナリなどがある。執筆時点での最新版は4.4.4(OpenDX-4.4.4-Setup.exe)である。Windows版の実行にはXサーバが必要である。cygwinにフリーのXサーバがあるのでそれを利用するとよい。以下では、cygwinはインストールされているものとしてすすめる。なおcygwinのX関係はすべてインストールしておくこと。

cygwin版の場合は・・・

Windows上で動くOpenDXにはもう一つあって、cygwin版というものがある。上記の版をインストールした場合特に必要とは思われないが、一応ここに記しておく。まず、http://opendx.npaci.edu/bin/ からopendx-4.3.0-rtc-cygwin.tar.gzをダウンロードしてくる。これはルートディレクトリに置いておく。

wget http://opendx.npaci.edu/bin/opendx-4.3.0-rtc-cygwin.tar.gz

ルートディレクトリに行く。

cd /

そして解凍する。

tar zxvf /cygdrive/c/temp/opendx-4.3.0-cygwin-1.3.22.tar.gz

解凍が終了すると、インストール完了。dxで起動できる。

ubuntuへのインストール

ubuntu 8.04にはOpenDX 4.4.0が付いてくるが、バグがあって、VPEが表示されない。これを解消するには、OpenDX 4.4.4のソースコードをダウンロードしてコンパイルする必要がある。

とりあえず、ダウンロードして、

$ ./configure --enable-smp-linux
$ make

でコンパイルしてみたが、いろいろとエラーがあって、なかなかmakeが通らなかった。
以下はそのときの記録。

まず、lex、flexがないというエラーに直面したので、flexをインストール。
次に、xm.hが存在しないというエラーが出たので、libmotif-devをインストールして解消。
次は、X11/extensions/Print.hが存在しないというエラーが出たので、libxp-devをインストールして解消。
次に、linux/sys.hが存在しないという。linux-headersをインストールしても出てこない。そこで

$ sudo ln -s /usr/src/linux-headers-2.6.24-16/include/linux/sys.h /usr/include/linux/sys.h

として解消。ディレクトリは時期やバージョンによって違うので注意。
次は、yaccがないというので、byaccをインストール。
これで、makeは通るが、ImageMagickを使ったjpegでの保存ができない。
そこでImageMagickのライブラリをインストールしてコンパイルし直した。

以上で、ubuntu 8.04で使えるOpenDXができる。あとはmake installをしたあと、インストールディレクトリにパスを通せばよい。

PS どうもSMPがきいていないような気がする。

簡単な使い方

まず、はじめに球を表示してみる。まずはmatlabでデータを作成しておく。次のコードを実行すると、

x=1:20;
y=1:20;
z=1:20;
[x,y,z]=meshgrid(x,y,z);
data=(x-10).^2+(y-10).^2+(z-10).^2;
p = patch(isosurface(data,9*9));
isonormals(data,p);
set(p,'FaceColor','red','EdgeColor','None');
view(3)
camlight 
lighting phong
axis equal
axis off

fid = fopen('sphere.dat','wb');
fwrite(fid,data,'double');
fclose(fid);

Matlab球

このような球が表示されるはずである。そして、同じディレクトリにはsphere.datというデータファイルができているはずである。matlabを持っていない人は、ここからダウンロードしてほしい。sphere.tar.gz

次に、これをOpenDXを使って表示してみる。まず、コマンドプロンプトを立ち上げ、データのあるフォルダに移動する。移動した後そこで、dxと打ちOpenDXを起動する。これ重要。すると次のような画面が出てくるはずである。(もし起動しない場合は、Xサーバが起動しているか確認してほしい。このページの最初にあるように、cygwinのXサーバがおすすめである。)

ここでNew Visual Programを選択する。そして、左のToolsからImport、Isosurface、Imageの3つを配置し次のように結んでおく。

そして、ImportおよびIsosurfaceの内容をそれぞれ次の画面のようにする。

最後に、sphere.generalというテキストファイルを同じディレクトリに作成し、内容を

file = sphere.dat
grid = 20 x 20 x 20
format = lsb ieee
interleaving = record
field = field0
structure = scalar
type = double
dependency = positions
positions = regular, regular, regular, 0, 1, 0, 1, 0, 1
end

とする。
メニューのExecuteからExecute Onceを実行すると、Imageウインドウが開き、

このような球が表示されるはずである。なお、このイメージをjpegで保存するには、ImageウインドウのメニューにあるfileからSave Imageを選択し、ImageMagick supported formatを選択し、Output file name にhogehoge.jpgと入力し、Save Currentにチェックを入れてApplyを押すとJPEGファイルとして保存される。

いろいろな角度から表示してみる

先回は、単に三次元の物体を表示しただけであった。次に、見る角度を変えて表示してみる。そのためには、球体では見る角度を変えても変わらないので、球の8分の1の立体を表す。次のようなデータを作成する。再びMatlabを使い、

x=1:50;
y=1:50;
z=1:50;
[x,y,z]=meshgrid(x,y,z);
data=x.^2+y.^2+z.^2;
data(:,:,1:1)=49*49+1;
data(:,1:1,:)=49*49+1;
data(1:1,:,:)=49*49+1;

for lp=1:12
subplot(3,4,lp)
p = patch(isosurface(data,49*49));
isonormals(data,p);
set(p,'FaceColor','red','EdgeColor','none');
view(-37.5+lp/12*360, 30);
camlight 
lighting phong
axis equal
axis off
end

fid = fopen('sphere8.dat','wb');
fwrite(fid,data,'double');
fclose(fid);

と打つ。すると、下記のような図が表示されるはずである。それと同時に、sphere8.datというファイルが、同じフォルダ内にできているはずである。Matlabを持っていない人は、ここ(sphere8.tar.gz)からダウンロードしてほしい。

さて、次にOpenDXであるが、コマンドプロンプトを開き、データをおいたフォルダに移動し、dxと打ってOpenDXを起動し、先回同様New Visual Programをクリックする。そして、次のように配置し、それぞれを結ぶ。

まず、Importであるが、読み込むgeneralファイル名をsphere8.generalとする。

さて、その.generalファイルの内容であるが、テキストファイルで下記のようにする。

file = sphere8.dat
grid = 50 x 50 x 50
format = lsb ieee
interleaving = record
field = field0
structure = scalar
type = double
dependency = positions
positions = regular, regular, regular, 0, 1, 0, 1, 0, 1
end

次に、Isosurfaceの内容であるが、valueを今回は49*49の2401に設定する。

実際には、Render以下を接続せずに、Imageを2つ配置してやると、2つのイメージを表示することができる。最初の段階では、両方に同じイメージが表示されるので、イメージが表示されているウインドウのメニューからOptions、View Controlを選択し、ModeをCameraにし、それぞれSet ViewをOff BackおよびOff Frontにする。

これで、下記のような2つの図が表示されたはずである。これでは、まだばらばらなので、Collectを使ってこれらをトゥギャザーしちゃおうというわけである。

仮に、単に上記のようにRender、Collect、Arrange、Displayを結んだだけであれば、次のような表示が行われるはずである。各コントロールのパラメータを変更することによっていろいろな角度および並べ方にすることが可能であるで挑戦されたし。

色をつける

今までの例では、色は気にせずに、とりあえず立体を表示してきただけである。単色で色をつけるだけであれば少し変更するだけで、すぐにできる。前回の例をそのまま流用して、次のように接続する。ここでは、単にIsosurfaceとImageの間に、Colorを入れただけである。

そして、Colorを下記のように設定する。ここでは単にredを選択しただけである。

すると、全体が赤で色づけされる。

アニメーションを表示する

上記の設定を少し変えて、アニメーションを表示してみる。Imageを再び1つに戻して、下記のように配置する。

その上で、Import、Isosurface、Color、は先回の設定と同じに設定する。まず、Imageの設定であるが、Camera Widthを200に設定する。

Rotateの内容は、y軸を変化させるとして、x軸は30度ほど傾けておく。

y軸の変化であるが、これは、Sequencerで変化させる。Sequencerをダブルクリックすると、

このようなコントロールウインドウが現れる。ここで右上のボタン「...」をクリックすると

このようなFrame Controlが現れる。(もし、ウインドウが画面外であるようならば、タスクスイッチ上で右クリックをし、「移動」を選択し、この状態でキーボードの十字キーのどれかを押すと画面内に現れる。)そして、上記画面のように、Minを0にIncrementを10にMaxを360に設定する。そして、三角の再生ボタン押すと回転し始める。さらに左上の連続再生ボタンをオンにしておくと、回転し続ける。

アニメーションを保存する

先回のアニメーションでは、ただ見るだけで、それを保存することはしなかった。実際にはプレゼンテーションなどで使えるようなムービーファイルを作成したいときがある。そのためには下記のように変更する。具体的には、FormatとWriteImageを追加し、接続しただけである。

そして、Formatの内容を

このように、image%03d.jpgの様に入れる。ここの%03dはC言語のprintfなどと同じである。
WriteImageの方は、次のように入れる。

formatの項目が途切れていて見えないが、実際には"ImageMagick supported format"と書いてある。
これで、1回再生すると、Image000からImage010、Image020とImage360までの連続したJPEGファイルが作成される。(なおImage000とImage360は同じ内容である)
あとは、適当なソフトで、一連のイメージをムービーに変換すればよい。たとえば、QuickTime Proでイメージシーケンスを開くから作成したものがこれ(image000.mov)である。フリーのものでは、ffmpegなどがおすすめである。

物体にカラーデータを貼り付ける

先回までは、単に3次元物体の表示のみを行ってきた。実際には、ある物体上の温度分布や、物体の各部分にかかる応力などをカラースケールで表示したい場合もある。

まず、Matlabで次のようなデータを生成する。

rand('state',0)
x=1:50;
y=1:50;
z=1:50;
[x,y,z]=meshgrid(x,y,z);
data=x.^2+y.^2+z.^2;
data(:,:,1:1)=49*49+1;
data(:,1:1,:)=49*49+1;
data(1:1,:,:)=49*49+1;

cdata = rand(50,50,50);
cdata = smooth3(cdata);
cdata = smooth3(cdata);
cdata = smooth3(cdata);
cdata = smooth3(cdata);
cdata = smooth3(cdata);

for lp=1:12
subplot(3,4,lp)
p = patch(isosurface(data,49*49));
isonormals(data,p);
isocolors(x,y,z,cdata,p);
set(p,'FaceColor','interp','EdgeColor','none');
view(-37.5+lp/12*360, 30);
camlight 
lighting phong
axis equal
axis off
end

fid = fopen('sphere8.dat','wb');
fwrite(fid,data,'double');
fclose(fid);

fid = fopen('sphere8c.dat','wb');
fwrite(fid,cdata,'double');
fclose(fid);

これを実行すると、

このような、図が表示されたはずである。そして、同じフォルダ上にできた、sphere8.datが構造のデータ(これは先回使ったものと同じである)、sphere8c.datがカラーデータ、すなわち、温度分布などが入っているデータである。どちらも、50x50x50の3次元マトリックスである。このデータファイルは、ここ(sphere8.tar.gzsphere8c.tar.gz)に置いておく。
OpenDXであるが、まず、次のように配置する。

ここでは、左側のImportが構造のデータを、右側のImportがカラーデータを読み込む。左側のImportは先回と同様に設定する。カラーデータを読み込むImportは次のように設定する。

そして、sphere8cdata.generalというテキストファイルを同じフォルダに作り、内容を、

file = sphere8c.dat
grid = 50 x 50 x 50
format = lsb ieee
interleaving = record
field = field0
structure = scalar
type = double
dependency = positions
positions = regular, regular, regular, 0, 1, 0, 1, 0, 1
end

つぎにColormapをダブルクリックし、maxの値をカラーデータの最大値05931に、minの値を0.4064に設定する。

これで実行すると、次のような図が表示されるはずである。なお、視点はOff Backである。

なお、Matlab標準のjetカラーマップとは、カラーマップが違う。

カラーバーも一緒に表示する

カラーバーを表示するのは簡単で、先回のものに加えて、ColorBar、Collectを下記のように追加すればよい。

特に設定は行わなくても、次のように、カラーバーが追加されるはずである。

滑らかではない構造データを表示する

先回までの構造データは、球を元にしたデータで中心から少しずつ数値が増えていく非常に滑らかなデータであった。しかしながら、すべての構造物が数学的に表せるわけではない。たとえば、地形データの表示や人体上の温度分布などを表示する場合、別の方法が必要である。
最も簡単な方法は、構造物の内部を1、外部を0として表示するものである。
下記は8分の1の球のデータを0と1だけで表示するものである。

rand('state',0)
x=1:50;
y=1:50;
z=1:50;
[x,y,z]=meshgrid(x,y,z);
data=x.^2+y.^2+z.^2;
data(:,:,1:1)=49*49+1;
data(:,1:1,:)=49*49+1;
data(1:1,:,:)=49*49+1;
data(data<49*49)=0;
data(data>=49*49)=1;

cdata = rand(50,50,50);
cdata = smooth3(cdata);
cdata = smooth3(cdata);
cdata = smooth3(cdata);
cdata = smooth3(cdata);
cdata = smooth3(cdata);

for lp=1:12
subplot(3,4,lp)
p = patch(isosurface(data,0.5));
isonormals(data,p);
isocolors(x,y,z,cdata,p);
set(p,'FaceColor','interp','EdgeColor','none');
view(-37.5+lp/12*360, 30);
camlight 
lighting phong
axis equal
axis off
end

fid = fopen('sphere8char.dat','wb');
fwrite(fid,data,'uchar');
fclose(fid);

fid = fopen('sphere8c.dat','wb');
fwrite(fid,cdata,'double');
fclose(fid);

これを実行すると、

このような図が表示されるはずである。前回と違うのは、表面が50x50x50の格子に沿ってがたがたであることである。
もちろん、これも、Matlab上でsmooth3関数を何度かかけてやればよいわけであるが、OpenDXにはそのような構造物を処理する強力な機能が備わっている。
なお、ここでは、構造データ(sphere8char.dat)を今までのdoubleではなく、charで保存した。このデータはここ(sphere8char.tar.gz)に置いておく。

まずは、OpenDXで次のように接続する(先々回と同じ)。ここで、今回はcharデータを読み込むので左側のImportだけ変更する必要がある。

sphere8char.generalと入力し、sphere8char.generalというテキストファイルを同じフォルダに作り、内容を

file = sphere8char.dat
grid = 50 x 50 x 50
format = lsb ieee
interleaving = record
field = field0
structure = scalar
type = unsigned byte
dependency = positions
positions = regular, regular, regular, 0, 1, 0, 1, 0, 1
end

とする。
このまま実行してもMatlab同様、次に様にがたがたのままである。

これを解決するために、次のように変える。

具体的には、SimplifySurfaceをMapとColorの間に挟んだだけである。これで、

このように、表面が滑らかになる。

もちろん、先回のような数学的関数によって完全に滑らかなデータから作成されたものに比べれば劣るが、実測データから滑らかな表面を生成するには十分である。



最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.