計算機実験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
© Copyright 2024 Paperzz