Пример трехмерного контурного графика С++ с использованием VTK?

Я пытался использовать библиотеку VTK из C++.

Есть ли пример использования VTK только для построения простого трехмерного контурного графика, подобного показанному ниже?

официальная вики VTK содержит десятки примеров кода, но я не могу найти ни одного полезного примера этого простого задача.

3D-график


person Yury    schedule 03.04.2012    source источник
comment
Посмотрите здесь: github.enthought.com/mayavi/mayavi/auto/examples .html   -  person Isaiah Norton    schedule 04.04.2012
comment
Вы нашли ответ? Я ищу то же самое.   -  person Madz    schedule 11.10.2013


Ответы (4)


Некоторое время назад я хотел сделать то же самое и провел обширный поиск. Это не так уж много, поэтому я хочу поделиться с вами своим решением. Он содержит лишний код, но работает. http://pastie.org/4721543

Я только что заново открыл этот вопрос, потому что в VTK 6.0 будет функция plotsurface. Что, скорее всего, будет гораздо более производительным, чем мой код. Я попробую позже и обновлю этот пост.

Небольшое объяснение моего кода может быть полезным. Он делает следующее:

  1. создайте плоскость размером с вашу 2D-матрицу, которая содержит ваши значения z (столбцы и строки представляют значения x и y).
  2. создать xyz-точки из входной матрицы
  3. сохранить значения z как скаляры для каждой точки
  4. деформируйте эту плоскость в соответствии со значениями z матрицы и примените цвета (mapper->SetScalarRange(..)
  5. нарисуй свой сюжет

Он также добавляет таймер и команду обновления, выводит статистику рендеринга и т. д., как я уже сказал, многое можно опустить. В моем сообщении в блоге рассказывается немного больше на этом, но не так много.

person kaikuchn    schedule 28.11.2012
comment
Хороший пост, вы забыли включить gauss.h в пасти, но поскольку большая часть кода не нужна для фактического графика, это не имеет большого значения. - person Madz; 11.10.2013
comment
Пицца больше не доступна - person ; 22.04.2018
comment
пирожки вечны, но, видимо, pastie.org — нет. К счастью, Мадз опубликовал свое решение, основанное на коде из этой встроенной пирожной. Но этому ответу более 5 лет, и я сомневаюсь, что на данный момент нет лучшего решения. - person kaikuchn; 24.04.2018

Я считаю, что грубый набросок конвейера VTK, который может вам подойти, выглядит следующим образом. Если вы создадите несколько точек x и y как vtkPoints, а затем переместите их в тип данных StructuredGrid, а затем добавите ось Z с помощью GeometryFilter, вы должны создать поверхность, пройдя через vtkWarpScalar и обычный конвейер Mapper и Actor.

Следующий пример кода может помочь /Examples/DataManipulation/Cxx/SGrid.cxx в вашей сборке vtk. Поверхностное построение также может быть выполнено, если у вас есть полный объем и извлеченная изоповерхность. Если это не так, и вы строите 3D-функцию, вероятно, лучше всего использовать структурированную сетку.

person g.stevo    schedule 03.04.2012

С помощью кода Кайкухна я смог создать простой поверхностный график. Надеюсь, это поможет кому-то, кто ищет подобное решение.

#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;
}

простой .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
person Madz    schedule 16.10.2013

В моей системе код работал, когда SetInput() заменялся на SetInputData() для «осей» и «деформации».

person user3592999    schedule 01.05.2014
comment
Это связано с разницей между VTK 5.0 и более поздними версиями. - person ; 22.04.2018