近期老板要求做一个人的动态行走,先转一个vtk动态显示的例子,转自http://tzc.is-programmer.com
#include <iostream>
#include <stdio.h>
#include <malloc.h>
#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"<<endl;
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"<<endl;
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 "<<argv [ 1 ]<< " error"<<endl;
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 "<<argv [ 2 ]<< " error"<<endl;
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<p_num; i++ ) points->InsertPoint (i,points_arr [i ] );
for (i= 0; i<tri_num; i++ ) {
polys->InsertNextCell ( 3,triangle_arr [i ] );
}
polydata->SetPoints (points );
polydata->SetPolys (polys );
renWin->Render ( );
iren->Start ( );
for (i= 0; i<p_num; 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.0, 0.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
运行:
./生成的可执行文件名 点表文件 面表文件
#include <stdio.h>
#include <malloc.h>
#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"<<endl;
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"<<endl;
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 "<<argv [ 1 ]<< " error"<<endl;
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 "<<argv [ 2 ]<< " error"<<endl;
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<p_num; i++ ) points->InsertPoint (i,points_arr [i ] );
for (i= 0; i<tri_num; i++ ) {
polys->InsertNextCell ( 3,triangle_arr [i ] );
}
polydata->SetPoints (points );
polydata->SetPolys (polys );
renWin->Render ( );
iren->Start ( );
for (i= 0; i<p_num; 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.0, 0.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; i<p_num; 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.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),没做实质性修改,但是正是有了此句代 码才能刷新渲染效果。