[英]How to scale a PolyData in vtk without translating it?
我在python中使用VTK導入.stl文件。 那么我想做的就是縮小網格並使其更小而不更改方向矩陣。
我嘗試使用帶有刻度元組的vtkTransform
,但問題是縮放的多數據正在旋轉。
這是代碼:
def scaleSTL(filenameSTL, opacity=0.75, scale=(1,1,1), mesh_color="gold"):
colors = vtk.vtkNamedColors()
reader = vtk.vtkSTLReader()
reader.SetFileName(filenameSTL)
reader.Update()
transform = vtk.vtkTransform()
transform.Scale(scale)
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetInputConnection(reader.GetOutputPort())
transformFilter.SetTransform(transform)
transformFilter.Update()
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(transformFilter.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(colors.GetColor3d(mesh_color))
actor.GetProperty().SetOpacity(opacity)
return actor
def render_scene(my_actor_list):
renderer = vtk.vtkRenderer()
for arg in my_actor_list:
renderer.AddActor(arg)
namedColors = vtk.vtkNamedColors()
renderer.SetBackground(namedColors.GetColor3d("SlateGray"))
window = vtk.vtkRenderWindow()
window.SetWindowName("Oriented Cylinder")
window.AddRenderer(renderer)
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)
# Visualize
window.Render()
interactor.Start()
if __name__ == "__Main__":
filename = "400_tri.stl"
scale01 = (1, 1, 1)
scale02 = (0.5, 0.5, 0.5)
my_list = []
my_list.append(scaleSTL(filename, 0.75, scale01, "Gold"))
my_list.append(scaleSTL(filename, 0.75, scale02, "DarkGreen"))
render_scene(my_list)
我使用了我的網格文件kidney.stl
(黃色),但我得到的是縮放和旋轉的網格。 我將不透明度設置為0.75,以查看兩個網格。 在下面的圖片中,您可以看到綠色的網格已完全移動,但是我要縮放,因此綠色的網格完全在原始的黃色網格內。
可以在此處找到簡單答案(無解釋): 縮放3D模型,找到起點
那是因為縮放變換被簡單地定義為將坐標乘以給定的因子(例如,參見https://www.tutorialspoint.com/computer_graphics/3d_transformation.htm )。 從本質上講,這是相對於某個參考點完成的。 您的transform.Scale()調用將使用原點(0,0,0)作為該參考點,並且由於您的對象顯然不在原點中心,因此可以得到平移(而不是聲稱btw為旋轉)。
要獲得局部居中的縮放比例,您需要在要縮放的對象上選擇參考點R(在這種情況下,由於您希望縮放后的對象位於原始對象之內,因此您需要某種中心-對象是“幾乎是凸的”,質心-所有點的平均值-可能足夠好)。 用-R平移對象以使其與坐標系對齊,縮放,然后再按+ R平移。
嘗試一下練習以直觀地看到這一點:簡單的2D示例-自己繪制一個由坐標為(2,2),(2,3),(3,3),(3,2)的點組成的正方形,然后“按2 “-您得到(4,4),(4,6),(6,6),(6,4)-也畫出它。 現在嘗試替代方法-首先通過正方形的中心(2.5,2.5)進行平移,您會得到(-0.5,-0.5),(-0.5,0.5),(0.5,0.5),(0.5,-0.5)(將其繪制) ,按2的比例縮放,則得到(-1,-1),(-1、1),(1,1),(1,-1)(繪制),最后平移2.5:(1.5,1.5), (1.5,3.5),(3.5,3.5),(3.5、1.5)和平局-看到區別了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.