Thursday, March 23, 2006

Display 3D face with texture

/*
Decription: display vtk + texture
*/
#include "vtkActor.h"
#include "vtkActor2D.h"
#include "vtkBMPReader.h"
#include "vtkCamera.h"
#include "vtkCommand.h"
#include "vtkDataSetMapper.h"
#include "vtkDataSetWriter.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkPolyDataReader.h"
#include "vtkPolyDataWriter.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkTextMapper.h"
#include "vtkTextSource.h"
#include "vtkTexture.h"
#include "vtkTextProperty.h"
#include
#include
#include

void usage()
{
cerr << "Display VTK " < cerr << "Usage: display [source]" << endl;
exit(1);
}

vtkPolyData *faceOutput, *originalface;
vtkActor *faceActor;
vtkTextMapper *textmapper;
vtkPolyDataMapper *faceMapper;

std::string strg;
char *face, *bitmapfile;

int main (int argc, char **argv)
{
if (argc < 2) {
usage();
}

face = new char[200];
bitmapfile = new char[200];

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

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

// read face file
vtkPolyDataReader *facefile = vtkPolyDataReader::New();
facefile->SetFileName(argv[1]);
strg = argv[1];
argv++; argc--;

//locate the texture of the face
strcpy(face, strg.c_str());
strg.replace(strg.find(".vtk"), 4, ".bmp");
strcpy(bitmapfile, strg.c_str());

facefile->Update();
facefile->Modified();
faceOutput = facefile->GetOutput();
facefile->Update();
facefile->Modified();
cout << "Opening file: " << face << "(" << facefile->GetOutput()->GetNumberOfPoints() << " points)" << endl;
originalface = vtkPolyData::New();

//map texture
originalface->DeepCopy(faceOutput);
vtkBMPReader *_texture_BMP = vtkBMPReader::New();
vtkTexture *_texture = vtkTexture::New();
_texture->SetInput(_texture_BMP->GetOutput());
_texture_BMP->SetFileName(bitmapfile);
faceMapper = vtkPolyDataMapper::New();
faceMapper->SetInput(faceOutput);
faceActor = vtkActor::New();
faceActor->SetMapper(faceMapper);
faceActor->SetTexture(_texture);

//display text
vtkActor2D *textactor = vtkActor2D::New();
textmapper = vtkTextMapper::New();
textactor->SetMapper(textmapper);
vtkTextProperty *textproperty = vtkTextProperty::New();
textproperty->SetFontSize(18);
textproperty->BoldOn();
textmapper->SetTextProperty(textproperty);
textmapper->SetInput("Face data from ");

//display output
renderer->AddActor(textactor);
renderer->AddActor(faceActor);
renderer->SetBackground(0,0,0);
renWin->SetSize(400,400);

// interact with data
double *xyz;
xyz = facefile->GetOutput()->GetCenter();
renderer->GetActiveCamera()->SetFocalPoint(*xyz, *(xyz+1), *(xyz+2));
renWin->Render();
iren->Start();

//delete
renderer->Delete();
renWin->Delete();
iren->Delete();
facefile->Delete();
faceMapper->Delete();
faceActor->Delete();
}

This page is powered by Blogger. Isn't yours?