物体旋转起来,是相机位置发生变化,实现的,其实物体没有运动
代码如下所示
cone2.h
cpp
#ifndef CONE2_H
#define CONE2_H
#include <QWidget>
#include <QTimer>
#include <QDebug>
#include <QString>
#include <QTextBrowser>
#include "QVTKOpenGLNativeWidget.h" //新版本,旧版QVTKWidget
#include "vtkAutoInit.h"
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkCommand.h"
namespace Ui {
class Cone2;
}
// VTK回调类 vtkMyCallback
class vtkMyCallback : public vtkCommand
{
public:
// 静态工厂方法,用于创建类的实例
static vtkMyCallback *New()
{
return new vtkMyCallback; // 返回新创建的 vtkMyCallback 对象
}
// 重写 Execute 方法,当 VTK 事件触发时会被调用
void Execute(vtkObject *caller,unsigned long,void*) override;
// 指向 QTextBrowser 的指针,用于在 GUI 中显示文本
QTextBrowser *textBrowser = nullptr;
private:
};
class Cone2 : public QWidget
{
Q_OBJECT
public:
explicit Cone2(QWidget *parent = nullptr);
~Cone2();
void outputMessage(double temp);
private:
Ui::Cone2 *ui;
vtkConeSource *cone = nullptr; //声明椎体
vtkPolyDataMapper *coneMapper = nullptr; //声明映射器
vtkActor *coneActor = nullptr; //声明Actor
vtkRenderer *coneRender = nullptr; //声明渲染器
QTimer *rotationTimer = nullptr; //声明定时器,用于旋转椎体
vtkMyCallback *myCallBack = nullptr;
};
#endif // CONE2_H
cone2.h
cpp
#include "cone2.h"
#include "ui_cone2.h"
Cone2::Cone2(QWidget *parent) :
QWidget(parent),
ui(new Ui::Cone2)
{
ui->setupUi(this);
cone = vtkConeSource::New(); //新建对象
cone->SetHeight(3.0); //设置高度
cone->SetRadius(1.0); //设置半径
cone->SetResolution(10000000); //翻译为设置分辨率,不过实际应该不是
coneMapper = vtkPolyDataMapper::New(); //新建映射器
coneMapper->SetInputConnection(cone->GetOutputPort()); //设置Cone输出coneMapper数据输入
//新建Actor,并设置映射器
coneActor = vtkActor::New();
coneActor->SetMapper(coneMapper);
//新建渲染器并设置Actor和背景颜色
coneRender = vtkRenderer::New();
coneRender->AddActor(coneActor);
coneRender->SetBackground(0.1,0.2,0.3);
// 添加CallBack事件回调函数,添加到coneRender渲染器中
myCallBack = vtkMyCallback::New();
myCallBack->textBrowser = ui->textBrowser;
coneRender->AddObserver(vtkCommand::StartEvent,myCallBack);
//获取渲染窗口
ui->openGLWidget->renderWindow()->AddRenderer(coneRender);
// while (1) {
// ui->widget->GetRenderWindow()->Render();
// coneRender->GetActiveCamera()->Azimuth(1);
// }
//旋转椎体 每秒触发40次,每次旋转一个角度
rotationTimer = new QTimer();
connect(rotationTimer,&QTimer::timeout,this,[=](){
coneRender->GetActiveCamera()->Azimuth(1);
ui->openGLWidget->renderWindow()->Render(); //注意这句话,要加上呀,不然人不给你转,惰性渲染。
});
rotationTimer->start(25);
}
Cone2::~Cone2()
{
rotationTimer->stop();
delete ui;
}
// 这个回调函数监听相机位置变化,每当用户与3D视图交互(旋转、平移等)时,
// 就会触发执行,将当前的相机坐标输出到UI中,帮助开发者或用户了解当前的观察视角。
void vtkMyCallback::Execute(vtkObject *caller, unsigned long, void *)
{
vtkRenderer *renderer = reinterpret_cast<vtkRenderer*>(caller);
textBrowser->append("Camera Position:");
// 分别输出X、Y、Z坐标
textBrowser->append(QString::number((renderer->GetActiveCamera()->GetPosition()[0]),'g',6)); // X坐标
textBrowser->append(QString::number((renderer->GetActiveCamera()->GetPosition()[1]),'g',6)); // Y坐标
textBrowser->append(QString::number((renderer->GetActiveCamera()->GetPosition()[2]),'g',6)); // Z坐标
}