国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【VTK】基于讀取出來(lái)的 STL 模型,當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),程序?qū)@取點(diǎn)擊位置的點(diǎn),顯示其坐標(biāo),并設(shè)置它為模型的旋轉(zhuǎn)原點(diǎn)

這篇具有很好參考價(jià)值的文章主要介紹了【VTK】基于讀取出來(lái)的 STL 模型,當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),程序?qū)@取點(diǎn)擊位置的點(diǎn),顯示其坐標(biāo),并設(shè)置它為模型的旋轉(zhuǎn)原點(diǎn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

知識(shí)不是單獨(dú)的,一定是成體系的。更多我的個(gè)人總結(jié)和相關(guān)經(jīng)驗(yàn)可查閱這個(gè)專(zhuān)欄:Visual Studio。

基于讀取出來(lái)的 STL 模型,實(shí)現(xiàn)當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),程序?qū)@取點(diǎn)擊位置的點(diǎn),顯示其坐標(biāo),并設(shè)置它為模型的旋轉(zhuǎn)原點(diǎn)。

詳細(xì)流程為:點(diǎn)擊 Select 按鈕,鼠標(biāo)具備選擇的功能。當(dāng)按下 Select Done 鼠標(biāo)刪除掉此功能。

【VTK】基于讀取出來(lái)的 STL 模型,當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),程序?qū)@取點(diǎn)擊位置的點(diǎn),顯示其坐標(biāo),并設(shè)置它為模型的旋轉(zhuǎn)原點(diǎn),Visual Studio,c++,計(jì)算機(jī)外設(shè),開(kāi)發(fā)語(yǔ)言


主要是通過(guò)兩個(gè)類(lèi)和一個(gè)函數(shù)來(lái)實(shí)現(xiàn)的:

  • class PointPickedSignal : public QObject
  • class MouseInteractorCommand : public vtkCommand
  • void A::on_pushButtonSelected_clicked()
  • void A::onPointPicked(double* pos)

下邊依次分析。

class PointPickedSignal : public QObject

class PointPickedSignal : public QObject
{
    Q_OBJECT
public:
    PointPickedSignal(QObject* parent = nullptr) : QObject(parent) {}

signals:
    void pointPicked(double* pos);
};

這個(gè)類(lèi)繼承自 QObject 類(lèi),用于實(shí)現(xiàn)一個(gè)名為 pointPicked 的 Qt 信號(hào),當(dāng)一個(gè)點(diǎn)被選中時(shí)發(fā)出該信號(hào)。這個(gè)信號(hào)將被用于通知其他對(duì)象選中的點(diǎn)的坐標(biāo)。

class MouseInteractorCommand : public vtkCommand

class MouseInteractorCommand : public vtkCommand
{
public:
    vtkTypeMacro(MouseInteractorCommand, vtkCommand);

    static MouseInteractorCommand* New()
    {
        return new MouseInteractorCommand;
    }

    virtual void Execute(vtkObject* caller, unsigned long eventId, void* vtkNotUsed(callData))
    {
        vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::SafeDownCast(caller);
        int* clickPos = interactor->GetEventPosition();

        vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();
        picker->SetTolerance(0.0005);

        if (picker->Pick(clickPos[0], clickPos[1], 0, interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()))
        {
            double* pos = picker->GetPickPosition();
            memcpy(pickedPoint, pos, sizeof(double) * 3);
            emit signal->pointPicked(pickedPoint);
        }
    }

    double pickedPoint[3];
    PointPickedSignal* signal; // this will emit the pointPicked signal when a point is picked
};

這個(gè)類(lèi)繼承自 vtkCommand 類(lèi),其功能是監(jiān)聽(tīng)鼠標(biāo)左鍵的點(diǎn)擊事件。當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),會(huì)觸發(fā) Execute 方法。在這個(gè)方法中,代碼首先從事件的發(fā)起者中獲取交互器,并從交互器中獲取點(diǎn)擊的位置。然后,它創(chuàng)建一個(gè) vtkCellPicker 對(duì)象并嘗試拾取點(diǎn)擊位置的點(diǎn)。如果成功拾取了一個(gè)點(diǎn),它將獲取該點(diǎn)的坐標(biāo),并使用 memcpy 將這些坐標(biāo)復(fù)制到 pickedPoint 數(shù)組中。最后,它發(fā)出 pointPicked 信號(hào),將選中的點(diǎn)的坐標(biāo)作為參數(shù)。

