Hello! I am trying to visualize the cell data from an imported VRML model, and I honestly don't know where to begin.<br>Anyone has any ideas?<br><br>Compliments<br>Ricardo Seco<br><br>Application Code Below<br><br>
<br><br><br>/*****************************************************************************<br> Main.cpp<br>*****************************************************************************/
<br><br>#include "vtkVRMLImporter.h"<br>#include "vtkRenderWindow.h"<br>#include "vtkRenderer.h"<br>#include "vtkRenderWindowInteractor.h"<br>#include "vtkActor.h"<br>#include "
vtkOpenGLActor.h"<br>#include "vtkActorCollection.h"<br>#include "vtkCellPicker.h"<br>#include "vtkSphereSource.h"<br>#include "vtkPolyDataMapper.h"<br>#include "vtkPolyData.h
"<br>#include "vtkProperty.h"<br>#include "vtkCommand.h"<br>#include "stdio.h"<br><br>/* IMPLEMENTAÇÂO DO OBSERVER PARA O CELL PICKER */<br><br>class vtkMyCallback : public vtkCommand<br>
{<br>public:<br> vtkMyCallback::vtkMyCallback() { m_pvtkActorSelection = NULL; };<br> static vtkMyCallback *New() { return new vtkMyCallback; }<br> void SetSelectionActor(vtkActor* pvtkActorSelection) { m_pvtkActorSelection = pvtkActorSelection; };
<br><br> virtual void Execute(vtkObject *caller, unsigned long, void*)<br> {<br> vtkRenderWindowInteractor *iren = reinterpret_cast<vtkRenderWindowInteractor*>(caller);<br>
<br> vtkCellPicker *picker = (vtkCellPicker *)iren->GetPicker();<br> if (picker->GetCellId() != -1)<br> {<br> if (m_pvtkActorSelection)<br> m_pvtkActorSelection->SetPosition(picker->GetPickPosition());
<br> iren->Render();<br> }<br> }<br>private:<br> vtkActor* m_pvtkActorSelection;<br>};<br><br>int main( )<br>{<br> // Definição da esfera utilizada no Picking para assinalar a célula escolhida
<br> vtkSphereSource *sphere=vtkSphereSource::New();<br> sphere->SetThetaResolution(8); <br> sphere->SetPhiResolution(8);<br> sphere->SetRadius(0.05);<br> vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
<br> vtkPolyDataMapper *cellMapper = vtkPolyDataMapper::New();<br> vtkPolyData *cellData = vtkPolyData::New();<br> sphereMapper->SetInput(sphere->GetOutput());<br><br> // Estabelecimento da esfera como sendo do tipo de actor
<br><br> vtkOpenGLActor *myPicker=vtkOpenGLActor::New();<br> myPicker->GetProperty()->SetColor(1.0,0.0,0.0);<br> myPicker->SetMapper(sphereMapper);<br><br> // Claro que não nos interessa que seja "pickable"
<br> <br> myPicker->PickableOff();<br> <br> /* Importador de Ficheiros VRML */<br><br> vtkVRMLImporter *importer=vtkVRMLImporter::New();<br> importer->SetFileName("Model.wrl");<br> importer->Read();
<br> vtkRenderer *ren1;<br> ren1 = importer->GetRenderer();<br><br> <br> // Obtenção do número de actores que compõem a cena VRML <br> <br> int NumberOfActors = ren1->GetActors()->GetNumberOfItems();
<br><br> printf("O numero de actores que compoe a cena sao %d \n", NumberOfActors);<br><br> // Coleccao de Actores que<br> // armazenará o conjunto de <br> // actores da cena VRML<br><br> vtkActorCollection *ActColection;
<br><br> // Objecto vtkActor que representará<br> // cada actor<br><br> vtkActor *Act;<br><br> // Array que armazenará as coordenadas<br> // de cada Actor da cena VRML<br><br> double bounds[6];<br><br> ren1->SetBackground(0,0,1);
<br><br> // Contador de actores<br><br> int auxiliar = 0;<br><br> float volume[9];<br> for (int i=0; i<=8; i++)<br> volume[i]=0.0;<br> float volumeTotal = 0.0;<br> <br> if (NumberOfActors >0)
<br> {<br> // Obtenção dos actores da cena<br><br> ActColection = ren1->GetActors();<br> ActColection->InitTraversal();<br> <br> // Para cada iteração ...<br><br> for (int i=0;i<NumberOfActors;i++)
<br> {<br> auxiliar++;<br> <br> // Obter esse actor<br><br> Act = ActColection->GetNextActor();<br><br> if (Act!=NULL)<br> {<br> if (Act->GetMapper()!=NULL)
<br> {<br> printf("------------------------------------------------------------------ \n"); <br> <br> // Este código consoante o indice do actor<br>
// que "engloba" o modelo torna-o ou não<br> // pickable. No caso de só existir um actor<br> // este é sempre pickable<br><br> if ((auxiliar==1) && (NumberOfActors>1))
<br> {<br> Act->PickableOff();<br> }<br> <br> ren1->AddActor(Act);<br><br> // Obtenção das coordenadas do actor corrente
<br><br> Act->GetBounds(bounds);<br><br> printf("------------------------------------------------------------------ \n"); <br><br> printf("Actor %d Tem dimensoes : \n Xmin: %f \n Xmax: %f \n Ymin: %f \n Ymax: %f \n Zmin: %f \n Zmax: %f \n",auxiliar,bounds[0],bounds[1],bounds[2],bounds[3],bounds[4],bounds[5]);
<br><br> // Calculo do volume do Objecto (Aproximado)<br> volume[i] = ((bounds[1]-bounds[0])*(bounds[3]-bounds[2])*(bounds[5]-bounds[4]));<br> <br> printf("Actor %d Tem Volume : %f \n",auxiliar,volume[i]);
<br> <br> printf("------------------------------------------------------------------ \n");<br> }<br> }<br> }<br><br> //Calculo do volume "livre" da sala
<br> volumeTotal = volume[0]-(volume[1]+volume[2]+volume[3]+volume[4]+volume[5]+volume[6]+volume[7]);<br> printf("A Sala Tem Volume 'Livre' : %f \n",volumeTotal);<br> printf("------------------------------------------------------------------ \n");
<br> }<br> <br> /* Janela de Renderização */<br> vtkRenderWindow *renWin = vtkRenderWindow::New();<br> renWin->AddRenderer(ren1);<br> renWin->SetSize(640,480);<br> ren1->AddActor(myPicker);<br>
ren1->Render(); <br> <br> /* Janela de Interacção */<br> vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();<br> iren->SetRenderWindow(renWin);<br><br> /* Definicao de um Cell Picker */
<br> vtkCellPicker *picker=vtkCellPicker::New();<br> picker->SetTolerance(0.01);<br> iren->SetPicker(picker);<br> iren->Initialize();<br><br> // Código de atribuição do Observer<br><br> vtkMyCallback *callback = vtkMyCallback::New();
<br> callback->SetSelectionActor(myPicker);<br> iren->AddObserver(vtkCommand::EndPickEvent, callback); <br> /* Inicio da renderização da Cena */<br> iren->Start(); <br> <br> <br> ren1->Delete();
<br> picker->Delete();<br> importer->Delete();<br> renWin->Delete();<br> return 0;<br>}<br><br>