Как рисовать примитивы (точки, линии и т.д.) В vtk?

#opengl #visualization #vtk

#opengl #визуализация #vtk

Вопрос:

Мне нужно рисовать примитивы на vtkActor, но я не знаю как. Может быть, я могу использовать функции opengl для этого? В этом примере http://www.vtk.org/Wiki/VTK/Examples/Cxx/Plotting/Diagram это работает, но мне нужно нарисовать это в интерактивном режиме. Спасибо за ответы.

Ответ №1:

Что вы подразумеваете под рисованием примитивов?

Видите ли, VTK больше настроен на рендеринг (в отличие от рисования) наборов данных различных типов. Например, 3D-сетки могут быть нарисованы с использованием vtkPolyDataMapper и vtkActor, а изображения — с использованием vtkImageActor и аналогичных классов.

Как правило, у вас есть один или несколько наборов данных, для которых вы создаете актеров и показываете их на экране.

На самом деле вы не рисуете примитивы на экране, как (скажем) с помощью GDI или HTML5 canvas. В зависимости от того, что вы хотите, вы должны либо добавить другого актера с соответствующим набором данных, виджет (который является своего рода интерактивным актером), либо 2D-актера, который рисуется как наложение поверх всей сцены и описывается в координатах экрана.

Если бы вы могли описать, чего вы пытаетесь достичь, я мог бы указать вам на некоторые более конкретные вещи.

Комментарии:

1. Спасибо, я решаю проблему так, как вы говорите. Я создаю специального 2d-актера для рисования и использования системы. Рисунок для рисования.

Ответ №2:

Отказ от ответственности: непроверенный код! Я пишу это по памяти. Итак, протестируйте и прочитайте руководство по мере необходимости. Обратите внимание, что следующий код рисует одну линию. Из соображений производительности я предлагаю вместо создания актера на строку. Создайте несколько строк (если не все ваши строки) в одном актере. Просто добавьте точки и задайте правильные индексы…

 vtkPoints* points = vtkPoints::New();
vtkCellArray* lineIndices = vtkCellArray::New();

points->InsertNextPoint( 0, 0, 0);
points->InsertNextPoint(10, 0, 0);

lineIndices->InsertNextCell(2);
lineIndices->InsertNextCellPoint(0); // indices to points array.
lineIndices->InsertNextCellPoint(1);

vtkPolyData* polyData = vtkPolyData::New();
polyData->SetPoints(points);
polyData->SetLines(lines);

// continue with standard mapper, actor setup...
  

Комментарии:

1. Спасибо, я уже пробую это. Но в этом примере будет создано много линий. И параметры этих линий, такие как width, задаются в actor, мне нужен другой. Теперь я решаю проблему, используя вещи из System. Извлеките из .net для рисования и загрузите bitmap в actor с помощью vtkImageImport;

Ответ №3:

Я искал способ нарисовать сетку на экране с помощью VTK, и я придумал этот фрагмент кода:

 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> lineIndices = vtkSmartPointer<vtkCellArray>::New();

for(int iIndex = 0, connectivityIndex = 0; iIndex <= m_resolution;   iIndex, connectivityIndex  = 4)
{
    double pointCoordinate = m_range[0]   (m_range[1] - m_range[0]) * (iIndex / static_cast<double>(m_resolution));
    points->InsertNextPoint(pointCoordinate, -m_range[1], 0.0);
    points->InsertNextPoint(pointCoordinate,  m_range[1], 0.0);

    points->InsertNextPoint(-m_range[1], pointCoordinate, 0.0);
    points->InsertNextPoint( m_range[1], pointCoordinate, 0.0);

    lineIndices->InsertNextCell(2);
    lineIndices->InsertCellPoint(connectivityIndex   0);
    lineIndices->InsertCellPoint(connectivityIndex   1);

    lineIndices->InsertNextCell(2);
    lineIndices->InsertCellPoint(connectivityIndex   2);
    lineIndices->InsertCellPoint(connectivityIndex   3);
}

vtkSmartPointer<vtkPolyData> data = vtkSmartPointer<vtkPolyData>::New();
data->SetPoints(points);
data->SetLines(lineIndices);

vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(data);

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

vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
  

Он был основан на коде @shash и он работает.