#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 и он работает.