X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FvvImage.txx;h=55b785fb4814571fd4c0a7788699d03c848b937f;hb=8b7afc421b64df4f4b0dab56a36d6d4cf7335d87;hp=6e8907633987e48e4fc17c0f7b97cd3eecc57eae;hpb=765020625fbc092d283e221e36c83e60a1844cb7;p=clitk.git diff --git a/common/vvImage.txx b/common/vvImage.txx index 6e89076..55b785f 100644 --- a/common/vvImage.txx +++ b/common/vvImage.txx @@ -26,22 +26,32 @@ void vvImage::AddItkImage(TItkImageType *input) input->Update(); // Convert from ITK object to VTK object - mImageDimension = TItkImageType::ImageDimension; + mImageDimension = TItkImageType::ImageDimension; typedef itk::ImageToVTKImageFilter ConverterType; typename ConverterType::Pointer converter = ConverterType::New(); mItkToVtkConverters.push_back(dynamic_cast< itk::ProcessObject *>(converter.GetPointer())); converter->SetInput(input); converter->Update(); mVtkImages.push_back( converter->GetOutput() ); - + // Account for direction in transform. The offset is already accounted for // in the VTK image coordinates, no need to put it in the transform. vtkSmartPointer matrix = vtkSmartPointer::New(); matrix->Identity(); - for(unsigned int j=0; jGetImageDimension(); j++) - for(unsigned int i=0; iGetImageDimension(); i++) + for(unsigned int i=0; iGetImageDimension(); i++) { + for(unsigned int j=0; jGetImageDimension(); j++) { (*matrix)[i][j] = input->GetDirection()[i][j]; - mTransform->SetMatrix(matrix); + // Direction is used around the image origin in ITK + (*matrix)[i][3] -= (*matrix)[i][j] * input->GetOrigin()[j]; + } + (*matrix)[i][3] += input->GetOrigin()[i]; + } + + // GetDirection provides the forward transform, vtkImageReslice wants the inverse + matrix->Invert(); + + mTransform.push_back(vtkSmartPointer::New()); + mTransform.back()->SetMatrix(matrix); } //--------------------------------------------------------------------