ShareCameraQt 演示了如何让另外一个窗口与第一个窗口共享一样的摄像机视角,
关键代码如下
#if VTK890
this->ui->qvtkWidgetLeft->renderWindow()->AddObserver(vtkCommand::ModifiedEvent, this, &ShareCameraQt::ModifiedHandler);
#else
this->ui->qvtkWidgetLeft->GetRenderWindow()->AddObserver(vtkCommand::ModifiedEvent, this, &ShareCameraQt::ModifiedHandler);
#endif
因此,只有鼠标拖动左侧圆球,才会让右边的立方体与左侧同步转动。如果拖动右侧的立方体,左侧的是不会动的。
有个疑问,为什么每次都是鼠标释放后,右侧才同步,不能立刻响应。
#include <QApplication>
#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>
#include ShareCameraQt.h
//下面的原来没有,但是我用vtk9,必须加上去,其他版本不知道
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
int main( int argc, char** argv )
{
// needed to ensure appropriate OpenGL context is created for VTK rendering.
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
// QT Stuff
QApplication app( argc, argv );
ShareCameraQt shareCameraQt;
shareCameraQt.show();
return app.exec();
}
#ifndef ShareCameraQt_H
#define ShareCameraQt_H
#include <QMainWindow>
/*
* See The Single Inheritance Approach in this link:
* [Using a Designer UI File in Your C++
* Application](https://doc.qt.io/qt-5/designer-using-a-ui-file.html)
*/
namespace Ui {
class ShareCameraQt;
}
class ShareCameraQt : public QMainWindow
{
Q_OBJECT
public:
// Constructor/Destructor
explicit ShareCameraQt(QWidget* parent = nullptr);
virtual ~ShareCameraQt() = default;
private:
// Designer form
Ui::ShareCameraQt *ui;
public slots:
void slotExit();
protected:
void ModifiedHandler();
};
#endif
#include ShareCameraQt.h
#include ui_ShareCameraQt.h
#include <vtkCamera.h>
#include <vtkCommand.h>
#include <vtkCubeSource.h>
#include <vtkDataObjectToTable.h>
#include <vtkElevationFilter.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkQtTableView.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkVersion.h>
#if VTK_VERSION_NUMBER >= 89000000000ULL
#define VTK890 1
#endif
// Constructor
ShareCameraQt::ShareCameraQt(QWidget* parent)
: QMainWindow(parent), ui(new Ui::ShareCameraQt)
{
this->ui->setupUi(this);
vtkNew<vtkNamedColors> colors;
vtkNew<vtkGenericOpenGLRenderWindow> renderWindowLeft;
vtkNew<vtkGenericOpenGLRenderWindow> renderWindowRight;
#if VTK890
this->ui->qvtkWidgetLeft->setRenderWindow(renderWindowLeft);
this->ui->qvtkWidgetRight->setRenderWindow(renderWindowRight);
#else
this->ui->qvtkWidgetLeft->SetRenderWindow(renderWindowLeft);
this->ui->qvtkWidgetRight->SetRenderWindow(renderWindowRight);
#endif
// Sphere
vtkNew<vtkSphereSource> sphereSource;
sphereSource->Update();
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(colors->GetColor4d(Tomato).GetData());
// Cube
vtkNew<vtkCubeSource> cubeSource;
cubeSource->Update();
vtkNew<vtkPolyDataMapper> cubeMapper;
cubeMapper->SetInputConnection(cubeSource->GetOutputPort());
vtkNew<vtkActor> cubeActor;
cubeActor->SetMapper(cubeMapper);
cubeActor->GetProperty()->SetColor(colors->GetColor4d(MediumSeaGreen).GetData());
// VTK Renderer
vtkNew<vtkRenderer> leftRenderer;
leftRenderer->AddActor(sphereActor);
leftRenderer->SetBackground(colors->GetColor3d(LightSteelBlue).GetData());
vtkNew<vtkRenderer> rightRenderer;
// Add Actor to renderer
rightRenderer->AddActor(cubeActor);
rightRenderer->SetBackground(colors->GetColor3d(LightSteelBlue).GetData());
// VTK/Qt wedded
#if VTK890
this->ui->qvtkWidgetLeft->renderWindow()->AddRenderer(leftRenderer);
this->ui->qvtkWidgetRight->renderWindow()->AddRenderer(rightRenderer);
#else
this->ui->qvtkWidgetLeft->GetRenderWindow()->AddRenderer(leftRenderer);
this->ui->qvtkWidgetRight->GetRenderWindow()->AddRenderer(rightRenderer);
#endif
rightRenderer->ResetCamera();
leftRenderer->ResetCamera();
// Here we share the camera
rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());
// Position the cube using the left renderer active camera
leftRenderer->GetActiveCamera()->SetPosition(1.0, 0.8, 1.0);
leftRenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
leftRenderer->ResetCamera();
leftRenderer->GetActiveCamera()->Zoom(0.8);
// Set up action signals and slots
connect(this->ui->actionExit, SIGNAL(triggered()), this, SLOT(slotExit()));
#if VTK890
this->ui->qvtkWidgetLeft->renderWindow()->AddObserver(vtkCommand::ModifiedEvent, this, &ShareCameraQt::ModifiedHandler);
#else
this->ui->qvtkWidgetLeft->GetRenderWindow()->AddObserver(vtkCommand::ModifiedEvent, this, &ShareCameraQt::ModifiedHandler);
#endif
}
void ShareCameraQt::ModifiedHandler()
{
#if VTK890
this->ui->qvtkWidgetRight->renderWindow()->Render();
#else
this->ui->qvtkWidgetRight->GetRenderWindow()->Render();
#endif
}
void ShareCameraQt::slotExit()
{
qApp->exit();
}
<?xml version=1.0 encoding=UTF-8?>
<ui version=4.0>
<class>ShareCameraQt</class>
<widget class=QMainWindow name=ShareCameraQt>
<property name=geometry>
<rect>
<x>0</x>
<y>0</y>
<width>990</width>
<height>583</height>
</rect>
</property>
<property name=windowTitle>
<string>ShareCameraQt</string>
</property>
<property name=windowIcon>
<iconset>
<normaloff>:/Icons/help.png</normaloff>:/Icons/help.png</iconset>
</property>
<property name=iconSize>
<size>
<width>22</width>
<height>22</height>
</size>
</property>
<widget class=QWidget name=centralwidget>
<widget class=QVTKOpenGLNativeWidget name=qvtkWidgetLeft native=true>
<property name=geometry>
<rect>
<x>10</x>
<y>20</y>
<width>511</width>
<height>541</height>
</rect>
</property>
</widget>
<widget class=QVTKOpenGLNativeWidget name=qvtkWidgetRight native=true>
<property name=geometry>
<rect>
<x>540</x>
<y>20</y>
<width>441</width>
<height>541</height>
</rect>
</property>
</widget>
</widget>
<action name=actionOpenFile>
<property name=enabled>
<bool>true</bool>
</property>
<property name=icon>
<iconset>
<normaloff>:/Icons/fileopen.png</normaloff>:/Icons/fileopen.png</iconset>
</property>
<property name=text>
<string>Open File...</string>
</property>
</action>
<action name=actionExit>
<property name=icon>
<iconset>
<normaloff>.</normaloff>.</iconset>
</property>
<property name=text>
<string>Exit</string>
</property>
</action>
<action name=actionPrint>
<property name=icon>
<iconset>
<normaloff>:/Icons/print.png</normaloff>:/Icons/print.png</iconset>
</property>
<property name=text>
<string>Print</string>
</property>
</action>
<action name=actionHelp>
<property name=icon>
<iconset>
<normaloff>:/Icons/help.png</normaloff>:/Icons/help.png</iconset>
</property>
<property name=text>
<string>Help</string>
</property>
</action>
<action name=actionSave>
<property name=icon>
<iconset>
<normaloff>:/Icons/filesave.png</normaloff>:/Icons/filesave.png</iconset>
</property>
<property name=text>
<string>Save</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>QVTKOpenGLNativeWidget</class>
<extends>QWidget</extends>
<header>QVTKOpenGLNativeWidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>