G401での描画方法 - 奈良女子大学理学部情報科学科

計算機実験2
∼ VTKを使った描画方法 ∼
高田雅美
takata@奈良女子大学情報科学科
1
G401での描画方法
„
gnuplot
„
扱えるデータ
„
„
„
„
„
プロットデータ
格子データ
2次元プロット
3次元プロット((x, y, 値), 色なし)
Version3.8以上の場合
„
カラーマッピング
2
1
G401での描画方法
„
vtk
„
扱いやすいデータ
„
格子データ
„
„
„
プロットデータを扱うのは困難
カラーマッピング
ボリュームレンダリング
3
CMakeLists.txt
PROJECT (ProjectName)
プロジェクト名(適当)
INCLUDE (${CMAKE_ROOT}/Modules/FindVTK.cmake)
IF (USE_VTK_FILE)
INCLUDE(${USE_VTK_FILE})
ENDIF (USE_VTK_FILE)
プログラムファイル
ADD_EXECUTABLE(ObjectName ProgramFile)
TARGET_LINK_LIBRARIES(ObjectName Libraries)
実行ファイル 使用するVTKのライブラリ
4
2
使用するライブラリの確認
„
リファレンスURL
„
„
http://www.vtk.org/doc/release/4.2/html/
Alphabetical Listで関数を確認
CVS logs(CVSweb):
・.cxx(/Graphics/vtk???.cxx)
・.h(/Graphics/vtk???.h)
vtkGraphics を使う
5
Vtkのデータセット型
vtkDataSet
vtkImageData
vtkPointSet
vtkRectilinear
vtkStructuredPoints
vtkPolyData
6
3
データセット型 (1)
„
vtkStructuredPoints
„
„
„
„
3次元格子
x,y,z軸に平行
格子間隔が一定
vtkRectilinear
„
„
„
3次元格子
x,y,z軸に平行
格子間隔がふぞろい
7
データセット型 (2)
„
vtkStructuredGrid
„
幾何形状の格子
„
vtkPolyData
„
多面体データ
„
格子の位置関係はなし
8
4
データセット属性
„
„
格子点上(PointData)
or
セル上(CellData)
„
属性
„
スカラ値
„
„
PointData
ベクタ値
„
„
„
VectorData
デンソル値
„
CellData
SvalarData
TensorData
フィールドデータ
„
„
FieldData
複数存在
9
入力ファイル
x1 y1 z1
x2 y2 z2
:
xn yn zn
3次元グラフ作成
class vtkPolyData;
class vtkPoints;
class vtkIdList;
void AddLineToPolyData(vtkPolyData
*pdata,char *fname){
double x,y,z;
int newflg=0;
char buffer[1000];
vtkIdList *pntids=vtkIdList::New();
vtkPoints *pnts=pdata>GetPoints();
if(pnts==NULL){
pnts=vtkPoints::New();
pdata->Allocate();
newflg=1;
}
FILE *fp=fopen(fname,"r");
while( fgets(buffer, BUFFER_SIZE,
fp) ){
sscanf(buffer," %f %f %f",
&x,&y,&z);
pntids->InsertNextId(pnts>InsertNextPoint(x,y,z));
}
fclose(fp);
pdata->SetPoints(pnts);
pdata->InsertNextCell
(VTK_POLY_LINE,pntids);
}
pntids->Delete();
if(newflg==1) pnts->Delete();
10
5
VTK のデータファイル
# vtk DataFile Version 1.0 ・・・(1)
Volume example ・・・(2)
ASCII ・・・(3)
DATASET STRUCTURED_POINTS ・・・(4)
DIMENSIONS 3 4 6 ・・・(5)
ORIGIN 0 0 0 ・・・(6)
SPACING 1 1 1 ・・・(7)
POINT_DATA 72 ・・・(8)
SCALARS volume_scalars unsigned_char 1 ・・・(9)
LOOKUP_TABLE default ・・・(10)
000
000
000
0 0 50 ・・・(11)
0 5 10
15 20 25 25 20 15 10 5 0
0 10 20
30 40 50 50 40 30 20 10 50
0 10 20
30 40 50 50 40 30 20 10 50
0 5 10
15 20 25 25 20 15 10 5 0
000
000
000
0 0 50
„
(1) ファイルバージョン
(2) タイトルコメント
(3) ファイルフォーマット
ASCII or BINARY
(4) データセットの種類
(5) 配列の大きさ (X, Y, Z)
(6) 原点の位置 (X, Y, Z)
(7) データ間の距離 (X, Y, Z)
(8) 総データ数
(9) スカラ値のデータ名,データ型,要素数
(10) LookUpTableがデフォルトであることを示す
(11) ASCIIコードで書かれたデータ
詳しくは
http://www.vtk.org/pdf/file-formats.pdf
11
描画に最低限必要なもの
vtkRenderer *ren = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
Iren->SetRenderwindow(renWin);
:
:
ren->AddActor(???);
表示する物体を登録
// ren->AddVolume(???);
表示画面のサイズを決定
renWin->SetSize(600, 600);
renWin->Render();
iren->Initialize();
renWin->Render();
iren->Start();
表示画面を維持
これが無い場合は,プログラム終了と同時に
VTK表示画面も閉じられる
12
6
色の付け方
„
Actorの色づけ
vtkMapper*->ScalarVisibilityOff();
vtkActor*->GetProperty()
->SetColor(red, green, blue);
„
背景の色づけ
vtkRenderer*
->SetBackground(red, green, blue)
13
VTKで描画した画像の保存
vtkWindowToImageFilter
*w2i=vtkWindowToImageFilter::New();
vtkJPEGWriter *writer=vtkJPEGWriter::New();
(JPEG形式で保存.
他形式保存の場合は,*JPEG*の部分を置き換え.)
w2i->SetInput(vtkRenderWindow*);
writer->SetInput(w2i->GetOutput());
writer->SetFileName(char *);
vtkRenderWindow*->Render();
w2i->Update();
writer->Write();
14
7
可視化手法
„
スカラ値の可視化
„
„
„
„
カラーマッピング(Color mapping)
等高線(2D Contour)
等値面(3D Contour)
切り取り(Cutting)
„
„
ベクタ値の可視化
„
„
„
平面,格子
矢印による表記
流れの軌跡を表示
ボリュームレンダリング
15
カラーマッピング
„
Lookup Tableの利用
„
„
スカラ値と色を対応付け
使い方
„
„
使う色のテーブルを作成
スカラ値の範囲(Max, Min) を指定
あるスカラ値Siの場合
⎛ S − Min ⎞
colori = lut ⎜ i
⎟
⎝ Max − Min ⎠
16
8
Pipeline: カラーマッピング
vtkDataSetReader
vtkImageDataGeometryFilter
ReleaseDataFlagOn();
vtkLookupTable
vtkWarpScalar
SetNormal(0,0,1);
UseNormalOn();
ReleaseDataFlagOn();
vtkPolyDataMapper
Actor
SetNumberOfColors(int);
SetHueRange(double, double);
SetSaturationRange(double, double);
SetValueRange(double, double);
Build();
SetVisibilityOn();
SetLookupTable(vtkLookupTable*)
vtkWarpScalar* ->Update();
SetScalarRange(vtkWarpScalar*->GetOutput()->GetScalarRange();
17
LookupTable
„
SetNumberOfColors(int);
„
„
SetHueRange(double, double);
„
„
色相(0.6∼0.0: 青→緑→赤)
SetSaturationRange(double,
double);
„
„
Int数分に色分け
彩度(1以下の正数:値が高い=色味無)
SetValueRange(double, double);
„
明度(1以下の正数:値が高い=明るい)
18
9
Pipeline:等高線(2D Contour)
vtkDataSetReader
vtkImageDataGeometryFilter
ReleaseDataFlagOn();
vtkWarpScalar
SetNormal(0,0,1);
UseNormalOn();
ReleaseDataFlagOn();
vtkContourFilter
SetValue(int, double);
vtkPolyDataMapper
vtkPolyDataMapper
Actor1
Actor2
19
Pipeline:等値面(3D Contour)
vtkStructuredGridReader
vtkStructuredGridOutlineFilter
vtkContourFilter
SetValue(int, double);
vtkPolyDataMapper
ScalarVisibilityOn();
Actor1
vtkPolyDataMapper
ScalarVisibilityOn();
Actor2
外枠用
20
10
vtkContourFilter
„
„
„
入力データセット: vtkDataSet
出力データセット: vtkPolyData
関数
„
GenerateValues(int, double[2])
„
„
„
„
SetValue(int, double)
„
„
„
等値線を等間隔に線を引く
int: 本数
double[2]: 値の範囲 (vtkWarpScale*->GetOutput()->GetScalarRange());
一本の等値線を引く
int: 線の番号
double: 等値線の値
GetNumberOfContours()
„
等値線の数を求める
21
Pipeline: 平面での切り取り
vtkStructuredGridReader
vtkStructuredGridOutlineFilter
vtkPlane
SetOrigin(x, y, z)
SetNormal(vectorx, vectory, vectorz)
vtkCutter
SetCutFunction(vtkPlane*)
vtkPolyDataMapper
Actor1
vtkPolyDataMapper
Actor2
外枠用
22
11
Pipeline: 格子での切り取り
vtkStructuredGridReader
vtkStructuredGridGeometryFilter
SetExtent(double, double,
double, double,
double, double)
vtkStructuredGridOutlineFilter
vtkPolyDataMapper
vtkPolyDataMapper
Actor1
Actor2
外枠用
23
Pipeline:
Glyphing を用いたベクトル描画
vtkStructured
GridReader
vtkStructured
GridOutlineFilter
vtkPolyDataMapper
vtkMaskPoints
SetOnRatio(50);
RandomModeOn();
Update();
vtkGlyph3D
Vtk???Source
Setsource(vtk???Source*->GetOutput());
scalingOn();
SetScaleModeToScaleByScalar();
SetColorModeToColorByScalar();
SetScaleFactor(2);
SetRange(vtkMaskPoints*->GetOutput()
->GetScalarRange())
vtkPolyDataMapper
Actor1
外枠用
ScalarVisibilityOn();
SetScalarRange(vtkMaskPoints*
->GetOutput()->GetScalarRange());
24
Actor2
12
vtkMaskPoints
„
表示する格子を選択するマスク
„
最初のint点目から選択
„
„
int点に1つ選択する
„
„
SetOnRatio(int)
ランダム選択
„
„
SetOffset(int)
RandomModeOn(), RandomModeOff()
選択する点の最大数を決定
„
SetMaximumNumberOfPoints(int)
25
vtkGlyph3D
„
„
„
„
„
„
„
„
グリフの形状を指定 SetSource(vtkPolyData*)
グリフの大きさを比例させる<させない>
ScalingOn() <ScalingOff()>
スカラ値でスケーリング
SetScaleModeToScaleByScalar
ベクタ値でスケーリング
SetScaleModeToScaleByVector
色とスカラ値を対応 SetColorModeToColorByScalar
色とベクタ値を対応 SetColorModeToColorByVector
スケーリングを全体にfloat倍する
SetScaleFactor(float)
スカラ値の範囲
SetRange(float[2])
26
13
グリフの形状
矢印
vtkArrowSource
円錐
vtkConeSource
球
vtkSphereSource
27
Pipeline: 流線の描画
vtkStructured
GridReader
vtkStructured
GridOutlineFilter
vtkExtractGrid
vtkRungeKutta4
SetVOI(int, int,
vtkStreamLine
int, int, int, int);
SetSource
SetSamplerate
(vtkExtractGrid*);
(int, int, int);
SetIntegrator
IncludeBoundaryOn();
(vtkRungeKutta4*);
SetStepLength(float);
vtkPolyDataMapper
vtkPolyDataMapper
vtkPolyDataMapper
Actor1
外枠用
Actor3
Actor2
GetProperty()
->SetRepresentationToWireframe()
28
14
Pipeline:ボリュームレンダリング
vtkVolumeRayCastCompositeFunction
vtkStructured
PointsReader
vtkVolumeRayCastMapper
SetVolumeRayCastFunction
(vtkVolumeRayCastCompositeFunction*)
vtkOutlineFilter
vtkPiecewiseFunction
AddPoint(int, double)
vtkPolyDataMapper
vtkTransferFunction
AddRGBPoint
(double, double, double
, double)
vtkVolumeProperty
SetColor(vtkTransforFunction*)
SetScalarOpacity(vtkPiecewiseFunction*)
ShadeOn()
vtkVolume
SetInterpolationTypeToLinear()
SetProperty(vtkVolumeProperty*)
Actor1
外枠用
Actor2
AddVolume(vtkVolume*)
29
伝達関数
„
vtkPiecewiseFunction
„
„
透明度の伝達関数
AddPoint(double vlaue, trans)
„
„
„
double value: データの値
double trans: 透明度
vtkColorTransferFunction
„
„
„
色と値を対応させる
AddRGBPoint(double value, red, green, blue)
HSVで色づけしたい場合
„
AddHSVPoint(double, H, S, V)
30
15
vtkImageShiftScale
„
„
入力元:vtkStructuredPointsReader*
出力先:vtkRayCastMapper*
„
符号なしの整数のみ取り扱い可能
„
SetShift(負の最小値の絶対値 or 0)
„
SetScale(Scale/ 最大値−最小値)
„
„
„
値をシフトする(全ての値を正にする)
スケールをかえる(広い範囲に値を分散させる)
SetOutputScalarTypeToUnsignedChar()
„
データ型を変換
31
参考資料
„
公式サイト
„
„
尺八郎の3Dで始めるプログラミング
„
„
http://www.vtk.org
http://donguri.sakura.ne.jp/~shock8/3d/vtk_index.html
書籍
„
„
„
http://www.kitware.com/products/vtktextbook.html
The Visualization ToolKit –An Object-oriented approach to
3D Graphics –
VTK User’s Guide
32
16