VTK系列51_VTK三维平面(点)法向量计算

实例51:三维平面(点)法向量计算

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkPolyDataReader.h> 
#include <vtkPolyDataNormals.h> //计算法向量
#include <vtkMaskPoints.h>
#include <vtkArrowSource.h>
#include <vtkGlyph3D.h>
#include <vtkPointData.h>
#include <vtkProperty.h>
//
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main()
{
	vtkSmartPointer<vtkPolyDataReader> plyReader =
		vtkSmartPointer<vtkPolyDataReader>::New();
	plyReader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第六章_图像处理\\data\\fran_cut.vtk");
	plyReader->Update();

	vtkSmartPointer<vtkPolyDataNormals> normFilter =
		vtkSmartPointer<vtkPolyDataNormals>::New();
	normFilter->SetInputData(plyReader->GetOutput());
	normFilter->SetComputePointNormals(1);//开启点法向量计算
	normFilter->SetComputeCellNormals(0); //关闭单元法向量计算
	normFilter->SetAutoOrientNormals(1);
	normFilter->SetSplitting(0);
	normFilter->Update();

	vtkSmartPointer<vtkMaskPoints> mask =
		vtkSmartPointer<vtkMaskPoints>::New();
	mask->SetInputData(normFilter->GetOutput());
	mask->SetMaximumNumberOfPoints(300);
	mask->RandomModeOn();
	mask->Update();

	vtkSmartPointer<vtkArrowSource> arrow =
		vtkSmartPointer<vtkArrowSource>::New();
	arrow->Update(); //一定要更新 否则数据没有添加进来,程序会报错

	vtkSmartPointer<vtkGlyph3D> glyph =
		vtkSmartPointer<vtkGlyph3D>::New();
	glyph->SetInputData(mask->GetOutput());
	glyph->SetSourceData(arrow->GetOutput());//每一点用箭头代替
	glyph->SetVectorModeToUseNormal();//设置向量显示模式和法向量一致
	glyph->SetScaleFactor(0.01); //设置伸缩比例
	glyph->Update();
	
	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputData(plyReader->GetOutput());
	vtkSmartPointer<vtkPolyDataMapper> normMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	normMapper->SetInputData(normFilter->GetOutput());
	vtkSmartPointer<vtkPolyDataMapper> glyphMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	glyphMapper->SetInputData(glyph->GetOutput());

	vtkSmartPointer<vtkActor> actor =
		vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	vtkSmartPointer<vtkActor> normActor =
		vtkSmartPointer<vtkActor>::New();
	normActor->SetMapper(normMapper);
	vtkSmartPointer<vtkActor> glyphActor =
		vtkSmartPointer<vtkActor>::New();
	glyphActor->SetMapper(glyphMapper);
	glyphActor->GetProperty()->SetColor(1, 0, 0);
	
	double origView[4] = { 0, 0, 0.33, 1 };
	double normView[4] = { 0.33, 0, 0.66, 1 };
	double glyphView[4] = { 0.66, 0, 1, 1 };
	vtkSmartPointer<vtkRenderer> origRender =
		vtkSmartPointer<vtkRenderer>::New();
	origRender->SetViewport(origView);
	origRender->AddActor(actor);
	origRender->SetBackground(1, 0, 0);
	vtkSmartPointer<vtkRenderer> normRender =
		vtkSmartPointer<vtkRenderer>::New();
	normRender->SetViewport(normView);
	normRender->AddActor(normActor);
	normRender->SetBackground(0, 1, 0);
	vtkSmartPointer<vtkRenderer> glyphRender =
		vtkSmartPointer<vtkRenderer>::New();
	glyphRender->SetViewport(glyphView);
	glyphRender->AddActor(glyphActor);
	glyphRender->AddActor(normActor);
	glyphRender->SetBackground(0, 0, 1);
	
	vtkSmartPointer<vtkRenderWindow> rw =
		vtkSmartPointer<vtkRenderWindow>::New();
	rw->AddRenderer(origRender);
	rw->AddRenderer(normRender);
	rw->AddRenderer(glyphRender);
	rw->SetWindowName("Calculating Point Norm & Cell Norm");
	rw->SetSize(960, 320);
	rw->Render();

	vtkSmartPointer<vtkRenderWindowInteractor> rwi =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	rwi->SetRenderWindow(rw);
	rwi->Initialize();
	rwi->Start();

	return 0;
}

VTK系列目录:

1 VTK基本概念

2 VTK图像处理

3 VTK图形处理

4 VTK体绘制

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了广泛的功能,包括三维可视化、体绘制、图形处理、图像处理、科学可视化等。在VTK中,可以使用标记来标记三维场景中的特定位置。而平面映射则是将三维场景中的物体投影到二维平面上,以便于展示和处理。 下面是VTK中实现三维标记平面映射的步骤: 1. 创建一个VTK Renderer和RenderWindow对象,用于显示场景。 2. 创建一个VTK PolyData对象,用于存储标记的位置和属性。 3. 创建一个VTK PolyDataMapper对象,将PolyData对象映射到场景中。 4. 创建一个VTK Actor对象,将Mapper对象添加到Actor中。 5. 将Actor对象添加到Renderer中。 6. 创建一个VTK Plane对象,用于进行平面映射。 7. 创建一个VTK ProjectPoints对象,将标记投影到平面上。 8. 将投影结果添加到PolyData对象中。 9. 更新RenderWindow对象,显示投影结果。 下面是实现代码示例: ```python import vtk # create a renderer and render window renderer = vtk.vtkRenderer() render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # create polydata object to store marker points polydata = vtk.vtkPolyData() # create mapper object to map polydata to scene mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polydata) # create actor object to add mapper to renderer actor = vtk.vtkActor() actor.SetMapper(mapper) renderer.AddActor(actor) # create plane object for projection plane = vtk.vtkPlane() # create project points object for projection project_points = vtk.vtkProjectPoints() project_points.SetInputData(polydata) project_points.SetPlane(plane) project_points.Update() # add projection result to polydata polydata.SetPoints(project_points.GetOutput().GetPoints()) # update render window to show projection result render_window.Render() ``` 以上代码演示了如何创建一个VTK场景,并将标记投影到平面上以显示投影结果。根据需要,可以调整代码以适应不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦我飞也

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值