2012-04-03 42 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()为“轴”和“扭曲”的代码工作。