VTK学习笔记之三、一个简单的例子

使用VTK创建一个圆柱

先来一段代码,配置过程就不写了

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCubeSource.h>

#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkSphereSource.h>

#include "vtkAutoInit.h" 
//! [0] 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
int main()
{
	// 派生自vtkPolyDataAlgorithm  其生成的数据类型为vtkPolyData , 柱体
	vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
	cylinder->SetHeight(10);

	cylinder->SetRadius(15.0);
	// 设置柱体横截面的边数
	cylinder->SetResolution(50);
	// cube
	vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
	cube->SetCenter(10, 10, 10);
	cube->SetXLength(15);
	cube->SetYLength(15);
	cube->SetZLength(15);
	// sphere 
	vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();
	sphere->SetCenter(100, 200, 300);
	sphere->SetRadius(15);
	// 设置 phi / theta 方向上的点的数量,也可以理解为边的数量
	sphere->SetPhiResolution(50);
	sphere->SetThetaResolution(50);
	
	// 用于渲染多边形几何数据,将数据转化为几何图元
	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	// 可视化管线的输入/输出接口,可以设置多个
	//cylinderMapper->AddInputConnection(1, cube->GetOutputPort());
	//cylinderMapper->AddInputConnection(0, cylinder->GetOutputPort());
	// 也可以仅设置设置一个,SetInputConnection只有最后一个起作用
	cylinderMapper->SetInputConnection(sphere->GetOutputPort());
	// vtkProperty 负责控制颜色,透明度等参数
	vtkSmartPointer<vtkProperty> property = vtkSmartPointer<vtkProperty>::New();
	property->SetColor(0.7, 0.2, 0.3);


	// vtkActor 派生自 vtkProp 渲染场景中数据的可视化表达通过vtkProp子类负责,负责确定位置,大小等
	vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
	cylinderActor->SetMapper(cylinderMapper);
	cylinderActor->SetProperty(property);
	//管理场景渲染过程
	vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();

	render->AddActor(cylinderActor);
	render->SetBackground(0.1, 0.2, 0.4);
	



	vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
	window->AddRenderer(render);
	window->SetSize(400, 600);
	// 负责交互
	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();

	iren->SetRenderWindow(window);
	
	// 交互器样式
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();

	iren->SetInteractorStyle(style);

	iren->Initialize();
	// 进入事件循环,必须先调用 Initialize 做准备工作
	iren->Start();

	return 0;

}

在这里插入图片描述

【0】运行时出现问题 Generic Warning: In C:\location\VTK6.0.0\Rendering\Core\vtkPolyDataMapper.cxx, line 27
Error: no override found for ‘vtkPolyDataMapper’.

该错误表示链接器找不到vtkPolyDataMapper方法的定义。必须注意构建期间使用了哪个vtk渲染后端。它可能是vtkRenderingOpenGL或vtkRenderingOpenGL2。
源文件最前面插入这三行即可

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

三维场景的几个基本要素

  1. 灯光 vtklight 默认为方向灯光
    vtkSmartPointer<vtkLight> light = vtkSmartPointer<vtkLight>::New();
    //  设置灯光的颜色
    light->SetColor(0.8, 0.2, 0.3); 
    // 位置
    light->SetPosition(0, 0, 1);
    // 设置灯光焦点
    light-> SetFocalPoint(camera->GetFocalPoint());
    // 开启聚光灯 通常与 SetConeAngle() 一起使用   SetConeAngle() 设置位置灯的照明锥角度。这是圆锥体轴和沿圆锥体边缘的射线之间的角度。值180 则为聚光灯
    light->PositionalOn();
    
  2. 相机
    vtkSmartPointer<vtkCamera> camera= vtkSmartPointer<vtkCamera>::New();
    // 相机位置
    camera->SetPosition();
    // 相机焦点
    camera->SetFocusPoint()
    // 相机向上的方向,默认为(0,1,0)
    camera->SetViewUp()
    // 相机视角 
    camera->SetViewAngle()
    //  前后裁剪平面 只有裁剪平面之间的Actor 才是可见的
    camera->SetClippingRange()
    // 根据相机位置,焦点等信息重新计算视平面的法向量
    camera->ComputeViewPlaneNormal()
    
    投影方向 相机位置到相机焦点的方向向量
    投影方法, 正交投影即平行投影,另一种为透视投影在这里插入图片描述
  3. 纹理
    vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
    // 读取文件
    reader->SetFileName("D:/pic/texture.jpg");
    
    vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();
    // 设置管线
    texture->SetInputConnection(reader->GetOutputPort());
    
    vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
    cylinderActor->SetMapper(cylinderMapper);
    cylinderActor->SetProperty(property);
    cylinderActor->SetTexture(texture);
    

在这里插入图片描述


版权声明:本文为qq_37791201原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。