Hi, all,<br><br>I want to use texture mapping in VTK, but I do not know how to. Particularly, I have one mesh (actually a 2D mesh manually picked on the texture image) and one texture image. And I want to specify the color of each vertex of the mesh by giving its 2D color index (u,v) on the texture image. I tried setting the 2D texture index as 2-component scalars (not normalized to 0~1, should I do that?) of the mesh's point data, but it does not work. Can any body give me some advices on? Any suggestion will be appreciated.
<br><br>Thanks in advance,<br>----<br>Ye Ning<br><br>Attached here my "NOT-working" code:<br><br>#include <fstream><br>#include <iostream><br><br>#include "vtkActor.h"<br>#include "vtkCamera.h
"<br>#include "vtkPolyData.h"<br>#include "vtkPolyDataMapper.h"<br>#include "vtkRenderWindow.h"<br>#include "vtkRenderWindowInteractor.h"<br>#include "vtkRenderer.h"<br>
#include "vtkPoints.h"<br>#include "vtkPointData.h"<br>#include "vtkCellArray.h"<br><br>#include "vtkDoubleArray.h"<br>#include "vtkJPEGReader.h"<br>#include "vtkTexture.h
"<br><br>#define MeshPts 64<br>#define MeshTri 111<br><br>const char* ptsfile = "facemesh.pts";<br>const char* trifile = "facemesh.tri";<br>const char* texfile = "facemesh.jpg";<br><br>void LoadShape( vtkPolyData* avatar )
<br>{<br> if (!avatar) return;<br><br> vtkPoints* pts = vtkPoints::New();<br> vtkCellArray* tri = vtkCellArray::New();<br> vtkDoubleArray* scalar = vtkDoubleArray::New();<br> scalar->SetNumberOfComponents(2);
<br><br> ifstream fin;<br> fin.open( ptsfile );<br> for ( int i = 0; i < MeshPts; i++ ) {<br> double x,y;<br> fin >> x; fin >> y;<br> pts->InsertNextPoint( x, -y, 0 );<br> scalar->InsertTuple2( i, x, y );
<br> }<br> fin.close();<br> fin.open( trifile );<br> vtkIdType ptslist[3];<br> for ( int i = 0; i < MeshTri; i++ ) {<br> double t;<br> fin >> t; ptslist[0] = vtkIdType(t);<br> fin >> t; ptslist[1] = vtkIdType(t);
<br> fin >> t; ptslist[2] = vtkIdType(t);<br> tri->InsertNextCell( 3, ptslist );<br> }<br> fin.close();<br><br> avatar->SetPoints( pts );<br> avatar->SetPolys( tri );<br> avatar->GetPointData()->SetScalars( scalar );
<br><br> scalar->Delete();<br> tri->Delete();<br> pts->Delete();<br>}<br><br>void LoadTexture( vtkTexture* texture )<br>{<br> vtkJPEGReader* textureReader = vtkJPEGReader::New();<br> textureReader->SetFileName( texfile );
<br><br> texture->SetInputConnection( textureReader->GetOutputPort() );<br> texture->RepeatOff();<br> texture->InterpolateOn();<br><br> textureReader->Delete();<br>}<br><br>void main()<br>{<br> /* + Texture */
<br> vtkTexture* texture = vtkTexture::New();<br> LoadTexture( texture );<br> /* o->Poly data source */<br> vtkPolyData* avatar = vtkPolyData::New();<br> LoadShape( avatar );<br> /* -->Mapper */<br>
vtkPolyDataMapper* avaMapper = vtkPolyDataMapper::New();<br> avaMapper->SetInput( avatar );<br> /* -->Actor */<br> vtkActor* avaActor = vtkActor::New();<br> avaActor->SetMapper( avaMapper );<br> avaActor->SetTexture( texture );
<br> /* -->Renderer */<br> vtkRenderer* renderer = vtkRenderer::New();<br> renderer->AddActor( avaActor );<br> renderer->SetBackground(1,1,1);<br> /* -->Render Window */<br> vtkRenderWindow* renWin = vtkRenderWindow::New();
<br> renWin->AddRenderer( renderer );<br> /* + Interactor */<br> vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();<br> iren->SetRenderWindow( renWin );<br> /* Rendering and interacting */
<br> renWin->Render();<br> iren->Start();<br> /* Release all */<br> iren->Delete();<br> renWin->Delete();<br> renderer->Delete();<br> avaActor->Delete();<br> avaMapper->Delete();
<br> avatar->Delete();<br> texture->Delete();<br>}<br><br>