三維控件中定位一個點_vtkPointWidget


開發環境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example
  5. 參考代碼

demo解決問題:允許用戶使用三維光標在三維空間中定位一個點。關鍵類vtkPointWidget , 光標具有輪廓邊界框、軸對齊十字準線和軸陰影(輪廓和陰影可以關閉)。(可以關閉輪廓和陰影)。vtkPointWidget 和其他 3D widget 一樣,具有一個很好的特點,即它可以與當前的交互樣式一起工作。也就是說,如果 vtkPointWidget 沒有處理事件,那么所有其他已注冊的觀察者(包括交互樣式)都有機會處理該事件。否則,vtkPointWidget 將終止處理它所處理的事件。

在這里插入圖片描述

主流程:(不看probe)

  1. 數據源1:構造一個網格化的sphereSource數據源
  2. 數據源2:point的位置使用cone符號化為圓錐體
  3. 數據源3:添加一個AddActor2D,固定在視口左下角
  4. 數據源4:構造3D控件pointWidget,并添加觀察者myCallback,監控pointWidget交互事件

注意:point符號化的過程中,一開始是沒有符號的,所以圓錐體一開始不顯示,交互時間開始后設置了point的值,點背符號化后有了圓錐體,Execute中關鍵代碼:

//獲取定義該點的多邊形數據(包括點)。單個點和一個頂點組成 vtkPolyData。
pointWidget->GetPolyData(this->PolyData);//給this->PolyData / point 賦值,在多個管道中間中途修改值,修改后update修改過的管道,render
this->PositionActor->SetInput(text.str().c_str());

glyph的輸入我把probefilter刪了,直接用point數據,也是可以相同效果的,目前沒有明白為什么要加一個vtkProbeFilter,理解的幫解答下,謝謝拉!!!

另一個需要重點關注的是需要區分以下接口接口

  vtkNew<vtkProbeFilter> probe;//指定一個數據對象作為輸入。請注意,此方法不會建立管道連接。使用 SetInputConnection() 來 建立管道連接。probe->SetInputData(point);//輸入: 此時的point值為空,需要事件內根據鼠標位置進行賦值//指定將在輸入點進行探測的數據集。 //輸入為輸出提供幾何圖形(點和單元)、 而源點則通過探測(插值)生成標量、 矢量等。probe->SetSourceData(inputPolyData);//源: 

參考鏈接1
參考鏈接2
參考鏈接3

  vtkNew<vtkGlyph3D> glyph;// glyph->SetInputConnection(probe->GetOutputPort());//???不理解glyph->SetInputData(point); //此處直接使用point也可以達到效果,但是為什么非要用vtkProbeFilter 沒有想通glyph->SetSourceConnection(cone->GetOutputPort());

參考鏈接1
參考鏈接2


prj name: Arbitrary3DCursor

