vtk使⽤-使⽤cmake写⼀个简单的⽰例
环境:
系统环境:win10 x64
vtk版本:vtk-7.1
然后我就来使⽤cmake写⼀个简单的vtk⽰例:
1.从空项⽬开始:
⾸先新建⼀个⽂件夹,这个⽂件夹⽤来编写各个⼦项⽬:
如图新建demo⽂件夹,在⾥⾯新建⼀个⽂件夹。待会就是要在test1⽂件夹下写代码了。简单构建下,先不使⽤第三⽅库。
demo下的
test下新建⽂件
内容如图:
先简单这么写,然后使⽤cmake-gui构建。
configure后我使⽤的是vs2013 x64平台。然后⽣成(Generate) 。⽣成如下⽬录。
cmake如何使用打开demo.sln。
⼀个简单的项⽬就创建好了。⽬前这个项⽬是没有导⼊第三⽅库的。
2.导⼊第三库的vtk
demo⽂件夹下CMakeLists新增如下:
再次使⽤cmake构建:
点击构建configure,会弹出错误,设置路径VTK_DIR路径,如果有其它问题,看下⽇志,处理下就⾏。效果图
因为要在test1⼦项⽬下编写vtk的⽰例,⽬前还不能使⽤vtk的库,
test1⽂件下的CMakeLists新增:
注意:只要⽂件内容做了修改,如果不知道这个修改具体执⾏在哪⼀步,最好都要⽤cmake重新构建⽣成下,这样不容易出错。
这样test的附加依赖项就有东西了:
这样添加第三库的⼯作就完成了。
3.使⽤vtk写⼀个简单的程序
vtk的可视化有⼀套渲染管线:
源数据(*Sources)->过滤器(*Filters)->映射器(*Mapper)->表演者(*Actor)->渲染器(Renderer)->渲染窗⼝(RenderWindow)->交互器(RenderWindowinteractor)
基于这⼀套流程,我写⼀个简单的显⽰程序:
显⽰⼀个圆环,使⽤简单绘制三⾓⾯的⽅法
vtk封装了两种智能指针:vtkSmartPointer和vtkNew。这两种智能指针简单的使⽤的话可以互相替换的,vtkNew⽆法直接作为返回值使⽤。
⾸先计算机本⾝是画不出弧形的,所以实际上绘制圆的话,就是绘制⼀个正多边形。只是这个边越多,越接近⼀个圆。所以我这⾥就使⽤插值的⽅法。
贴代码:
#include"vtkSmartPointer.h"
#include"vtkPolyData.h"
#include "vtkType.h"
#include "vtkPoints.h"
#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPolyData.h"
#include "vtkPointData.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
#define CIR_CUT (100.0)
namespace Data
{
//存放点集
using Point = std::vector<double>;
using Pointlist = std::vector<Point>;
/
/绘制⾯的索引
using Triangular = std::vector<vtkIdType>;
using TriangularList = std::vector<Triangular>;
}
int main()
{
//设置内环,外环半径
double Rinner = 20.0;
double Rexcir = 40.0;
Data::Pointlist mPointlist;
Data::TriangularList mTriangularList;
/
/
std::vector<double> angles;
double angleInterval = (2 * M_PI) / CIR_CUT;
for (auto i = 0; i <= CIR_CUT;i++)
angles.push_back(i*angleInterval);
//⽣成点集和三⾓⾯
for (auto index = 0; index < CIR_CUT; index++)
{
__int64 lastsize = mPointlist.size();
Data::Point p1 = { Rinner*cos(angles[index]), Rinner*sin(angles[index]), 0.0 };
Data::Point p2 = { Rinner*cos(angles[index+1]), Rinner*sin(angles[index + 1]), 0.0 };
Data::Point p3 = { Rexcir*cos(angles[index+1]), Rexcir*sin(angles[index + 1]), 0.0 };
Data::Point p4 = { Rexcir*cos(angles[index]), Rexcir*sin(angles[index]), 0.0 };
Data::Triangular f1 = { 0 + lastsize, 1 + lastsize, 2 + lastsize };
Data::Triangular f2 = { 2 + lastsize, 3 + lastsize, 0 + lastsize };
mPointlist.push_back(p1);
mPointlist.push_back(p2);
mPointlist.push_back(p3);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。