【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坐标
}
相关推荐
划水的code搬运工小李7 小时前
Xacro添加传感器模型(三)- 添加摄像头传感器
数码相机
双翌视觉7 小时前
机器视觉之眼:彩色相机的成像效果与预处理技术解析
人工智能·数码相机·机器学习
柳鲲鹏2 天前
相机镜头对焦:现在常用对焦方法
数码相机
ScilogyHunter2 天前
Camera Link技术深度解析
数码相机·camera link
柳鲲鹏2 天前
相机镜头对焦:主动式对焦
数码相机
寺中人2 天前
blackmagic camera(相机)
数码相机·相机软件
Liangomy2 天前
FAST-Calib 激光雷达与相机联合标定教程 (Docker版)
数码相机·docker·容器
柳鲲鹏2 天前
相机镜头对焦:被动式自动对焦,对比度检测自动对焦
数码相机
柳鲲鹏2 天前
相机镜头对焦:被动式自动对焦,相位检测自动对焦
数码相机