#include <vtkActor.h>
#include <vtkCallbackCommand.h>
#include <vtkCommand.h>
#include <vtkConeSource.h>
#include <vtkGlyph3D.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointWidget.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProbeFilter.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkXMLPolyDataReader.h>#include <iostream>
#include <sstream>
#include <string>// This does the actual work: updates the probe.
// Callback for the interaction.
class vtkmyPWCallback : public vtkCallbackCommand
{
public:vtkmyPWCallback() = default;static vtkmyPWCallback* New(){return new vtkmyPWCallback;}virtual void Execute(vtkObject* caller, unsigned long, void*){vtkPointWidget* pointWidget = reinterpret_cast<vtkPointWidget*>(caller);//獲取定義該點的多邊形數據(包括點)。單個點和一個頂點組成 vtkPolyData。pointWidget->GetPolyData(this->PolyData);//給this->PolyData / point 賦值,在多個管道中間中途修改值,修改后update修改過的管道,renderdouble position[3];pointWidget->GetPosition(position);std::ostringstream text;text << "cursor: " << std::fixed << std::setprecision(4) << position[0]<< ", " << position[1] << ", " << position[2];this->PositionActor->SetInput(text.str().c_str());// this->CursorActor->VisibilityOn();std::cout << PolyData->GetNumberOfCells() << std::endl;std::cout << PolyData->GetNumberOfPoints() << std::endl;std::cout << PolyData->GetNumberOfPolys() << std::endl;}vtkPolyData* PolyData = nullptr;      //與傳入的錐形有關//vtkActor* CursorActor = nullptr;    //可以不需要,如果需要控制顯示隱藏狀態,可以傳入vtkTextActor* PositionActor = nullptr;//實時顯示坐標狀態
};int main(int argc, char* argv[])
{vtkSmartPointer<vtkPolyData> inputPolyData;if (argc > 1){vtkNew<vtkXMLPolyDataReader> reader;reader->SetFileName(argv[1]);reader->Update();inputPolyData = reader->GetOutput();}else{vtkNew<vtkSphereSource> sphereSource;sphereSource->SetPhiResolution(15);sphereSource->SetThetaResolution(15);sphereSource->Update();inputPolyData = sphereSource->GetOutput();}vtkNew<vtkNamedColors> colors;vtkNew<vtkPolyData> point;//https://blog.csdn.net/liushao1031177/article/details/122860254//https://blog.csdn.net/yuyangyg/article/details/78165570//https://www.cnblogs.com/ankier/p/3166210.html/*在指定點位置采樣數據值vtkProbeFilter 是一個過濾器,用于計算指定點位置的點屬性(如標量、矢量等)。該過濾器有兩個輸入:輸入和源。輸入的幾何結構通過過濾器。通過對源數據進行插值,在輸入點位置計算出點屬性。例如,我們可以根據體積(源數據)計算平面(指定為輸入的平面)上的數據值。源數據的單元格數據會根據每個輸入點所在的源單元格復制到輸出端。如果源點數據和單元格數據中都存在同名數組,則只探查點數據中的數組。該過濾器可用于重新采樣數據,或將一種數據集形式轉換為另一種數據集形式。例如,非結構化網格(vtkUnstructuredGrid)可以用體積(三維 vtkImageData)進行探測,然后使用體積渲染技術將結果可視化。另一個例子:可以使用一條直線或曲線來探測數據,以生成沿該直線或曲線的 x-y 圖。警告vtkProbeFilter 的一個關鍵算法組件是其查找包含探測點的單元格的方式。默認情況下,vtkDataSet::FindCell() 方法會被使用,該方法反過來使用 vtkPointLocator 來執行加速搜索。不過,在某些情況下,使用 vtkPointLocator 可能無法識別包圍單元格。更穩健但更慢的方法是使用 vtkCellLocator 執行 FindCell() 操作(通過指定 CellLocatorPrototype)。最后,可以通過指定 vtkFindCellStrategy 的實例來配置更高級的搜索。(注意:圖像數據探測從不使用定位器,因為查找包含的單元格是一個簡單、快速的操作。因此指定 vtkFindCellStrategy 或單元格定位器原型沒有任何作用)。vtkProbeFilter 一旦找到包含查詢點的單元格,就會使用單元格的插值函數來執行插值/計算點屬性。vtkPointInterpolator 支持多種廣義內核,而 vtkSPHInterpolator 則支持多種 SPH 內核。*/vtkNew<vtkProbeFilter> probe;//指定一個數據對象作為輸入。請注意,此方法不會建立管道連接。使用 SetInputConnection() 來 建立管道連接。probe->SetInputData(point);//輸入: 此時的point值為空,需要事件內根據鼠標位置進行賦值//指定將在輸入點進行探測的數據集。 //輸入為輸出提供幾何圖形(點和單元)、 而源點則通過探測(插值)生成標量、 矢量等。probe->SetSourceData(inputPolyData);//源: std::cout << point->GetNumberOfCells() << std::endl;std::cout << point->GetNumberOfPoints() << std::endl;std::cout << point->GetNumberOfPolys() << std::endl;// Create glyph.vtkNew<vtkConeSource> cone;cone->SetResolution(30);//https://blog.csdn.net/jigetage/article/details/86633156//https://www.cnblogs.com/vaughnhuang/p/17584058.htmlvtkNew<vtkGlyph3D> glyph;// glyph->SetInputConnection(probe->GetOutputPort());//???不理解glyph->SetInputData(point); //此處直接使用point也可以達到效果,但是為什么非要用vtkProbeFilter 沒有想通glyph->SetSourceConnection(cone->GetOutputPort());glyph->SetVectorModeToUseVector();glyph->SetScaleModeToDataScalingOff();glyph->SetScaleFactor(inputPolyData->GetLength() * 0.1);vtkNew<vtkPolyDataMapper> glyphMapper;glyphMapper->SetInputConnection(glyph->GetOutputPort());vtkNew<vtkActor> glyphActor;glyphActor->SetMapper(glyphMapper);glyphActor->VisibilityOn();//point為空,沒有glyph顯示vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputData(inputPolyData);vtkNew<vtkActor> actor;actor->SetMapper(mapper);actor->GetProperty()->SetRepresentationToWireframe();actor->GetProperty()->SetColor(colors->GetColor3d("gold").GetData());vtkNew<vtkTextActor> textActor;textActor->GetTextProperty()->SetFontSize(12);textActor->SetPosition(10, 20);textActor->SetInput("cursor:");textActor->GetTextProperty()->SetColor(colors->GetColor3d("White").GetData());// Create the RenderWindow, Render1er and both Actors.vtkNew<vtkRenderer> ren1;vtkNew<vtkRenderWindow> renWin;renWin->AddRenderer(ren1);vtkNew<vtkRenderWindowInteractor> iren;iren->SetRenderWindow(renWin);// The SetInteractor method is how 3D widgets are associated with the render// window interactor. Internally, SetInteractor sets up a bunch of callbacks// using the Command/Observer mechanism (AddObserver()).vtkNew<vtkmyPWCallback> myCallback;myCallback->PolyData = point;//myCallback->PolyData = inputPolyData;//myCallback->CursorActor = glyphActor;myCallback->PositionActor = textActor;// The point widget is used probe the dataset.vtkNew<vtkPointWidget> pointWidget;pointWidget->SetInteractor(iren);pointWidget->SetInputData(inputPolyData);//指定移動范圍pointWidget->AllOff();pointWidget->PlaceWidget();pointWidget->AddObserver(vtkCommand::InteractionEvent, myCallback);ren1->AddActor(glyphActor);ren1->AddActor(actor);ren1->AddActor2D(textActor);//2D actor// Add the actors to the renderer, set the background and size.ren1->GradientBackgroundOn();ren1->SetBackground(colors->GetColor3d("SlateGray").GetData());ren1->SetBackground2(colors->GetColor3d("Wheat").GetData());renWin->SetSize(300, 300);renWin->SetWindowName("Arbitrary3DCursor");renWin->Render();pointWidget->On();// Render the imageiren->Initialize();renWin->Render();iren->Start();return EXIT_SUCCESS;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160754.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AD7021C 觸摸感應加燈光調節芯片IC 可用于觸摸臺燈、觸摸玩具燈等

AD7021C觸摸感應 IC 是為實現人體觸摸界面而設計的集成電路。可替代機械式輕觸按鍵&#xff0c;實現防水防塵、密封隔離、堅固美觀的操作界面。使用該芯片可以實現 LED 燈光亮度調節&#xff0c;方案所需的外圍電路簡單&#xff0c;操作方便。確定好靈敏度選擇電容&#xff…

【華為OD題庫-033】經典屏保-java

題目 DVD機在視頻輸出時&#xff0c;為了保護電視顯像管&#xff0c;在待機狀態會顯示"屏保動畫”&#xff0c;如下圖所示,DVD Logo在屏幕內來回運動&#xff0c;碰到邊緣會反彈:請根據如下要求&#xff0c;實現屏保Logo坐標的計算算法 1、屏幕是一個800 * 600像素的矩形&…

Vue3 provide 和 inject 實現祖組件和后代組件通信

provide 和 inject 能夠實現祖組件和其任意的后代組件之間通信&#xff1a; 一、provide 提供數據 我們在祖組件中使用provide 將數據提供出去。 使用provide 之前需要先進行引入&#xff1a; import { provide } from "vue"; 語法格式如下&#xff1a; provide(&q…

objectarx + libcurl下載文件遇到的問題

下載失敗導致cad崩潰,報錯’Error handler re-entered.Exiting now ,原因是因為我將libcurl相關的功能繼承到一個類中,在類中進行相關的webapi交互,但是由于最開始進行了請求所以沒有將curl進行初始化導致的傳遞數據錯誤.只需要在函數開始時進行初始化即可. curl curl_easy_i…

山西電力市場日前價格預測【2023-11-23】

日前價格預測 預測說明&#xff1a; 如上圖所示&#xff0c;預測明日&#xff08;2023-11-23&#xff09;山西電力市場全天平均日前電價為148.77元/MWh。其中&#xff0c;最高日前電價為420.40元/MWh&#xff0c;預計出現在18:00。最低日前電價為0.00元/MWh&#xff0c;預計出…

微信小程序開發學習——頁面布局、初始導航欄與跳轉

1.盒模型 要求實現效果如圖所示&#xff1a; 所有WXML元素都可以看作盒子&#xff0c;在WXSS中"box model”這一術語是用來設計和布局時使用盒模型本質上是一個盒子&#xff0c;封裝周圍的WXML元素它包括: 邊距&#xff0c;邊框&#xff0c;填充和實際內容&#xff0c;模…

【Java并發編程十一】同步控制三

LockSupport 線程阻塞工具 LockSupport的unpark() 方法可以先執行。 import java.util.ArrayList; import java.util.Random; import java.util.concurrent.*; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.LockSupport; import java.uti…

RAW RGB YUV數據差異

目錄 顏色與色彩空間 RAW圖像 RGB圖像 YUV圖像 顏色與色彩空間 顏色 顏色是人眼感知到的現象&#xff0c;它是由光波的頻率和強度所決定的&#xff0c;僅僅存在于人的眼睛和大腦中&#xff0c;因此為了方便描述顏色&#xff0c;引入了色彩空間。色彩空間 色彩空間&#xff…

C語言--數組與指針--打印字符串的n種方式

一.知識背景 一維數組名的含義 arr一般表示數組的起始地址&#xff08;除了兩種例外&#xff09; 1.在定義數組的同一個函數中(不是形參),求sizeof(arr),求整個數組的字節數 2.在定義數組的同一個函數中(不是形參),&arr1,加整個數組的大小 (經常考試) 3.除上面以外,arr都表…

和鯨 × 暨大經管:高效 SAAS 服務持續賦能交叉學科應用型數據人才培養

隨著新一輪科技革命與產業變革的加速演進&#xff0c;擁有學科背景的應用型數據科學人才逐漸成為我國政產學研各界的人力資源需求重點。為響應需求&#xff0c;國家愈發重視新生力量數據思維與意識的培養&#xff0c;各高校也紛紛探索如何以新興信息技術賦能傳統主流學科。 在…

達索系統SOLIDWORKS流體分析網格劃分失敗,大多是這2種原因

SOLIDWORKS Flow Simulation 是直觀的流體力學 (CFD) 分析軟件&#xff0c;該軟件功能強大、操作人性化&#xff0c;快速輕松的分析產品內部或外部流體的流動情況&#xff0c;以用來改善產品性能和功能。 當流體分析運行網格劃分時&#xff0c;提示失敗。 這是由于凸起面與圓…

【LeetCode刷題】--43.字符串相乘

43.字符串相乘 方法一&#xff1a;做加法&#xff0c;模擬豎式乘法的方法計算乘積 class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0")){return "0";}String res "0";//nu…

Hadoop -hdfs的讀寫請求

1、HDFS寫數據&#xff08;宏觀&#xff09;&#xff1a; 1、首先&#xff0c;客戶端發送一個寫數據的請求&#xff0c;通過rpc與NN建立連接&#xff0c;NN會做一些簡單的校驗&#xff0c;文件是否存在&#xff0c;是否有空間存儲數據等。 2、NN就會將校驗的結果發送給客戶端…

3、基礎入門——抓包封包協議APP小程序PC應用web應用

知識點 APP&小程序&PC抓包HTTP/S數據——Charles、Fiddler、Burpsuit;程序進程&網絡接口&其他協議抓包——Wireshark、科來網絡分析系統、TCPDump(linux)&#xff1b;通訊類應用封包分析發送接收——WPE四件套封包、科來網絡分析系統。模擬器&#xff1a;逍遙…

解決requests庫進行爬蟲ip請求時遇到的錯誤的方法

目錄 一、超時錯誤 二、連接錯誤 三、拒絕服務錯誤 四、內容編碼錯誤 五、HTTP錯誤 在利用requests庫進行網絡爬蟲的IP請求時&#xff0c;我們可能會遇到各種錯誤&#xff0c;如超時、連接錯誤、拒絕服務等等。這些錯誤通常是由目標網站的限制、網絡問題或我們的爬蟲代碼中…

前端性能優化總結

這里寫目錄標題 頁面性能測試工具測試指標 前端頁面性能常見的問題前端頁面性能優化常見策略及方案dns優化------預解析域名&#xff08;異步進行&#xff09;http請求優化減少請求次數同時多開持久連接 前面面試url從輸入到確認搜索發生了什么js介紹new一個對象的過程&#xf…

Linux 進程等待

在2號手冊里查wait&#xff08;&#xff09;。wait()等待任意一個子進程的狀態。 wait&#xff08;&#xff09;等待成功會返回該子進程的id,返回失敗會返回-1&#xff1a; 小實驗 子進程的退出碼 子進程執行work()&#xff0c;父進程wait子進程。 子進程跑完5秒之后就e…

GCANet_Gated context aggregation network for image dehazing and deraining

2019、中科大港科、有代碼 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

丟掉破解版,官方免費了!!!

哈嘍&#xff01;大家好。 幾天不見&#xff0c;今天給大家帶來一款海外的神器&#xff0c;官方宣布完全免費&#xff0c;但僅限于個人與教育用途&#xff0c;切勿商用噢&#xff01; 不要看這個軟件名字普普通通&#xff0c;實際上內蘊乾坤&#xff01; 接下來看我給大家炫一…

隊列的實現和OJ練習(c語言)

目錄 概念 隊列的實現 利用結構體存放隊列結構 為什么單鏈表不使用這種方法&#xff1f; 初始化隊列 小提示&#xff1a; 隊尾入隊列 隊頭出隊列 獲取隊頭元素 獲取隊尾元素 獲取隊列中有效元素個數 檢測隊列是否為空 銷毀隊列 最終代碼 循環隊列 隊列的OJ題 …