2012-04-03 66 views
3

我試圖從C++使用VTK庫。 是否有任何使用VTK來繪製像這樣的簡單3D圖形的示例:enter link description here。 在官方wiki上有幾十個代碼示例,但我找不到任何有用的示例來完成這個簡單的任務。非常簡單的三維情節vtk

+1

看看這裏: http://github.enthought.com/mayavi/mayavi/auto/examples.html – 2012-04-04 01:56:21

+1

您是否找到答案?我正在尋找同樣的事情。 – Madz 2013-10-11 04:21:14

回答

2

後來我想做同樣的事情,並做了一些廣泛的搜索。它沒有太多,所以我想與你分享我的解決方案。它包含一些多餘的代碼,但它的工作原理。 http://pastie.org/4721543

我剛剛重新發現了這個問題,因爲VTK 6.0會有一個平面函數。最有可能比我的代碼更高效。我會稍後再嘗試並更新這篇文章。

對我的代碼的一點解釋可能會有所幫助。它執行以下操作:

  1. 生成的平面的2D矩陣的保持你的z值(COLS &行代表在x & y值)的大小。
  2. 從輸入矩陣創建XYZ點
  3. 存儲中的z值作爲標量對於每個點
  4. 經線的是,根據該矩陣的z值平面和應用顏色(mapper->SetScalarRange(..)
  5. 提請情節

它還增加了一個定時器和更新命令,它輸出渲染統計等。正如我說的還有很多,你可以離開了。我blog post闡述了一點點這一點,但不多。

+0

不錯的帖子,你已經忘記了將「gauss.h」包含在pastie中,但是由於大部分代碼對於實際圖形來說都是不必要的,所以它不是什麼大問題。 – Madz 2013-10-11 04:46:08

2

我相信一個VTK管道的粗略草圖可能適用於你,如下所示。如果創建一些x和y點作爲vtkPoints,然後將它們移動到StructuredGrid數據類型,然後使用GeometryFilter添加z軸,則應該通過vtkWarpScalar和通常的Mapper和Actor管道生成曲面。

以下示例代碼可能有助於您的vtk版本中的/Examples/DataManipulation/Cxx/SGrid.cxx。如果您有完整的體積和提取的等值面,也可以執行曲面繪圖。如果情況並非如此,並且您正在繪製3D功能,則可能需要填充結構化的網格才行。

0

在Kaikuchn的代碼的幫助下,我能夠想出一個簡單的表面圖。希望這能幫助那些正在尋找類似解決方案的人。

#include "stdafx.h" 


#include <vtkRenderer.h> 
#include <vtkRenderWindowInteractor.h> 
#include <vtkRenderWindow.h> 
#include <vtkSmartPointer.h> 
#include <vtkPoints.h> 
#include <vtkPointData.h> 
#include <vtkPolyData.h> 
#include <vtkPolyDataMapper.h> 
#include <vtkDataSetMapper.h> 
#include <vtkProperty.h> 
#include <vtkCubeAxesActor2D.h> 
#include <vtkInteractorStyleTrackballCamera.h> 
#include <vtkInteractorStyleTrackball.h> 
#include <vtkSimplePointsReader.h> 
#include <vtkWarpScalar.h> 
#include <vtkAxisActor2D.h> 


int mains(int, char *[]) 
{ 


// Read the file 
    vtkSmartPointer<vtkSimplePointsReader> reader =vtkSmartPointer<vtkSimplePointsReader>::New(); 
    reader->SetFileName ("simple.xyz"); 
    reader->Update(); 

    vtkSmartPointer<vtkPolyData> inputPolyData = vtkSmartPointer<vtkPolyData>::New(); 
    inputPolyData ->CopyStructure(reader->GetOutput()); 


    // warp plane 
    vtkSmartPointer<vtkWarpScalar> warp = vtkSmartPointer<vtkWarpScalar>::New(); 
    warp->SetInput(inputPolyData); 
    warp->SetScaleFactor(0.0); 

    // Visualize 
    vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New(); 
    mapper->SetInputConnection(warp->GetOutputPort()); 



    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); 
    actor->GetProperty()->SetPointSize(4); 
    actor->SetMapper(mapper); 

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); 
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); 
    renderWindow->AddRenderer(renderer); 
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
    renderWindowInteractor->SetRenderWindow(renderWindow); 

    renderer->AddActor(actor); 
    renderer->SetBackground(.3, .6, .3); 
    renderWindow->Render(); 

    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); 
    renderWindowInteractor->SetInteractorStyle(style); 

    // add & render CubeAxes 
    vtkSmartPointer<vtkCubeAxesActor2D> axes = vtkSmartPointer<vtkCubeAxesActor2D>::New(); 
    axes->SetInput(warp->GetOutput()); 
    axes->SetFontFactor(3.0); 
    axes->SetFlyModeToNone(); 
    axes->SetCamera(renderer->GetActiveCamera()); 

    vtkSmartPointer<vtkAxisActor2D> xAxis = axes->GetXAxisActor2D(); 
    xAxis->SetAdjustLabels(1); 

    renderer->AddViewProp(axes); 
    renderWindowInteractor->Start(); 

    return EXIT_SUCCESS; 
} 

simple.xyz;

0.0 0.0 3.0 
1.0 4.0 0.0 
0.0 1.0 0.0 
4.0 0.0 3.0 
1.0 4.0 7.0 
0.0 6.0 0.0 
-1

在我的系統,當SetInput()更改爲SetInputData()爲「軸」和「扭曲」的代碼工作。