[英]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.