简体   繁体   English

VTK 6.1和Qt 5.3:QVTKWidget中的3D对象具有不透明性

[英]VTK 6.1 and Qt 5.3: 3D Objects in QVTKWidget with bad transparencies

Base: Debian 7.5 Wheezy 64 bits - Qt 5.3 installed from Online Installer; 基础: Debian 7.5 Wheezy 64位-从Online Installer安装的Qt 5.3; VTK 6.1 successfully compiled and installed manually with Qt support. VTK 6.1成功编译并通过Qt支持手动安装。

Result: A 3D sphere is displayed in a 3D QVTK window. 结果: 3D球体显示在3D QVTK窗口中。 At first glance, It looks OK, but when sphere is rotated, several panels and parts of the sphere become transparent. 乍一看,看起来不错,但是当球体旋转时,球体的多个面板和部分将变为透明。

Description: 描述:

Tried the basic official example of VTK for Qt: 为Qt尝试了VTK的基本官方示例:

In main.cpp: 在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();
}

And significantly, RenderWindowUISingleInheritance gives same result. 重要的是,RenderWindowUISingleInheritance给出了相同的结果。


SOLUTION

The final code stands as follows: 最终代码如下:

#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();
}

Note the additions of: 请注意以下内容:

#include <vtkProperty.h>

and

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

Looks like Frontface culling is off by default. 看起来Frontface剔除默认情况下处于关闭状态。 Try adding sphereActor->GetProperty()->FrontfaceCullingOn(); 尝试添加sphereActor->GetProperty()->FrontfaceCullingOn();

似乎可以解决此透明性问题的另一个选项是使用QVTKWidget2而不是QVTKWidget。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM