使用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);
三维场景的几个基本要素
- 灯光 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();
- 相机
投影方向 相机位置到相机焦点的方向向量vtkSmartPointer<vtkCamera> camera= vtkSmartPointer<vtkCamera>::New(); // 相机位置 camera->SetPosition(); // 相机焦点 camera->SetFocusPoint() // 相机向上的方向,默认为(0,1,0) camera->SetViewUp() // 相机视角 camera->SetViewAngle() // 前后裁剪平面 只有裁剪平面之间的Actor 才是可见的 camera->SetClippingRange() // 根据相机位置,焦点等信息重新计算视平面的法向量 camera->ComputeViewPlaneNormal()
投影方法, 正交投影即平行投影,另一种为透视投影 - 纹理
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版权协议,转载请附上原文出处链接和本声明。