因为数量数据是既有大小又有方向的量,所以矢量数据会处于不断的运动之中,如粒子的随机运动构成了粒子运动的轨迹场,地质体由于受到各种外力、内力的作用,产生了应力场,这些由矢量数据的运动形成的场一般被称为矢量场,在矢量场的作用下,构成矢量数据的几何体会产生变形,如岩土体在应力场的作用下会产生位移,导致岩土体的外在几何形状会发生变化, VTK根据矢量场的作用采用变形或弯曲构成矢量数据几何体的方法来描述矢量数据的运动形态,采用这种方式描述矢量数据运动形态时,必须按比例缩放变形系数,控制几何体的扭曲程度,以免产生几何体失真现象。
下面给出用几何体变形方式描述矢量场的示例程序。
#include "stdafx.h"
#include <vtkSmartPointer.h>
#include <vtkVolume16Reader.h>
#include <vtkMarchingCubes.h>
#include <vtkVectorNorm.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include "vtkCamera.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include <vtkPolyDataReader.h>
#include <vtkPolyDataNormals.h>
#include <vtkWarpVector.h>
#include <vtkVectorDot.h>
#include <vtkProperty.h>
#include <vtkOutlineFilter.h>
int _tmain(int argc, _TCHAR* argv[])
{
vtkSmartPointer<vtkPolyDataReader>pPolyRead=vtkPolyDataReader::New();
/读取多边形数据
pPolyRead->SetFileName("plate.vtk");
/提取数据文件中的mode2这部分矢量数据
pPolyRead->SetVectorsName("mode3");
/生成多边形数据的法线
vtkSmartPointer<vtkPolyDataNormals>pNormal=vtkPolyDataNormals::New();
pNormal->SetInput(pPolyRead->GetOutput());
/使用矢量数据弯曲几何体
vtkSmartPointer<vtkWarpVector>pWarpVec=vtkWarpVector::New();
/设置矢量数据缩放的比例
pWarpVec->SetScaleFactor(1.0);
pWarpVec->SetInput(pNormal->GetOutput());
/点的矢量和其法线点乘,生成点的标量值
vtkSmartPointer<vtkVectorDot>pVecDot=vtkVectorDot::New();
pVecDot->SetInput(pWarpVec->GetOutput());
/创建映射器
vtkSmartPointer<vtkPolyDataMapper>pMapper=vtkPolyDataMapper::New();
pMapper->SetInput((vtkPolyData *)pWarpVec->GetOutput());
/pMapper->ScalarVisibilityOn();
/pMapper->SetScalarRange(0,1250);//Rang[0],Rang[1]);
vtkSmartPointer<vtkActor>pActor = vtkActor::New();
pActor->SetMapper(pMapper);
pActor->GetProperty()->SetColor(1.0,0.0,0.0);
/绘制没有发生变形以前的梁的几何形状
/创建多边形数据的外轮廓线
vtkSmartPointer<vtkOutlineFilter>pOutLine=vtkOutlineFilter::New();
pOutLine->SetInput(pPolyRead->GetOutput());
vtkSmartPointer<vtkPolyDataMapper>pOutlineMapper=vtkPolyDataMapper::New();
pOutlineMapper->SetInput((vtkPolyData *)pOutLine->GetOutput());
vtkSmartPointer<vtkActor>pOutlineActor=vtkActor::New();
pOutlineActor->SetMapper(pOutlineMapper);
pOutlineActor->GetProperty()->SetColor(0.0,0.0,1.0);
/绘制
vtkSmartPointer<vtkRenderer>renderer = vtkRenderer::New();
vtkSmartPointer<vtkRenderWindow>renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renderer->AddActor(pActor);
renderer->AddActor(pOutlineActor);
renderer->ResetCamera();
renderer->SetBackground(1,1,1);
renWin->SetSize(300,300);
renWin->Render();
iren->Start();
return 0;
}
该示例程序描述了 梁的位移,程序读取一个多边形数据文件,在数据文件中存储了每个点的位移数据,pPolyRead->SetVectorsName("mode3")表示提取数据文件中mode3部分的位移数据,VTK用vtkWarpVector类实现用矢量数据变形几何体,在该类中可以设置设置矢量数据缩放的比例,控制几何体的边形,程序运行的结果如图所示:
图中蓝色线框表示变形前的状态。