【VTK 】 02 锥体旋转起来获取到相机位置

物体旋转起来,是相机位置发生变化,实现的,其实物体没有运动

代码如下所示

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坐标
}
相关推荐
格林威3 小时前
网口相机 vs USB相机:区别与适用场景(选型不再纠结)
人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉·工业相机
大雷神5 小时前
HarmonyOS 6.1 新能力实战:用“双镜记忆相机”把照片、地点与人重新连起来
数码相机·华为·harmonyos
2601_962502906 小时前
竹席非平面基材点胶点钻设备:地形补偿与动态控胶的工程实现
数码相机
2zcode2 天前
基于MATLAB图像处理的金属表面缺陷检测与工业量测系统设计与实现
图像处理·数码相机·matlab
sali-tec2 天前
C# 基于OpenCv的视觉工作流-章93-YOLO手部姿态
图像处理·人工智能·数码相机·opencv·yolo·计算机视觉
24计网1王仔寿3 天前
Linux运维与云计算全栈系统化学习指南(Shell+虚拟化+OpenStack+Docker+公私云实战)
linux·课程设计·数据库开发·微信公众平台·neo4j·命令模式·sequoiadb
取个名字太难了~3 天前
从通用到专用:影像 SDK 的场景化封装与垂直行业落地实践
android·数码相机·美颜·相机连接·demu
私人珍藏库4 天前
[Android] Doka相机-AI摄影构图质感滤镜
人工智能·数码相机
胖咕噜的稞达鸭21 天前
如何写好一个skill
人工智能·数码相机
Hello-FPGA21 天前
CameraLink相机模拟器 信号源加速激光雷达系统算法开发
数码相机