3D объем не отображается в VTK + Qt - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь отобразить 3D-объем (https://midas3.kitware.com/midas/item/34776), используя VTK и Qt, используя QVTKOpenGLWidget. Я могу отображать и взаимодействовать с осями, сферами, конусами ... но 3D-объем не отображается на сцене.

Я могу правильно отобразить громкость при использовании примера из VTK (https://www.vtk.org/Wiki/VTK/Examples/Cxx/VolumeRendering/SmartVolumeMapper).

Вот минимальный пример (VTK 8.1.1, Qt 5.10.1, Win10):

CentralWidget::CentralWidget(QWidget *parent=0) : QWidget(parent)
{   
    mQVTKWidget = new QVTKOpenGLWidget(this);
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(mQVTKWidget);
    mQVTKWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    mQVTKWidget->SetRenderWindow(renderWindow);

    mRenderer = vtkSmartPointer<vtkRenderer>::New();
    mQVTKWidget->GetRenderWindow()->AddRenderer(mRenderer);
    mRenderer->GradientBackgroundOn();
    mRenderer->SetBackground(.8, .8, 1);
    mRenderer->SetBackground2(.3, .3, 1);

    // Sphere
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetPhiResolution(30);
    sphereSource->SetThetaResolution(30);
    sphereSource->SetRadius(50.0);

    vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());

    vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
    sphereActor->SetMapper(sphereMapper);

    // 3D image: .vti file. 
    vtkSmartPointer<vtkXMLImageDataReader> reader = vtkSmartPointer<vtkXMLImageDataReader>::New();
    reader->SetFileName("NLM Visible Human Project.vti");
    reader->Update();
    vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::New();
    imageData->ShallowCopy(reader->GetOutput());

    vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper = vtkSmartPointer<vtkSmartVolumeMapper>::New();
    volumeMapper->SetBlendModeToComposite(); // composite first
    volumeMapper->SetInputData(imageData);

    vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
    volumeProperty->ShadeOff();
    volumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

    vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
    compositeOpacity->AddPoint(0.0, 0.0);
    compositeOpacity->AddPoint(700.0, 0.0);
    compositeOpacity->AddPoint(3600.0, 1.0);
    volumeProperty->SetScalarOpacity(compositeOpacity); // composite first.

    vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();
    color->AddRGBPoint(0.0, 1.0, 0.0, 0.0);
    color->AddRGBPoint(3600.0, 1.0, 0.0, 1.0);
    volumeProperty->SetColor(color);

    vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
    volume->SetMapper(volumeMapper);
    volume->SetProperty(volumeProperty);

    // Renderer
    mRenderer->AddActor(sphereActor);
    mRenderer->AddVolume(volume);
    mRenderer->ResetCamera();

    // axes
    vtkAxesActor *axes = vtkAxesActor::New();
    vtkOrientationMarkerWidget *widget = vtkOrientationMarkerWidget::New();
    widget->SetDefaultRenderer(mRenderer);  
    widget->SetOrientationMarker(axes);
    widget->SetInteractor(mQVTKWidget->GetRenderWindow()->GetInteractor());
    widget->EnabledOn();

    vtkSmartPointer<vtkCubeAxesActor> cubeAxesActor = 
    vtkSmartPointer<vtkCubeAxesActor>::New();
    cubeAxesActor->SetBounds(volume->GetBounds());
    cubeAxesActor->SetCamera(mRenderer->GetActiveCamera());
    mRenderer->AddActor(cubeAxesActor);
}

[править] Вот снимок экрана с выводом: VTK does not show 2D volume

Что я делаю не так?

1 Ответ

0 голосов
/ 16 октября 2018

После сравнения с примером кода из здесь я нашел решение.Ошибка была не в фрагментах кода в вопросе, а в main (), где:

QSurfaceFormat::setDefaultFormat(QVTKOpenGLWidget::defaultFormat());

следует заменить на:

auto defaultFormat = QVTKOpenGLWidget::defaultFormat();
defaultFormat.setSamples(0);
QSurfaceFormat::setDefaultFormat(defaultFormat);

Эта проблема также обсуждается в выпуск # 17095 системы отслеживания ошибок VTK.

...