VTK 学习笔记(七)ShareCameraQt

22 篇文章 16 订阅

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>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值