vtk动态显示多边形网格数据

近期老板要求做一个人的动态行走,先转一个vtk动态显示的例子,转自http://tzc.is-programmer.com

#include
#include
#include

#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkProperty.h"
#include "vtkCubeSource.h"

void read_point_file ( float p [ ] [ 3 ]const  char *name1 )
{
        FILE *fp= NULL;
         if ( (fp=fopen (name1, "r" ) )== NULL )
         {
                cout<< "open file name1 error"<                  return;
         }
         float arr [ 3 ];
         int nn= 0;
        fscanf (fp,  "%d", &nn );
         int n= 0;
         while (!feof (fp ) )
         {
                 int ret=fscanf (fp, "%f %f %f",&arr [ 0 ],&arr [ 1 ],&arr [ 2 ] );
                 if (ret!= 3 )
                         break;
                p [n ] [ 0 ]=arr [ 0 ];
                p [n ] [ 1 ]=arr [ 1 ];
                p [n ] [ 2 ]=arr [ 2 ];
                n++;
         }
        fclose (fp );
}

void read_tri_file (vtkIdType tri [ ] [ 3 ]const  char *name2 )
{
        FILE *fp= NULL;
         if ( (fp=fopen (name2, "r" ) )== NULL )
         {
                cout<< "open file name2 error"<                  return;
         }
         int nn= 0;
        fscanf (fp,  "%d", &nn );
         int n= 0;
         int num;
         int int_arr [ 3 ];
         while (!feof (fp ) )
         {
                 int ret=fscanf (fp, "%d %d %d %d",&num, &int_arr [ 0 ],&int_arr [ 1 ],&int_arr [ 2 ] );
                 if (ret!= 4 )
                         break;
                tri [n ] [ 0 ]=int_arr [ 0 ];
                tri [n ] [ 1 ]=int_arr [ 1 ];
                tri [n ] [ 2 ]=int_arr [ 2 ];
                n++;
         }
        fclose (fp );
}

int main ( int argc,  char *argv [ ] )
{
         char *file1= NULL, *file2= NULL;
         if  (argc <  3 ) {
                file1 =  ( char* ) malloc ( 20* sizeof ( char ) );
                file2 =  ( char* )malloc ( 20* sizeof ( char ) );
                file1 =  ( char * ) ( "a.asc" );
                file2 =  ( char * ) ( "aa.asc" );
         } else {
                file1 = argv [ 1 ];
                file2 = argv [ 2 ];
         }
        FILE *fp =  NULL;
         int p_num =  0;
         if ( (fp=fopen (file1, "r" ) )== NULL )
         {
                cout<< "open file "<[ 1 ]<< " error"<                  return  1;
         }
        fscanf  (fp,  "%d", &p_num );
        fclose (fp );
         printf ( "point number is : %d\n", p_num );
         float  (*points_arr ) [ 3 ] =  ( float  ( (* ) [ 3 ] ) )malloc ( 3*p_num* sizeof ( float ) );

         int tri_num =  0;
         if ( (fp=fopen (file2, "r" ) )== NULL )
         {
                cout<< "open file "<[ 2 ]<< " error"<                  return  1;
         }
        fscanf  (fp,  "%d", &tri_num );
        fclose (fp );
        vtkIdType  (*triangle_arr ) [ 3 ] =  (vtkIdType  ( (* ) [ 3 ] ) )malloc ( 3*tri_num* sizeof (vtkIdType ) );
         printf ( "triangle number is : %d \n", tri_num );

        read_point_file (points_arr, file1 );
        read_tri_file  (triangle_arr, file2 );

         int i;
        vtkPolyData *polydata = vtkPolyData:: New ( );
        vtkPoints *points = vtkPoints:: New ( );
        vtkCellArray *polys = vtkCellArray:: New ( );

        vtkPolyDataMapper *polydataMapper = vtkPolyDataMapper:: New ( );
        polydataMapper->SetInput (polydata );
        vtkActor *polydataActor = vtkActor:: New ( );
        polydataActor->SetMapper (polydataMapper );
        polydataActor->GetProperty ( )->SetColor ( 0.0, 0.0, 1.0 );

        vtkRenderer *renderer = vtkRenderer:: New ( );
        vtkRenderWindow *renWin = vtkRenderWindow:: New ( );
        renWin->AddRenderer (renderer );

        vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor:: New ( );
        iren->SetRenderWindow (renWin );

        renderer->AddActor (polydataActor );
        renderer->SetBackground ( 1, 1, 1 );
        renWin->SetSize ( 400, 400 );

         for  (i= 0; i) points->InsertPoint (i,points_arr [i ] );
         for  (i= 0; i) {
                polys->InsertNextCell ( 3,triangle_arr [i ] )
         }
        polydata->SetPoints (points );
        polydata->SetPolys (polys );
        renWin->Render ( );
        iren->Start ( );

         for  (i= 0; i) {
                 double *pp=polydata->GetPoint (i );
                points = polydata->GetPoints ( );
                points->SetPoint (i, pp [ 0 ] +10.0, pp [ 1 ], pp [ 2 ] );
                polydata->SetPoints (points );
                polydataActor->GetProperty ( )->SetColor ( 0.00.0(i* 1.0 )/ (i* 1.0 +0.000001 ) );

                renWin->Render ( );
         }

        renWin->Render ( );
        iren->Start ( );

        polydata->Delete ( );
        polydataMapper->Delete ( );
        polydataActor->Delete ( );
        renderer->Delete ( );
        renWin->Delete ( );
        iren->Delete ( );

         return  0;
}
编译命令为:

                                
        gcc -o main polydata0. cxx -I /usr/include/vtk -5.0  /usr/lib/libvtkRendering. so -Wno-deprecated

运行:
./生成的可执行文件名  点表文件  面表文件                            
                       

此处动画显示的处理方式为将所有顶点坐标按顺序将z坐标都加10.0,处理方式如下:

				
	for (i=0; iGetPoint(i);
		points = polydata->GetPoints();
		points->SetPoint(i, pp[0]+10.0, pp[1], pp[2]);
		polydata->SetPoints(points);
		polydataActor->GetProperty()->SetColor(0.0, 0.0, (i*1.0)/(i*1.0+0.000001));

		renWin->Render();
	}
				
			

对 代码的解释,首先是一个循环以遍历所有点,定义了临时指针变量pp(随便取的),令pp指向当前顶点,采用代码 polydata->GetPoints()获取点表,points->SetPoint(i, pp[0]+10.0, pp[1], pp[2])用于设定点表中第i个点的坐标,重新设定polydata的点表polydata->SetPoints(points),然后就是重 新渲染显示renWin->Render()。可能细心的您已经发现了,这里有一行代码没解释 polydataActor->GetProperty()->SetColor(0.0, 0.0, (i*1.0)/(i*1.0+0.000001)),没错,的确没解释,也不需要解释,但是必须有,此代码用于设定对象的颜色,在VTK中不知为什么, 如果采用固定的常量颜色,无法实现动态刷新渲染,这里采用了变量(i*1.0)/(i*1.0+0.000001),没做实质性修改,但是正是有了此句代 码才能刷新渲染效果。



你可能感兴趣的:(vtk)