如何在vtk中绘制基元(点,线等)?

时间:2011-06-10 13:10:14

标签: opengl visualization vtk

我需要在vtkActor上绘制基元,但我不知道如何。也许我可以使用opengl函数吗?在这个示例中http://www.vtk.org/Wiki/VTK/Examples/Cxx/Plotting/Diagram它正在工作,但我需要以交互方式绘制它。 谢谢你的回答。

3 个答案:

答案 0 :(得分:0)

绘制图元是什么意思?

你知道,VTK更倾向于渲染(而不是绘制)各种类型的数据集。例如,可以使用vtkPolyDataMapper和vtkActor绘制3D网格,使用vtkImageActor和类似的类绘制图像。

通常,您有一个或多个数据集,您可以为其创建演员并在屏幕上显示它们。

你并不像GDI或HTML5画布那样在屏幕上绘制原语。根据您的需要,您可以添加另一个具有相应数据集的actor,一个小部件(这是一个具有交互性的actor),或者一个2D actor,它将作为叠加层绘制在整个场景的顶部,并且在屏幕坐标中描述。

如果你能描述一下你想要达到的目标,我可以指出一些更具体的事情。

答案 1 :(得分:0)

免责声明:未经测试的代码!我是从记忆中写的。因此,根据需要测试并阅读手册。请注意,以下代码绘制一行。出于性能原因,我建议,而不是每行创建一个Actor。在一个Actor中创建多行(如果不是所有行)。只需添加点并设置正确的索引......

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...

答案 2 :(得分:0)

我正在寻找一种在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代码并且正在运行。