Python?VTK映射三維模型表面距離
數(shù)據(jù)準(zhǔn)備: 需要準(zhǔn)備兩個(gè)stl文件、Python需要安裝vtk庫(kù)
步驟一:數(shù)據(jù)讀取 首先通過(guò)vtk.vtkSTLReader() 定義stl文件讀取接口,再通過(guò)reader1.GetOutput() 就可以獲得stl在vtk工作流的數(shù)據(jù)。
步驟二:去除重復(fù)點(diǎn) 通過(guò)vtk.vtkCleanPolyData() 可以去除模型中的重復(fù)點(diǎn)
步驟三:計(jì)算距離 使用 vtk.vtkDistancePolyDataFilter() ,使用上一步中過(guò)濾掉重復(fù)點(diǎn)后的數(shù)據(jù)作為輸入。如distanceFilter.SetInputConnection(1, clean1.GetOutputPort()), 其中第一個(gè)參數(shù)就是輸入數(shù)據(jù)的標(biāo)號(hào),從0開(kāi)始計(jì)數(shù);第二個(gè)參數(shù)就是輸入的數(shù)據(jù)。我們將vtkDistancePolyDataFilter的輸出到mapper就完成距離映射了。
步驟四:顏色配置 lut = vtk.vtkLookupTable() 相當(dāng)于一個(gè)調(diào)色盤(pán)函數(shù),通過(guò)對(duì)其參數(shù)改變可以,調(diào)整最終映射的顏色范圍。 scalarBar = vtk.vtkScalarBarActor() 就是顏色條,按照前面的調(diào)色盤(pán)的結(jié)果將距離數(shù)值映射成顏色。
import vtk input1 = vtk.vtkPolyData() reader1 = vtk.vtkSTLReader() reader1.SetFileName('model1.stl') reader1.Update() input1 = reader1.GetOutput() # 讀取模型A input2 = vtk.vtkPolyData() reader2 = vtk.vtkSTLReader() reader2.SetFileName('model2.stl') reader2.Update() input2 = reader2.GetOutput() # 讀取模型B # 數(shù)據(jù)合并,可以合并顯示兩個(gè)模型 clean1 = vtk.vtkCleanPolyData() clean1.SetInputData(input1) clean2 = vtk.vtkCleanPolyData() clean2.SetInputData(input2) distanceFilter = vtk.vtkDistancePolyDataFilter() distanceFilter.SetInputConnection(1, clean1.GetOutputPort()) distanceFilter.SetInputConnection(0, clean2.GetOutputPort()) distanceFilter.SignedDistanceOff() distanceFilter.Update() # 計(jì)算距離 distanceFilter.GetOutputPort() mapper = vtk.vtkPolyDataMapper() # 配置mapper mapper.SetInputConnection(distanceFilter.GetOutputPort()) mapper.SetScalarRange( # 設(shè)置顏色映射范圍 distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[0], distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[1]) actor = vtk.vtkActor() actor.SetMapper(mapper) actor1 = vtk.vtkActor() actor1.SetMapper(mapper) lut = vtk.vtkLookupTable() lut.SetHueRange(0.2, 0.7) # 映射的顏色變換參數(shù)(自己調(diào)顏色) # lut.SetAlphaRange(1.0, 1.0) # lut.SetValueRange(1.0, 1.0) # lut.SetSaturationRange(1.0, 1.0) # lut.SetNumberOfTableValues(256) mapper.SetLookupTable(lut) mapper2 = vtk.vtkPolyDataMapper() mapper2.SetInputData((distanceFilter.GetSecondDistanceOutput())) mapper2.SetScalarRange( # 設(shè)置顏色映射范圍 distanceFilter.GetSecondDistanceOutput().GetPointData().GetScalars().GetRange()[0], distanceFilter.GetSecondDistanceOutput().GetPointData().GetScalars().GetRange()[1]) actor2 = vtk.vtkActor() actor2.SetMapper(mapper2) scalarBar = vtk.vtkScalarBarActor() # 設(shè)置color_bar scalarBar.SetLookupTable(mapper.GetLookupTable()) scalarBar.SetTitle("SD(mm)") scalarBar.SetNumberOfLabels(5) # 設(shè)置要顯示的刻度標(biāo)簽數(shù)。自己設(shè)定色帶的位置 scalarBar.SetMaximumNumberOfColors(10) # scalarBar.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() # scalarBar.GetPositionCoordinate().SetValue(0.01, 0.49) # 參數(shù)越小越靠左,第二個(gè)參數(shù)越大越往上 # scalarBar.SetWidth(0.16) # scalarBar.SetHeight(0.5) # scalarBar.SetTextPositionToPrecedeScalarBar() # 標(biāo)題和刻度標(biāo)記是否應(yīng)在標(biāo)量欄之前(文字會(huì)出現(xiàn)在條形左邊) # # 設(shè)置標(biāo)題和條形之間的邊距 # scalarBar.SetVerticalTitleSeparation(10) # # 設(shè)置標(biāo)題顏色 scalarBar.DrawTickLabelsOn() scalarBar.GetTitleTextProperty().SetColor(0, 0, 0) scalarBar.GetLabelTextProperty().SetColor(0, 0, 0) arender = vtk.vtkRenderer() arender.SetViewport(0, 0.0, 1, 1.0) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(arender) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) style = vtk.vtkInteractorStyleTrackballActor() iren.SetInteractorStyle(style) aCamera = vtk.vtkCamera() aCamera.SetViewUp(0, 0, -1) aCamera.SetPosition(0, -1, 0) aCamera.ComputeViewPlaneNormal() aCamera.Azimuth(30.0) aCamera.Elevation(30.0) aCamera.Dolly(1.5) arender.AddActor(actor) # arender.AddActor(actor1) arender.SetActiveCamera(aCamera) arender.ResetCamera() arender.SetBackground(1, 1, 1) arender.ResetCameraClippingRange() arender.AddActor2D(scalarBar) renWin.Render() iren.Initialize() iren.Start()
結(jié)果示例:
到此這篇關(guān)于Python VTK映射三維模型表面距離的文章就介紹到這了,更多相關(guān)Python VTK 映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)批量注冊(cè)網(wǎng)站用戶的示例
今天小編就為大家分享一篇python實(shí)現(xiàn)批量注冊(cè)網(wǎng)站用戶的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02django的settings中設(shè)置中文支持的實(shí)現(xiàn)
這篇文章主要介紹了django的settings中設(shè)置中文支持的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Python實(shí)現(xiàn)人臉識(shí)別并進(jìn)行視頻跟蹤打碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)人臉識(shí)別并進(jìn)行視頻跟蹤打碼效果,羞羞的畫(huà)面統(tǒng)統(tǒng)打上馬賽克,感興趣的小伙伴可以了解一下2023-03-03python基礎(chǔ)學(xué)習(xí)之如何對(duì)元組各個(gè)元素進(jìn)行命名詳解
python的元祖和列表類似,不同之處在于元祖的元素不能修改,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)學(xué)習(xí)之如何對(duì)元組各個(gè)元素進(jìn)行命名的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽
這篇文章主要為大家詳細(xì)介紹了python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解)
這篇文章主要介紹了Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01