void A::on_pushButtonSelected_clicked()

void A::on_pushButtonSelected_clicked() {
    ui.textBrowser->insertPlainText("Button Clicked");

    PointPickedSignal* signal = new PointPickedSignal(this);
    
    vtkSmartPointer<MouseInteractorCommand> command = vtkSmartPointer<MouseInteractorCommand>::New();
    command->signal = signal;
    
    ui.qvtkWidget->interactor()->AddObserver(vtkCommand::LeftButtonPressEvent, command);

    QEventLoop loop;
    connect(signal, &PointPickedSignal::pointPicked, this, &A::onPointPicked);
    connect(signal, &PointPickedSignal::pointPicked, &loop, &QEventLoop::quit);
    loop.exec();

    onPointPicked(command->pickedPoint);
}

這個(gè)方法首先創(chuàng)建一個(gè) PointPickedSignal 對(duì)象和一個(gè) MouseInteractorCommand 對(duì)象。然后,它將 PointPickedSignal 對(duì)象賦值給 MouseInteractorCommand 對(duì)象的 signal 成員,然后將這個(gè) MouseInteractorCommand 對(duì)象添加為 QVTKWidget 對(duì)象的交互器的觀察者,這樣當(dāng)交互器收到左鍵按下事件時(shí),就會(huì)執(zhí)行 MouseInteractorCommand 對(duì)象的 Execute 方法。

然后,這個(gè)方法創(chuàng)建一個(gè) QEventLoop 對(duì)象并開(kāi)始執(zhí)行事件循環(huán)。在事件循環(huán)中,當(dāng) pointPicked 信號(hào)被發(fā)出時(shí),它將調(diào)用 A::onPointPicked() 方法,并結(jié)束事件循環(huán)。

void A::onPointPicked(double* pos)

void A::onPointPicked(double* pos) {
    ui.textBrowser->insertPlainText(QString("Point picked: %1 %2 %3\n").arg(pos[0]).arg(pos[1]).arg(pos[2]));
    ui.textBrowser->moveCursor(QTextCursor::End);
    mandibleActor->SetOrigin(pos);
}

當(dāng)這個(gè)方法被調(diào)用時(shí),它將在文本瀏覽器中顯示選中的點(diǎn)的坐標(biāo),并將這個(gè)點(diǎn)設(shè)置為模型的旋轉(zhuǎn)原點(diǎn)。

通過(guò)這種方式,當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),程序?qū)@取點(diǎn)擊位置的點(diǎn),顯示其坐標(biāo),并設(shè)置它為模型的旋轉(zhuǎn)原點(diǎn)。


完整版代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-628424.html

A.h

// A.h
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_A.h"

#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

#include <vtkCellPicker.h>
#include <vtkCommand.h>
#include <vtkObjectFactory.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRendererCollection.h>
#include <vtkPropPicker.h>
#include <QObject>

#include <qtimer.h>

class A : public QMainWindow
{
    Q_OBJECT

public:
    A(QWidget* parent = nullptr);
    ~A();

private slots:
    void on_pushButtonSelect_clicked();
    void on_pushButtonSelDone_clicked();
    void onPointPicked(double* pos);

    void rotate();

private:
    Ui::AClass ui;

    void initVTK();

    vtkSmartPointer<vtkActor> actor;
    vtkSmartPointer<vtkRenderer> renderer;
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow;

    QTimer* timer;
};

class PointPickedSignal : public QObject
{
    Q_OBJECT
public:
    PointPickedSignal(QObject* parent = nullptr) : QObject(parent) {}

signals:
    void pointPicked(double* pos);
};

class MouseInteractorCommand : public vtkCommand
{
public:
    vtkTypeMacro(MouseInteractorCommand, vtkCommand);

    static MouseInteractorCommand* New()
    {
        return new MouseInteractorCommand;
    }

