日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道79:交互与拾取_单位拾取

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道79:交互与拾取_单位拾取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.單位拾取

示例代碼: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkInteractionStyle) VTK_MODULE_INIT(vtkRenderingFreeType)#include <vtkSmartPointer.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>#include <vtkInteractorStyleTrackballCamera.h> #include <vtkDataSetMapper.h> #include <vtkCellPicker.h> #include <vtkSelectionNode.h> #include <vtkSelection.h> #include <vtkRendererCollection.h> #include <vtkExtractSelection.h> #include <vtkObjectFactory.h>/**************************************************************************/ class CellPickerInteractorStyle :public vtkInteractorStyleTrackballCamera { public:static CellPickerInteractorStyle* New();CellPickerInteractorStyle(){selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();selectedActor = vtkSmartPointer<vtkActor>::New();}virtual void OnLeftButtonDown(){int* pos = this->GetInteractor()->GetEventPosition();vtkSmartPointer<vtkCellPicker> picker =vtkSmartPointer<vtkCellPicker>::New();picker->SetTolerance(0.0005);picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());if (picker->GetCellId() != -1){vtkSmartPointer<vtkIdTypeArray> ids =vtkSmartPointer<vtkIdTypeArray>::New();ids->SetNumberOfComponents(1);ids->InsertNextValue(picker->GetCellId());vtkSmartPointer<vtkSelectionNode> selectionNode =vtkSmartPointer<vtkSelectionNode>::New();selectionNode->SetFieldType(vtkSelectionNode::CELL);selectionNode->SetContentType(vtkSelectionNode::INDICES);selectionNode->SetSelectionList(ids);vtkSmartPointer<vtkSelection> selection =vtkSmartPointer<vtkSelection>::New();selection->AddNode(selectionNode);vtkSmartPointer<vtkExtractSelection> extractSelection =vtkSmartPointer<vtkExtractSelection>::New();extractSelection->SetInputData(0, polyData);extractSelection->SetInputData(1, selection);extractSelection->Update();selectedMapper->SetInputData((vtkDataSet*)extractSelection->GetOutput());selectedActor->SetMapper(selectedMapper);selectedActor->GetProperty()->EdgeVisibilityOn();selectedActor->GetProperty()->SetEdgeColor(1, 0, 0);selectedActor->GetProperty()->SetLineWidth(3);this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);}vtkInteractorStyleTrackballCamera::OnLeftButtonDown();} private:vtkSmartPointer<vtkPolyData> polyData;vtkSmartPointer<vtkDataSetMapper> selectedMapper;vtkSmartPointer<vtkActor> selectedActor; }; /*********************************************************************************/vtkStandardNewMacro(CellPickerInteractorStyle);int main() {vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(sphereSource->GetOutput());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->GetProperty()->SetColor(0, 1, 0);actor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(1, 1, 1);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->Render();rw->SetWindowName("CellPicker Interaction");rw->AddRenderer(renderer);vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw); /****************************************************************************/vtkSmartPointer<CellPickerInteractorStyle> style =vtkSmartPointer<CellPickerInteractorStyle>::New();style->SetDefaultRenderer(renderer);//style->polyData = sphereSource->GetOutput();rwi->SetInteractorStyle(style);rw->Render();rwi->Initialize();rwi->Start();return 0; }輸出結果如下:
CellPickerInteractorStyle類同樣派生自vtkInteraTrackballCamera,并通過重載該函數類的OnLeftButtonDown()函數來處理鼠標左鍵消息。PolyData為被拾取的模型數據,需要通過外部設置。在響應鼠標左鍵消息時,首先定義vtkCellPicker對象,使用Pick()函數實現拾取功能。拾取完畢,即可通過GetCellId()函數來得到當前拾取的單元索取號。 為了更方便地顯示拾取的結果,可實現單元邊的高亮顯示。這里就涉及了vtkPolyData的局部數據提取功能。實現該功能時使用了幾個新的類。
  • vtkIdTypeArray:對象存儲當前選中的單位的索引號,每次只選取一個單元,因此每次該對象僅有一個索引號;
  • vtkSelectedNode對象與vtkSelection對象通常搭配使用,vtkSelection實際上是一個vtkSelectionNode的數組,而vtkSelectionNode則聲明了要提取的數據的類型,這里SetFiledType()設置數據的類型為單元,SeiContentType()設置數據的內容為索引號。
  • vtkExtractSelection:實現了數據提取功能,其第一個輸入為被提取的vtkPolyData,第二個輸入為vtkSelection對象,標記要提取的數據類型。
提取完畢,即可將提取的結果保存至一個vtkActor對象,并添加至當前的vtkRenderer中顯示。

2.參看資料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.

總結

以上是生活随笔為你收集整理的VTK修炼之道79:交互与拾取_单位拾取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。