【VTK】vtkPolyData数据组成及属性修改

一、数据组成

几何结构数据、拓扑结构数据和属性数据

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

https://blog.csdn.net/shenziheng1/article/details/54836856

https://blog.csdn.net/shenziheng1/article/details/54809989?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值