一、数据组成
几何结构数据、拓扑结构数据和属性数据
1.几何结构数据:组成模型的点集;
2.拓扑结构数据:这些点根据一定的连接关系(如线性、三角形等)组成单元数据;表明集合点集之间的拓扑关系;
3.属性数据:与几何结构数据和拓扑结构数据相关联,属性数据可以是标量、向量或者张量。
如,可以为其中的每个点定义曲率属性数据,也可以为其中的每个单元定义一个法向量数据。在vtkPolyData可视化中会利用这些属性数据直接或者间接计算单元或点的颜色。
数据显示流程:sourceData->polyData->Mapper->Actor->Render->RenderWindow->RenderWindowInteractor;
代码如下:
#include "stdafx.h"
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkConeSource.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
vtkSmartPointer<vtkConeSource> coneSource =
vtkSmartPointer<vtkConeSource>::New();
coneSource->Update();
vtkSmartPointer<vtkPolyData> polyData =
vtkSmartPointer<vtkPolyData>::New();
polyData = coneSource->GetOutput();
int nPoints = polyData->GetNumberOfPoints();
int nCells = polyData->GetNumberOfCells();
std::cout << "Number of points: " << nPoints << std::endl;
std::cout << "Number of celsl: " << nCells << std::endl;
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polyData);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> render =
vtkSmartPointer<vtkRenderer>::New();
render->AddActor(actor);
render->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderWindow> rw =
vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(render);
rw->SetSize(600, 600);
rw->SetWindowName("polyData structure learning");
rw->Render();
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(rw);
rwi->Initialize();
rwi->Start();
return 0;
}
分析:
vtkConeSource类定义了一个锥形图形数据,输出类型是vtkPolyData;
VTKPolyData的成员函数GetNumberOfPoints()和GetNumberOfCells()分别用来获取图形数据的point数和cell数目;
接着定义一个图形数据的渲染管线,包括VTKPolyDataMapper()、vtkActor()、VTKRender()、vtkRenderWindow()和vtkRenderWindowInteractor()。这个渲染流程和图像渲染管线基本一致。需要注意的是,对于vtkPolyData类型数据的渲染管线,需要定义vtkPolyDataMapper对象,用于接受vtkPolyData图形数据以实现图像数据到渲染图元的转换。
程序显示如下:
从显示结果可以看出,该椎体是由7个空间点构成了7个单元的数据组成。这里也仅仅定义了一个空间的椎体,并未给点或者单元数据设置属性信息。
二、属性数据修改
上面图形显示是白色的(看起来灰色是因为调了角度),图形颜色与vtkPolyData属性数据息息相关。由于并未指定任何颜色和属性数据,因此显示时默认显示白色。
属性数据:点属性和单元属性。可为vtkPolyData的点数据和单元数据分别指定属性数据。
属性数据可以是标量,如点的曲率;可以是向量,如点或者单元的法向量;也可以是张量,主要在流场中较为常见。
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPoints.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkUnsignedCharArray.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkAOSDataArrayTemplate.h>
int main()
{
//几何结构数据:点集
vtkSmartPointer<vtkPoints> pts =
vtkSmartPointer<vtkPoints>::New();
pts->InsertNextPoint(0.0, 0.0, 0.0);
pts->InsertNextPoint(1.0, 0.0, 0.0);
pts->InsertNextPoint(1.0, 1.0, 0.0);
pts->InsertNextPoint(0.0, 1.0, 0.0);
pts->InsertNextPoint(2.0, 0.0, 0.0);
//拓扑结构数据:正四边形
vtkSmartPointer<vtkPolygon> polygon =
vtkSmartPointer<vtkPolygon>::New();
polygon->GetPointIds()->SetNumberOfIds(4);
polygon->GetPointIds()->SetId(0, 0);
polygon->GetPointIds()->SetId(1, 1);
polygon->GetPointIds()->SetId(2, 2);
polygon->GetPointIds()->SetId(3, 3);
//拓扑结构数据:三角形
vtkSmartPointer<vtkTriangle> triangle =
vtkSmartPointer<vtkTriangle>::New();
triangle->GetPointIds()->SetId(0, 1);
triangle->GetPointIds()->SetId(1, 2);
triangle->GetPointIds()->SetId(2, 4);
//构成拓扑结构集合
vtkSmartPointer<vtkCellArray> cells =
vtkSmartPointer<vtkCellArray>::New();
cells->InsertNextCell(polygon);
cells->InsertNextCell(triangle);
//合成几何拓扑结构用于显示
vtkSmartPointer<vtkPolyData> polygonPolyData =
vtkSmartPointer<vtkPolyData>::New();
polygonPolyData->SetPoints(pts);
polygonPolyData->SetPolys(cells);
//添加属性结构
unsigned char red[3] = { 255,0,0 };
unsigned char green[3] = { 0,255,255 };
unsigned char blue[3] = { 0,0,255 };
vtkSmartPointer<vtkUnsignedCharArray> ptColor =
vtkSmartPointer<vtkUnsignedCharArray>::New();
ptColor->SetNumberOfComponents(3);
ptColor->InsertNextTupleValue(red);
ptColor->InsertNextTupleValue(green);
ptColor->InsertNextTupleValue(blue);
ptColor->InsertNextTupleValue(red);
ptColor->InsertNextTupleValue(green);
polygonPolyData->GetPointData()->SetScalars(ptColor);
vtkSmartPointer<vtkUnsignedCharArray> cellColor =
vtkSmartPointer<vtkUnsignedCharArray>::New();
cellColor->SetNumberOfComponents(3);
cellColor->InsertNextTupleValue(blue);
cellColor->InsertNextTupleValue(red);
polygonPolyData->GetCellData()->SetScalars(cellColor);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polygonPolyData);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> render =
vtkSmartPointer<vtkRenderer>::New();
render->AddActor(actor);
render->SetBackground(0.0, 0.0, 0.0);
vtkSmartPointer<vtkRenderWindow> rw =
vtkSmartPointer<vtkRenderWindow>::New();
rw->AddRenderer(render);
rw->SetSize(320, 320);
rw->SetWindowName("Creating PolyData Structure");
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(rw);
rwi->Render();
rwi->Start();
return 0;
}
图形暂时没跑出来
10-29 跑出来,解决办法参考:https://blog.csdn.net/jacke121/article/details/78364204
参考:https://blog.csdn.net/kateyabc/article/details/84430985