2017-05-19 1 views
0

J'utilise VTK depuis plusieurs années, et j'ai trouvé un problème aujourd'hui qui est très étrange, le code est le suivant:Pourquoi mon VTK n'affiche rien?

#include <vtkSmartPointer.h> 
#include <vtkImageData.h> 

#include "vtkBoxWidget.h" 
#include "vtkCamera.h" 
#include "vtkCommand.h" 
#include "vtkColorTransferFunction.h" 
#include "vtkPiecewiseFunction.h" 
#include "vtkPlanes.h" 
#include "vtkProperty.h" 
#include "vtkRenderer.h" 
#include "vtkRenderWindow.h" 
#include "vtkRenderWindowInteractor.h" 
#include "vtkVolume.h" 
#include "vtkVolumeProperty.h" 
#include "vtkFixedPointVolumeRayCastMapper.h" 
#include "vtkInteractorStyleTrackballCamera.h" 

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL2); 
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2) 
VTK_MODULE_INIT(vtkInteractionStyle) 

#include <limits> 
#include <string> 

int main(int argc, char *argv[]) 
{ 
/************************************************************************/ 
/* Generate a RGBA volume            */ 
/************************************************************************/ 
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New(); 
int dim[3] = { 10, 10, 10 }; 
double spacing[3] = { 1.0, 1.0, 1.0 }; 
double origin[3] = { 0.0, 0.0, 0.0 }; 
image->SetDimensions(dim); 
image->SetSpacing(spacing); 
image->SetOrigin(origin); 
image->AllocateScalars(VTK_UNSIGNED_CHAR, 4); 

unsigned char* ptr = static_cast<unsigned char*>(image->GetScalarPointer()); 
int idx = 0; 
for (int z = 0; z < 10; z++){ 
    for (int y = 0; y < 10; y++){ 
     for (int x = 0; x < 10; x++){ 
      if (z > 6){ 
       ptr[idx] = 255; 
       ptr[idx + 1] = 0; 
       ptr[idx + 2] = 0; 
       ptr[idx + 3] = 255; 
      } 
      else{ 
       ptr[idx] = 0; 
       ptr[idx + 1] = 0; 
       ptr[idx + 2] = 0; 
       ptr[idx + 3] = 0; 
      } 

      idx += 4; 
     } 
    } 
} 

/************************************************************************/ 
/* Rendering               */ 
/************************************************************************/ 
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); 
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); 
renWin->AddRenderer(renderer); 

vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
iren->SetRenderWindow(renWin); 
iren->SetDesiredUpdateRate(10.0); 
iren->GetInteractorStyle()->SetDefaultRenderer(renderer); 

// Create our volume and mapper 
vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New(); 
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New(); 
mapper->SetInputData(image); 
mapper->SetBlendModeToComposite(); 
mapper->SetSampleDistance(0.1); 

vtkSmartPointer<vtkPiecewiseFunction> opacityFun = vtkSmartPointer<vtkPiecewiseFunction>::New(); 
opacityFun->AddPoint(0, 0.0); 
opacityFun->AddPoint(255, 1.0); 

// Create the property and attach the transfer functions 
vtkSmartPointer<vtkVolumeProperty> property = vtkSmartPointer<vtkVolumeProperty>::New(); 
property->SetScalarOpacity(opacityFun); 
property->IndependentComponentsOff(); 
//property->SetInterpolationTypeToLinear(); 

// connect up the volume to the property and the mapper 
volume->SetProperty(property); 
volume->SetMapper(mapper); 

// Set the default window size 
renWin->SetSize(400, 400); 
renWin->Render(); 

// Add the volume to the scene 
renderer->AddVolume(volume); 
renderer->ResetCamera(); 

// interact with data 
renWin->Render(); 
iren->Start(); 

return 1; 
} 

Je suis générer un 10 * 10 * 10 volume RGBA et l'afficher, mais je ne rien avoir dans mon écran. Dans la ligne 46, si je change (z> 6) à (z < 2), il affiche la boîte correcte comme je l'espérais, aussi si je change (z> 6) à (z> 6 || z < 2), il affiche 2 cases correctes.

Alors pourquoi (z> 6) n'affiche rien? que dois-je faire pour le faire fonctionner correctement?

Répondre

1

Cela ressemble à un bug pour moi. Si vous définissez l'opacité sur 1 au lieu de 0 pour z < = 6, vous pouvez contourner votre problème, cela ne semble se produire que lorsque l'opacité est égale à 0.

+0

Merci, mululu! Oui, utiliser (0,0,0,1) au lieu de (0,0,0,0) pour z <= 6 peut afficher l'image correcte. Mais aussi c'est un petit volume, ces opacité 1 voxel ne changeront pas beaucoup le résultat. Quand je viens avec un gros volume, je pense que ces 1 vont rendre tous les résultats noirs. –