VTK笔记——如何创建圆柱体

本文介绍了使用VTK创建圆柱体的两种方法:一种是使用vtkCylinderSource,另一种是使用vtkLineSource和vtkTubeFilter。前者创建的圆柱体沿Y轴,后者可任意设定方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VTK是一个强大的可视化开发工具,它提供了很多程序源对象可供我们使用。下面我们介绍如何创建圆柱体。

VTK创建圆柱体有两种方式:

- 方式一:使用vtkCylinderSource来创建。

vtkSmartPointer<vtkCylinderSource> cylinderSource = 
	vtkSmartPointer<vtkCylinderSource>::New();
cylinderSource->SetHeight(10.0);
cylinderSource->SetCenter(0.0, 0.0, 0.0);
cylinderSource->SetRadius(2.0);
cylinderSource->SetResolution(50);

- 方式二:使用vtkLineSource和vtkTubeFilter来创建。

vtkSmartPointer<vtkLineSource> lineSource =
	vtkSmartPointer<vtkLineSource>::New();
lineSource->SetPoint1(5.0, 0.0, 0.0);
lineSource->SetPoint2(-5.0, 0.0, 0.0);
vtkSmartPointer<vtkTubeFilter> tubeFilter = vtkSmartPointer<vtkTubeFilter>::New();
tubeFilter->SetInputConnection(lineSource->GetOutputPort());
tubeFilter->SetRadius(2.0);
tubeFilter->SetNumberOfSides(50);
tubeFilter->CappingOn();

两种方式的区别只在于能否任意设置长轴的方向。

方式一只能创建沿着世界坐标系Y轴方向的圆柱体,不能任意设置圆柱体长轴的方向。

方式二可以创建具有方向性的圆柱体,通过设置圆柱体长轴的两个端点SetPoint1和SetPoint2。

main.cpp:

#include <vtkCylinderSource.h>
#include <vtkLineSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkTubeFilter.h>

int main(int, char *[])
{
	// Create a Cylinder
	vtkSmartPointer<vtkCylinderSource> cylinderSource = 
		vtkSmartPointer<vtkCylinderSource>::New();
	cylinderSource->SetHeight(10.0);
	cylinderSource->SetCenter(0.0, 0.0, 0.0);
	cylinderSource->SetRadius(2.0);
	cylinderSource->SetResolution(50);

	vtkSmartPointer<vtkLineSource> lineSource =
		vtkSmartPointer<vtkLineSource>::New();
	lineSource->SetPoint1(5.0, 0.0, 0.0);
	lineSource->SetPoint2(-5.0, 0.0, 0.0);
	vtkSmartPointer<vtkTubeFilter> tubeFilter = vtkSmartPointer<vtkTubeFilter>::New();
	tubeFilter->SetInputConnection(lineSource->GetOutputPort());
	tubeFilter->SetRadius(2.0);
	tubeFilter->SetNumberOfSides(50);
	tubeFilter->CappingOn();

	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper1 =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	cylinderMapper1->SetInputConnection(cylinderSource->GetOutputPort());

	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper2 =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	cylinderMapper2->SetInputConnection(tubeFilter->GetOutputPort());

	vtkSmartPointer<vtkActor> cylinderActor1 = 
		vtkSmartPointer<vtkActor>::New();
	cylinderActor1->SetMapper(cylinderMapper1);

	vtkSmartPointer<vtkActor> cylinderActor2 =
		vtkSmartPointer<vtkActor>::New();
	cylinderActor2->SetMapper(cylinderMapper2);

	vtkSmartPointer<vtkRenderer> renderer1 =
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderer> renderer2 =
		vtkSmartPointer<vtkRenderer>::New();

	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->SetSize(600, 600);
	renderWindow->AddRenderer(renderer1);
	renderWindow->AddRenderer(renderer2);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

	double leftViewport[] = { 0.0, 0.0, 0.5, 1.0 };
	double rightViewport[] = { 0.5, 0.0, 1.0, 1.0 };

	cylinderActor1->GetProperty()->SetColor(0.0, 1.0, 0.0);
	cylinderActor2->GetProperty()->SetColor(0.0, 0.0, 1.0);

	renderer1->AddActor(cylinderActor1);
	renderer2->AddActor(cylinderActor2);
	renderer1->SetBackground(.3, .3, .5); // Background color purple
	renderer2->SetBackground(.2, .4, .5); 
	renderer1->SetViewport(leftViewport);
	renderer2->SetViewport(rightViewport);

	renderWindow->Render();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
 
PROJECT(Cylinder)
 
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
 
add_executable(Cylinder MACOSX_BUNDLE Cylinder.cpp )
 
target_link_libraries(Cylinder ${VTK_LIBRARIES})

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值