    virtual void Execute(vtkObject* caller, unsigned long eventId, void* vtkNotUsed(callData))
    {
        vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::SafeDownCast(caller);
        int* clickPos = interactor->GetEventPosition();

        vtkSmartPointer<vtkCellPicker> picker = vtkSmartPointer<vtkCellPicker>::New();
        picker->SetTolerance(0.0005);

        if (picker->Pick(clickPos[0], clickPos[1], 0, interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()))
        {
            double* pos = picker->GetPickPosition();
            memcpy(pickedPoint, pos, sizeof(double) * 3);
            emit signal->pointPicked(pickedPoint);
        }
    }

    double pickedPoint[3];
    PointPickedSignal* signal; // this will emit the pointPicked signal when a point is picked
};

A.cpp

// A.cpp
#include "A.h"



A::A(QWidget* parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    // 配置 VTK 的初始設(shè)置
    initVTK();

    // 定時(shí)器,50ms 更新觸發(fā)一次 checkPositionChange()
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(rotate()));
    timer->start(100);
}

A::~A()
{
}

void A::initVTK()
{
    // 讀取 STL 文件
    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName("skull_50.stl"); // 請(qǐng)?zhí)鎿Q為你的 STL 文件路徑
    reader->Update();

    // 創(chuàng)建映射器和演員
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(reader->GetOutputPort());

    actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // 創(chuàng)建渲染器
    renderer = vtkSmartPointer<vtkRenderer>::New();
    // 添加演員到渲染器
    renderer->AddActor(actor);

    // 創(chuàng)建渲染窗口和渲染窗口交互器
    renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    // 添加到 qvtkWidget 控件中顯示
    ui.qvtkWidget->setRenderWindow(renderWindow);

}

void A::on_pushButtonSelect_clicked() {
    ui.textBrowser->insertPlainText("Select button clicked!\n");

    PointPickedSignal* signal = new PointPickedSignal(this);
    vtkSmartPointer<MouseInteractorCommand> command = vtkSmartPointer<MouseInteractorCommand>::New();
    command->signal = signal;
    ui.qvtkWidget->interactor()->AddObserver(vtkCommand::LeftButtonPressEvent, command);

    QEventLoop loop;
    connect(signal, &PointPickedSignal::pointPicked, this, &A::onPointPicked);
    connect(signal, &PointPickedSignal::pointPicked, &loop, &QEventLoop::quit);
    loop.exec();

    onPointPicked(command->pickedPoint);
}

void A::onPointPicked(double* pos) {
    ui.textBrowser->insertPlainText(QString("Point picked: %1 %2 %3\n").arg(pos[0]).arg(pos[1]).arg(pos[2]));
    ui.textBrowser->moveCursor(QTextCursor::End);
    actor->SetOrigin(pos);
}

void A::on_pushButtonSelDone_clicked() {
    ui.textBrowser->insertPlainText("Selection done, restore the default interactor style.\n");

    // 移除左鍵按下事件的觀察者
    ui.qvtkWidget->interactor()->RemoveObservers(vtkCommand::LeftButtonPressEvent);

    // 恢復(fù)默認(rèn)的交互器樣式。
    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    ui.qvtkWidget->interactor()->SetInteractorStyle(style);
}

void A::rotate()
{
    actor->RotateX(5);
    renderWindow->Render();
}

Ref.

  1. 骷髏3D打印3D模型

