VTK 基础(一) — 常用控件介绍及实现圆锥体的绘制

利用 VTK 进行绘制物体时,常用到的组件有下面几种,为了加深理解,VTK 把一个物体的渲染过程比喻成了一场演出:

  • vtkRenderWindow : 绘制窗口,相当于用于表演的舞台场地;
  • vtkRenderer — 涉及灯光,相机,actor 的绘制过程;相当于舞台上的整体表演效果;
  • vtkLight — 灯源用于照量场景;
  • vtkCamera — 定义视角,焦距,及场景的视觉属性,相当于观众的视野范围;
  • vtkActor — 场景中渲染的对象,属性以及它在场景中的位置,绘制中展示的道具;相当于演出的演员和道具;
  • vtkProperty 修饰 vtkActor 的属性,包括颜色、透明度及灯光的属性(反射、折射效果),演出用到的灯光
  • vtkMappervtkActor 的几何映射,绘制时需要把 vtkAcor 转化为几何属性才能进行绘制;多个 vtkActor 可以设置相同的 mapper

下图是对 VTK 在绘制效果中对各组件的标注:

标注.jpg

进行物体绘制时,需要先提供源数据,对数据进行一系列操作(读取、格式转换、Filter图像处理),再转化为vtkMappervtkActor 进行设置``vtkMapper后,传入 vtkRendener (`绘制器)中。

在进行代码实现时,如果没有定义vtkLight、vtkCamera 两个组件时,程序会自动创建这两个组件。

整体来说,VTK 的数据管道流向如下:

未命名文件 (4).png

下面就利用代码来实现一个圆锥体的绘制,借助于 VTK 提供的一个类 vtkConeSource.h

#include<vtkActor.h>
#include<vtkSmartPointer.h>
#include<vtkPolyDataMapper.h>
#include<vtkConeSource.h>
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkCamera.h>
#include<vtkNamedColors.h>

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);


int main()
{
	vtkSmartPointer<vtkConeSource> Cone = vtkSmartPointer<vtkConeSource>::New();
	vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
	
	Cone->SetHeight(3.0);//Cone Height
	Cone->SetRadius(1.0);//Cone Radius
	Cone->SetResolution(9);//Cone faces
	
	vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	coneMapper->SetInputConnection(Cone->GetOutputPort());//Mapper data
	
	vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
	coneActor->SetMapper(coneMapper);
	
	vtkSmartPointer<vtkRenderer> coneRender = vtkSmartPointer<vtkRenderer>::New();
	coneRender->AddActor(coneActor);
	coneRender->SetBackground(colors->GetColor3d("MidnightBlue").GetData());//Bachground color
	
	vtkSmartPointer<vtkRenderWindow> renWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renWindow->AddRenderer(coneRender);
	
	renWindow->SetSize(300, 300);//Size of Window;
	

	for (auto i = 0; i < 360; ++i)
	{
		//render the image;
		renWindow->Render();
		//rotate the active camera by one degree
		coneRender->GetActiveCamera()->Azimuth(1);
	}

	getchar();
	return EXIT_SUCCESS;

}

最终的效果如下:

Snipaste_2020-04-20_13-33-05.jpg

代码中对圆锥设置了几个参数:高度,底部半径,及包含面的个数(圆锥涉及的面的总个数);

VTK 除了头文件 vtkConeSource.h 提供圆锥数据以外,还有椭圆,正方体,圆环等数据对象。

Snipaste_2020-04-20_13-42-50.jpg

文章首发于公号:Z先生点记

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用VTK实现一个STL文件切片的体绘制结果,你可以使用`vtkPolyData`和`vtkCutter`。下面是一个简单的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <vtkSTLReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkPlane.h> #include <vtkCutter.h> int main(int argc, char* argv[]) { // 创建STL读取器 vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New(); reader->SetFileName("path/to/stl/file"); reader->Update(); // 创建切割平面 vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New(); plane->SetOrigin(0, 0, 0); plane->SetNormal(1, 0, 0); // 设置切割平面的法向量 // 创建切割器 vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New(); cutter->SetInputConnection(reader->GetOutputPort()); cutter->SetCutFunction(plane); cutter->GenerateValues(1, 0, 0); // 设置切割值 // 创建多边形数据映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cutter->GetOutputPort()); // 创建演员 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 创建渲染器和渲染窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 创建交互器并启动渲染循环 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); interactor->Initialize(); interactor->Start(); return 0; } ``` 在上面的示例代码中,我们首先创建了一个`vtkSTLReader`对象,用于读取STL文件的数据。然后,我们创建了一个`vtkPlane`对象来定义切割平面,设置其原点和法向量。 接下来,我们创建了一个`vtkCutter`对象,并将读取器的输出连接到切割器的输入端口。通过`SetCutFunction()`方法,我们将切割平面设置为切割器的切割函数。使用`GenerateValues()`方法,我们生成了一个切割值。 然后,我们创建了一个`vtkPolyDataMapper`对象,并将切割器的输出连接到映射器的输入端口。 最后,我们创建了一个`vtkActor`对象,并将映射器设置为演员的映射器。然后,我们创建了一个`vtkRenderer`对象,并将演员添加到渲染器中。最后,我们创建了一个`vtkRenderWindow`对象,并将渲染器添加到渲染窗口中。 通过创建一个`vtkRenderWindowInteractor`对象,并将其与渲染窗口关联起来,可以启动渲染循环,显示STL文件切片的体绘制结果。 请将代码中的"path/to/stl/file"替换为您自己的STL文件路径。此外,您还可以根据需要调整切割平面的位置和方向。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员大飞1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值