答案 0 :(得分:3)
我相信可能适合您的VTK管道的草图如下。如果你创建一些x和y点为vtkPoints,然后将它们移动到StructuredGrid数据类型,然后使用GeometryFilter添加z轴,你应该通过vtkWarpScalar和通常的Mapper和Actor管道生成一个表面。
以下示例代码可以帮助您的vtk构建中的/Examples/DataManipulation/Cxx/SGrid.cxx。如果您有完整的体积和提取的等值面,也可以执行曲面绘图。如果情况并非如此,并且您正在绘制3D功能,那么可能需要填充结构化网格。
答案 1 :(得分:2)
前段时间我想做同样的事情并做了一些广泛的搜索。它没有出现太多,所以我想与你分享我的解决方案。它包含一些多余的代码,但它的工作原理。 http://pastie.org/4721543
我刚刚重新发现了这个问题,因为VTK 6.0将具有plotsurface功能。哪个最有可能比我的代码更高效。我稍后会尝试并更新这篇文章。
对我的代码稍作解释可能会有所帮助。它执行以下操作:
mapper->SetScalarRange(..)
它还添加了一个计时器和一个更新命令,它输出渲染统计数据等,正如我所说,你可以省去很多东西。我的blog post详细阐述了这一点,但并不多。
答案 2 :(得分:2)
在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
答案 3 :(得分:0)
在我的系统中,当SetInput()
更改为SetInputData()
时,代码才会生效。&#39;和&#39; warp&#39;。