解决vtk中vtkStreamTracer例子无法显示流线的疑问

1 篇文章 0 订阅

在vtk的使用例子"Kitchen"中,依据示例编写代码后,无法显示流线。

预期效果:

实际效果:

 

查了网上很多资料都没有实际解决,然后冻皮西凑解决了,解决如下:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkLineSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkStreamTracer.h>
#include <vtkStructuredGrid.h>
#include <vtkStructuredGridGeometryFilter.h>
#include <vtkStructuredGridOutlineFilter.h>
#include <vtkStructuredGridReader.h>

#include <array>
#include <vtkRungeKutta45.h>

int main(int argc, char* argv[])
{

	double range[2];
	vtkNew<vtkNamedColors> colors;

	// Set the furniture colors.
	std::array<unsigned char, 4> furnColor{ {204, 204, 153, 255} };
	colors->SetColor("Furniture", furnColor.data());

	vtkNew<vtkRenderer> aren;
	vtkNew<vtkRenderWindow> renWin;
	renWin->AddRenderer(aren);

	vtkIndent ind(0);
	vtkNew<vtkRenderWindowInteractor> iren;
	iren->SetRenderWindow(renWin);
	//
	// Read data
	//
	vtkNew<vtkStructuredGridReader> reader;
	reader->SetFileName("kitchen.vtk");
	reader->Update(); // force a read to occur	
	reader->GetOutput()->GetLength();

	double maxTime = 0.0;

	if (reader->GetOutput()->GetPointData()->GetScalars())
	{
		reader->GetOutput()->GetPointData()->GetScalars()->GetRange(range);
	}
	if (reader->GetOutput()->GetPointData()->GetVectors())
	{
		auto maxVelocity =
			reader->GetOutput()->GetPointData()->GetVectors()->GetMaxNorm();
		maxTime = 4.0 * reader->GetOutput()->GetLength() / maxVelocity;
	}
	//
	// Outline around data
	//
	vtkNew<vtkStructuredGridOutlineFilter> outlineF;
	outlineF->SetInputConnection(reader->GetOutputPort());
	vtkNew<vtkPolyDataMapper> outlineMapper;
	outlineMapper->SetInputConnection(outlineF->GetOutputPort());
	vtkNew<vtkActor> outline;
	outline->SetMapper(outlineMapper);
	outline->GetProperty()->SetColor(colors->GetColor3d("LampBlack").GetData());
	//
	// Set up shaded surfaces (i.e., supporting geometry)
	//
	vtkNew<vtkStructuredGridGeometryFilter> doorGeom;
	doorGeom->SetInputConnection(reader->GetOutputPort());
	doorGeom->SetExtent(27, 27, 14, 18, 0, 11);
	vtkNew<vtkPolyDataMapper> mapDoor;
	mapDoor->SetInputConnection(doorGeom->GetOutputPort());
	mapDoor->ScalarVisibilityOff();
	vtkNew<vtkActor> door;
	door->SetMapper(mapDoor);
	door->GetProperty()->SetColor(colors->GetColor3d("Burlywood").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> window1Geom;
	window1Geom->SetInputConnection(reader->GetOutputPort());
	window1Geom->SetExtent(0, 0, 9, 18, 6, 12);
	vtkNew<vtkPolyDataMapper> mapWindow1;
	mapWindow1->SetInputConnection(window1Geom->GetOutputPort());
	mapWindow1->ScalarVisibilityOff();
	vtkNew<vtkActor> window1;
	window1->SetMapper(mapWindow1);
	window1->GetProperty()->SetColor(colors->GetColor3d("SkyBlue").GetData());
	window1->GetProperty()->SetOpacity(.6);

	vtkNew<vtkStructuredGridGeometryFilter> window2Geom;
	window2Geom->SetInputConnection(reader->GetOutputPort());
	window2Geom->SetExtent(5, 12, 23, 23, 6, 12);
	vtkNew<vtkPolyDataMapper> mapWindow2;
	mapWindow2->SetInputConnection(window2Geom->GetOutputPort());
	mapWindow2->ScalarVisibilityOff();
	vtkNew<vtkActor> window2;
	window2->SetMapper(mapWindow2);
	window2->GetProperty()->SetColor(colors->GetColor3d("SkyBlue").GetData());
	window2->GetProperty()->SetOpacity(.6);

	vtkNew<vtkStructuredGridGeometryFilter> klower1Geom;
	klower1Geom->SetInputConnection(reader->GetOutputPort());
	klower1Geom->SetExtent(17, 17, 0, 11, 0, 6);
	vtkNew<vtkPolyDataMapper> mapKlower1;
	mapKlower1->SetInputConnection(klower1Geom->GetOutputPort());
	mapKlower1->ScalarVisibilityOff();
	vtkNew<vtkActor> klower1;
	klower1->SetMapper(mapKlower1);
	klower1->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> klower2Geom;
	klower2Geom->SetInputConnection(reader->GetOutputPort());
	klower2Geom->SetExtent(19, 19, 0, 11, 0, 6);
	vtkNew<vtkPolyDataMapper> mapKlower2;
	mapKlower2->SetInputConnection(klower2Geom->GetOutputPort());
	mapKlower2->ScalarVisibilityOff();
	vtkNew<vtkActor> klower2;
	klower2->SetMapper(mapKlower2);
	klower2->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> klower3Geom;
	klower3Geom->SetInputConnection(reader->GetOutputPort());
	klower3Geom->SetExtent(17, 19, 0, 0, 0, 6);
	vtkNew<vtkPolyDataMapper> mapKlower3;
	mapKlower3->SetInputConnection(klower3Geom->GetOutputPort());
	mapKlower3->ScalarVisibilityOff();
	vtkNew<vtkActor> klower3;
	klower3->SetMapper(mapKlower3);
	klower3->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> klower4Geom;
	klower4Geom->SetInputConnection(reader->GetOutputPort());
	klower4Geom->SetExtent(17, 19, 11, 11, 0, 6);
	vtkNew<vtkPolyDataMapper> mapKlower4;
	mapKlower4->SetInputConnection(klower4Geom->GetOutputPort());
	mapKlower4->ScalarVisibilityOff();
	vtkNew<vtkActor> klower4;
	klower4->SetMapper(mapKlower4);
	klower4->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> klower5Geom;
	klower5Geom->SetInputConnection(reader->GetOutputPort());
	klower5Geom->SetExtent(17, 19, 0, 11, 0, 0);
	vtkNew<vtkPolyDataMapper> mapKlower5;
	mapKlower5->SetInputConnection(klower5Geom->GetOutputPort());
	mapKlower5->ScalarVisibilityOff();
	vtkNew<vtkActor> klower5;
	klower5->SetMapper(mapKlower5);
	klower5->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> klower6Geom;
	klower6Geom->SetInputConnection(reader->GetOutputPort());
	klower6Geom->SetExtent(17, 19, 0, 7, 6, 6);
	vtkNew<vtkPolyDataMapper> mapKlower6;
	mapKlower6->SetInputConnection(klower6Geom->GetOutputPort());
	mapKlower6->ScalarVisibilityOff();
	vtkNew<vtkActor> klower6;
	klower6->SetMapper(mapKlower6);
	klower6->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> klower7Geom;
	klower7Geom->SetInputConnection(reader->GetOutputPort());
	klower7Geom->SetExtent(17, 19, 9, 11, 6, 6);
	vtkNew<vtkPolyDataMapper> mapKlower7;
	mapKlower7->SetInputConnection(klower7Geom->GetOutputPort());
	mapKlower7->ScalarVisibilityOff();
	vtkNew<vtkActor> klower7;
	klower7->SetMapper(mapKlower7);
	klower7->GetProperty()->SetColor(colors->GetColor3d("EggShell").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> hood1Geom;
	hood1Geom->SetInputConnection(reader->GetOutputPort());
	hood1Geom->SetExtent(17, 17, 0, 11, 11, 16);
	vtkNew<vtkPolyDataMapper> mapHood1;
	mapHood1->SetInputConnection(hood1Geom->GetOutputPort());
	mapHood1->ScalarVisibilityOff();
	vtkNew<vtkActor> hood1;
	hood1->SetMapper(mapHood1);
	hood1->GetProperty()->SetColor(colors->GetColor3d("Silver").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> hood2Geom;
	hood2Geom->SetInputConnection(reader->GetOutputPort());
	hood2Geom->SetExtent(19, 19, 0, 11, 11, 16);
	vtkNew<vtkPolyDataMapper> mapHood2;
	mapHood2->SetInputConnection(hood2Geom->GetOutputPort());
	mapHood2->ScalarVisibilityOff();
	vtkNew<vtkActor> hood2;
	hood2->SetMapper(mapHood2);
	hood2->GetProperty()->SetColor(colors->GetColor3d("Furniture").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> hood3Geom;
	hood3Geom->SetInputConnection(reader->GetOutputPort());
	hood3Geom->SetExtent(17, 19, 0, 0, 11, 16);
	vtkNew<vtkPolyDataMapper> mapHood3;
	mapHood3->SetInputConnection(hood3Geom->GetOutputPort());
	mapHood3->ScalarVisibilityOff();
	vtkNew<vtkActor> hood3;
	hood3->SetMapper(mapHood3);
	hood3->GetProperty()->SetColor(colors->GetColor3d("Furniture").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> hood4Geom;
	hood4Geom->SetInputConnection(reader->GetOutputPort());
	hood4Geom->SetExtent(17, 19, 11, 11, 11, 16);
	vtkNew<vtkPolyDataMapper> mapHood4;
	mapHood4->SetInputConnection(hood4Geom->GetOutputPort());
	mapHood4->ScalarVisibilityOff();
	vtkNew<vtkActor> hood4;
	hood4->SetMapper(mapHood4);
	hood4->GetProperty()->SetColor(colors->GetColor3d("Furniture").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> hood6Geom;
	hood6Geom->SetInputConnection(reader->GetOutputPort());
	hood6Geom->SetExtent(17, 19, 0, 11, 16, 16);
	vtkNew<vtkPolyDataMapper> mapHood6;
	mapHood6->SetInputConnection(hood6Geom->GetOutputPort());
	mapHood6->ScalarVisibilityOff();
	vtkNew<vtkActor> hood6;
	hood6->SetMapper(mapHood6);
	hood6->GetProperty()->SetColor(colors->GetColor3d("Furniture").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> cookingPlateGeom;
	cookingPlateGeom->SetInputConnection(reader->GetOutputPort());
	cookingPlateGeom->SetExtent(17, 19, 7, 9, 6, 6);
	vtkNew<vtkPolyDataMapper> mapCookingPlate;
	mapCookingPlate->SetInputConnection(cookingPlateGeom->GetOutputPort());
	mapCookingPlate->ScalarVisibilityOff();
	vtkNew<vtkActor> cookingPlate;
	cookingPlate->SetMapper(mapCookingPlate);
	cookingPlate->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData());

	vtkNew<vtkStructuredGridGeometryFilter> filterGeom;
	filterGeom->SetInputConnection(reader->GetOutputPort());
	filterGeom->SetExtent(17, 19, 7, 9, 11, 11);
	vtkNew<vtkPolyDataMapper> mapFilter;
	mapFilter->SetInputConnection(filterGeom->GetOutputPort());
	mapFilter->ScalarVisibilityOff();
	vtkNew<vtkActor> filter;
	filter->SetMapper(mapFilter);
	filter->GetProperty()->SetColor(colors->GetColor3d("Furniture").GetData());
	//
	// regular streamlines
	//
	vtkNew<vtkLineSource> line;
	line->SetResolution(39);
	line->SetPoint1(0.08, 2.50, 0.71);
	line->SetPoint2(0.08, 4.50, 0.71);
	vtkNew<vtkPolyDataMapper> rakeMapper;
	rakeMapper->SetInputConnection(line->GetOutputPort());
	vtkNew<vtkActor> rake;
	rake->SetMapper(rakeMapper);
	
	reader->GetOutput()->GetPointData()->SetActiveScalars("velocity");// key1

	vtkNew<vtkStreamTracer> streamers;
	streamers->SetInputConnection(reader->GetOutputPort());
	streamers->SetSourceConnection(line->GetOutputPort());
	streamers->SetMaximumPropagation(/*maxTime*/8);// key2
	streamers->SetInitialIntegrationStep(.5);
	streamers->SetMinimumIntegrationStep(.1);
	streamers->SetIntegratorType(2);
	streamers->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "velocity");// key3

	vtkNew<vtkPolyDataMapper> streamersMapper;
	streamersMapper->SetInputConnection(streamers->GetOutputPort());
	streamersMapper->SetScalarRange(range);

	vtkNew<vtkActor> lines;
	lines->SetMapper(streamersMapper);
	lines->GetProperty()->SetColor(colors->GetColor3d("Black").GetData());

	aren->TwoSidedLightingOn();

	aren->AddActor(outline);
	aren->AddActor(door);
	aren->AddActor(window1);
	aren->AddActor(window2);
	aren->AddActor(klower1);
	aren->AddActor(klower2);
	aren->AddActor(klower3);
	aren->AddActor(klower4);
	aren->AddActor(klower5);
	aren->AddActor(klower6);
	aren->AddActor(klower7);
	aren->AddActor(hood1);
	aren->AddActor(hood2);
	aren->AddActor(hood3);
	aren->AddActor(hood4);
	aren->AddActor(hood6);
	aren->AddActor(cookingPlate);
	aren->AddActor(filter);
	aren->AddActor(lines);
	aren->AddActor(rake);

	aren->SetBackground(colors->GetColor3d("SlateGray").GetData());

	vtkNew<vtkCamera> aCamera;
	aren->SetActiveCamera(aCamera);
	aren->ResetCamera();

	aCamera->SetFocalPoint(3.505, 2.505, 1.255);
	aCamera->SetPosition(3.505, 24.6196, 1.255);
	aCamera->SetViewUp(0, 0, 1);
	aCamera->Azimuth(60);
	aCamera->Elevation(30);
	aCamera->Dolly(1.4);
	aren->ResetCameraClippingRange();

	renWin->SetSize(640, 512);
	renWin->Render();
	renWin->SetWindowName("Kitchen");

	// interact with data
	iren->Start();

	return EXIT_SUCCESS;
}

 我修改的地方有三处

第一,增加如下代码,思路来自于VTK绘制流线 - 硫酸亚铜 - 博客园 (cnblogs.com)

reader->GetOutput()->GetPointData()->SetActiveScalars("velocity");// key1

第二,发现maxTime数据为空,修改如下:

streamers->SetMaximumPropagation(/*maxTime*/8);// key2

第三,增加如下代码,思路来自于c++ - How can I use the vtkStreamTracer class to generate a streamline with my unstructured grid data(vtu) - Stack Overflow

streamers->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "velocity");// key3

执行效果图:

但是发现差异很大,有点怀疑是拿错了数据名。

 链接:(11条消息) vtk的示例,一份cpp,和一份vtk文件-C++文档类资源-CSDN文库

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
VTK,可以使用vtkContourFilter类来显示三维模型的等值线。vtkContourFilter是一种数据过滤器,可以根据给定的等值参数从输入数据集提取等值线。以下是使用vtkContourFilter显示三维模型的等值线的基本步骤: 1. 加载三维模型数据集并创建vtkPolyData对象。 2. 创建vtkContourFilter对象并设置等值参数。 3. 将vtkPolyData对象作为vtkContourFilter对象的输入。 4. 使用vtkPolyDataMapper和vtkActor将vtkContourFilter对象的输出映射到可视化管道。 下面是一个简单的示例代码,演示如何在VTK显示三维模型的等值线: ```python import vtk # 1.加载三维模型数据集并创建vtkPolyData对象 reader = vtk.vtkSTLReader() reader.SetFileName("example.stl") reader.Update() polydata = reader.GetOutput() # 2.创建vtkContourFilter对象并设置等值参数 contour = vtk.vtkContourFilter() contour.SetInputData(polydata) contour.SetValue(0, 0.5) # 设置等值参数为0.5 # 3.将vtkPolyData对象作为vtkContourFilter对象的输入 # 4.使用vtkPolyDataMapper和vtkActor将vtkContourFilter对象的输出映射到可视化管道 mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(contour.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) # 创建可视化窗口和渲染器 renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) # 创建交互器并启动渲染 interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) interactor.Initialize() renderWindow.Render() interactor.Start() ``` 在上面的示例,我们加载了一个STL格式的三维模型数据集,并使用vtkContourFilter提取了等值线。然后,我们将vtkContourFilter对象的输出映射到可视化管道,并通过vtkRenderWindowInteractor启动渲染。在渲染窗口,我们可以看到三维模型的等值线。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值