到了這里,關(guān)于【VTK】基于讀取出來(lái)的 STL 模型,當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)左鍵時(shí),程序?qū)@取點(diǎn)擊位置的點(diǎn),顯示其坐標(biāo),并設(shè)置它為模型的旋轉(zhuǎn)原點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • VTK——設(shè)置交互樣式上的鼠標(biāo)回調(diào)函數(shù)

    VTKPointPickerInteractorStyle是一個(gè)自定義的交互樣式類(lèi),它是VTK庫(kù)中vtkInteractorStyleTrackballCamera類(lèi)的子類(lèi)。VTK(Visualization Toolkit)是一個(gè)開(kāi)源的,跨平臺(tái)的庫(kù),用于處理、渲染和視覺(jué)化科學(xué)數(shù)據(jù)。它包括一系列的類(lèi)和方法用于3D計(jì)算機(jī)圖形、圖像處理和可視化。 vtkInteractorStyleTrackba

    2024年02月10日
    瀏覽(29)
  • open3d,讀取stl/ply/obj/off/gltf/glb三維模型,并轉(zhuǎn)換成點(diǎn)云,保存

    open3d,讀取stl/ply/obj/off/gltf/glb三維模型,并轉(zhuǎn)換成點(diǎn)云,保存

    可以自己用建模軟件建立一個(gè)模型 本案例使用模型的下載地址 可以從free3d免費(fèi)下載,無(wú)需注冊(cè) 效果: 效果: 均勻采樣會(huì)在表面出現(xiàn)采樣點(diǎn)聚集的現(xiàn)象,open3d實(shí)現(xiàn)了一種基于poisson_disk方法的采樣,能實(shí)現(xiàn)表面的均勻采樣 原理 :參數(shù)umber_of_points是最終采樣的點(diǎn)數(shù)量,實(shí)際會(huì)先

    2024年02月11日
    瀏覽(271)
  • VTK & QT QVTKWidget自定義鼠標(biāo)和鍵盤(pán)交互事件

    目錄 一、問(wèn)題描述 二、代碼實(shí)現(xiàn) 1. 自定義鼠標(biāo)交互事件 2. 移除默認(rèn)鼠標(biāo)交互監(jiān)聽(tīng)事件,塞入自定義監(jiān)聽(tīng)事件 在使用VTK顯示的過(guò)程中,通常會(huì)使用QT來(lái)進(jìn)行界面設(shè)計(jì)。這里通常使用QVTKWidget將VTK的渲染窗口顯示到QT的組件中。 QVTKWidget組件自帶交互器vtkRenderWindowInteractor和Rende

    2024年02月14日
    瀏覽(33)
  • 【FastCAE源碼閱讀5】使用VTK實(shí)現(xiàn)鼠標(biāo)拾取對(duì)象并高亮

    【FastCAE源碼閱讀5】使用VTK實(shí)現(xiàn)鼠標(biāo)拾取對(duì)象并高亮

    鼠標(biāo)拾取對(duì)象是很多軟件的基本功能。FastCAE的拾取比較簡(jiǎn)單,是通過(guò)VTK實(shí)現(xiàn)的。 對(duì)幾何而言,拾取類(lèi)型切換在工具欄上,單擊后再來(lái)單擊視圖區(qū)對(duì)象進(jìn)行拾取,拾取后的對(duì)象會(huì)高亮顯示。效果如下圖: 一、拾取對(duì)象 拾取對(duì)象是在PropPickerInteractionStyle類(lèi)實(shí)現(xiàn)的,該類(lèi)是vtkInt

    2024年02月02日
    瀏覽(30)
  • 【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

    【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

    最近在開(kāi)發(fā)過(guò)程中遇到了這樣的問(wèn)題: 在醫(yī)學(xué)圖像開(kāi)發(fā)過(guò)程中,我們將醫(yī)學(xué)圖像通過(guò) 深度學(xué)習(xí) 算法進(jìn)行分割,現(xiàn)在想要 通過(guò)這一套二維圖像進(jìn)行三維重構(gòu) 。 以下是分割結(jié)果: 圖一:前列腺核磁圖像分割結(jié)果 圖一:前列腺核磁圖像分割結(jié)果 圖一:前列腺核磁圖像分割結(jié)果

    2024年02月01日
    瀏覽(25)
  • 基于Vue3實(shí)現(xiàn)鼠標(biāo)按下某個(gè)元素進(jìn)行移動(dòng),實(shí)時(shí)改變左側(cè)或右側(cè)元素的寬度,以及點(diǎn)擊收起或展開(kāi)的功能

    基于Vue3實(shí)現(xiàn)鼠標(biāo)按下某個(gè)元素進(jìn)行移動(dòng),實(shí)時(shí)改變左側(cè)或右側(cè)元素的寬度,以及點(diǎn)擊收起或展開(kāi)的功能

    其原理主要是利用JavaScript中的鼠標(biāo)事件來(lái)控制CSS樣式。大致就是監(jiān)聽(tīng)某個(gè)DOM元素的鼠標(biāo)按下事件,以及按下之后的移動(dòng)事件和松開(kāi)事件。在鼠標(biāo)按下且移動(dòng)過(guò)程中,可實(shí)時(shí)獲得鼠標(biāo)的X軸坐標(biāo)的值,通過(guò)簡(jiǎn)單計(jì)算,可計(jì)算出目標(biāo)元素的寬度,然后再用CSS賦值就實(shí)現(xiàn)該效果了。

    2024年02月15日
    瀏覽(28)
  • 基于Vue3實(shí)現(xiàn)鼠標(biāo)按下某個(gè)元素進(jìn)行拖動(dòng),實(shí)時(shí)改變左側(cè)或右側(cè)元素的寬度,以及點(diǎn)擊收起或展開(kāi)的功能

    基于Vue3實(shí)現(xiàn)鼠標(biāo)按下某個(gè)元素進(jìn)行拖動(dòng),實(shí)時(shí)改變左側(cè)或右側(cè)元素的寬度,以及點(diǎn)擊收起或展開(kāi)的功能

    其原理主要是利用JavaScript中的鼠標(biāo)事件來(lái)控制CSS樣式。大致就是監(jiān)聽(tīng)某個(gè)DOM元素的鼠標(biāo)按下事件,以及按下之后的移動(dòng)事件和松開(kāi)事件。在鼠標(biāo)按下且移動(dòng)過(guò)程中,可實(shí)時(shí)獲得鼠標(biāo)的X軸坐標(biāo)的值,通過(guò)簡(jiǎn)單計(jì)算,可計(jì)算出目標(biāo)元素的寬度,然后再用CSS賦值就實(shí)現(xiàn)該效果了。

    2024年02月12日
    瀏覽(27)
  • python VTK PyQt5 VTK環(huán)境搭建 創(chuàng)建 渲染窗口及三維模型,包含 三維模型交互;

    python VTK PyQt5 VTK環(huán)境搭建 創(chuàng)建 渲染窗口及三維模型,包含 三維模型交互;

    ? 目錄 Part1. VTK 介紹 Part2. PyQt5 VTK環(huán)境搭建 安裝Anaconda 自帶Python Anaconda下載 安裝PyQt5 安裝 VTK Part3 :PyQt VTK 結(jié)合樣例: Part1. VTK 介紹 VTK(visualization toolkit)是一個(gè)開(kāi)源的免費(fèi)軟件系統(tǒng),主要用于三維計(jì)算機(jī)圖形學(xué)、圖像處理和可視化。Vtk 是在面向?qū)ο笤淼幕A(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)的

    2024年02月11日
    瀏覽(54)
  • NIPS2022|南京大學(xué)提出基于點(diǎn)擊后行為的廣義延遲反饋模型

    NIPS2022|南京大學(xué)提出基于點(diǎn)擊后行為的廣義延遲反饋模型

    Generalized Delayed Feedback Model with Post-Click Information in Recommender Systems Jia-Qi Yang De-Chuan Zhan Nanjing University https://proceedings.neurips.cc/paper_files/paper/2022/file/a7f90da65dd41d699d00e95700e6fa1e-Paper-Conference.pdf 轉(zhuǎn)化率預(yù)估(比如預(yù)測(cè)某個(gè)用戶(hù)購(gòu)買(mǎi)某個(gè)商品的概率)在機(jī)器學(xué)習(xí)推薦系統(tǒng)中是一個(gè)基本問(wèn)

    2024年02月05日
    瀏覽(99)
  • VTK————3D模型的旋轉(zhuǎn)、交互、透明度設(shè)置

    旋轉(zhuǎn)模型的話(huà)可以用到以下例程,但是每次設(shè)置選擇坐標(biāo)時(shí),都是累加的。可以通過(guò)SetOrientation來(lái)將模型方向設(shè)為初試方向。如果三個(gè)坐標(biāo)都使用較大值來(lái)進(jìn)行旋轉(zhuǎn),那么由于累加的特性。模型會(huì)在空間內(nèi)進(jìn)行大幅度的旋轉(zhuǎn)和位移,這是需要注意的。 也可以通過(guò)設(shè)置interacto

    2024年02月10日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包