VTK 6.1 и Qt 5.3: 3D-объекты в QVTKWidget с плохой прозрачностью

База: Debian 7.5 Wheezy 64 бит — Qt 5.3, установленный из Инсталлятора Онлайн; VTK 6.1 успешно скомпилирован и установлен вручную с поддержкой Qt.

Результат: 3D сфера отображается в окне 3D QVTK. На первый взгляд, все выглядит хорошо, но когда сфера вращается, несколько панелей и частей сферы становятся прозрачными.

Описание:

Попробовал основной официальный пример VTK для Qt:

В main.cpp:

#include <QApplication>

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

#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkImageViewer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkJPEGReader.h>
#include <QVTKWidget.h>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QVTKWidget widget;
widget.resize(256,256);

// Setup sphere
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> sphereMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> sphereActor =
vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper(sphereMapper);

// Setup window
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();

// Setup renderer
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderWindow->AddRenderer(renderer);

renderer->AddActor(sphereActor);
renderer->ResetCamera();

widget.SetRenderWindow(renderWindow);
widget.show();

return a.exec();
}

И значительно, RenderWindowUISingleInheritance дает тот же результат.


РЕШЕНИЕ

Окончательный код выглядит следующим образом:

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

#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkImageViewer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkJPEGReader.h>
#include <QVTKWidget.h>
#include <vtkProperty.h>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QVTKWidget widget;
widget.resize(256,256);

// Setup sphere
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> sphereMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> sphereActor =
vtkSmartPointer<vtkActor>::New();
sphereActor->GetProperty()->SetFrontfaceCulling(true);
sphereActor->SetMapper(sphereMapper);

// Setup window
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();

// Setup renderer
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderWindow->AddRenderer(renderer);

renderer->AddActor(sphereActor);
renderer->ResetCamera();

widget.SetRenderWindow(renderWindow);
widget.show();

return a.exec();
}

Обратите внимание на дополнения:

#include <vtkProperty.h>

а также

sphereActor->GetProperty()->SetFrontfaceCulling(true);

1

Решение

Похоже, выборка лицевой стороны отключена по умолчанию. Попробуйте добавить
sphereActor->GetProperty()->FrontfaceCullingOn();

3

Другие решения

Другой вариант, который, похоже, решает эту проблему прозрачности, — это использовать QVTKWidget2 вместо QVTKWidget.

1

По вопросам рекламы [email protected]