我在python中使用VTK来导入.stl文件。那么我想要做的是缩小网格并使其更小而不改变方向矩阵。
我尝试了带有比例元组的vtkTransform
,但问题是缩放的polydata正在旋转。
这是代码:
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以查看两个网格。在下面的图片中,您可以看到绿色的一个完全移动,但我想缩放,所以绿色的完全在原始的黄色网格内。
简单的答案(没有解释)可以在这里找到:Scaling 3D models, finding the origin
这是因为缩放变换简单地定义为将坐标乘以给定因子(参见例如https://www.tutorialspoint.com/computer_graphics/3d_transformation.htm)。这本质上意味着它是针对某个参考点完成的。您的transform.Scale()调用将使用原点(0,0,0)作为此参考点,并且由于您的对象显然不是以原点为中心,因此您获得了翻译(而不是您声称的旋转)。
要获得局部中心缩放,您需要在对象周围选择一个参考点R(在您的情况下,因为您希望缩放的对象位于原始对象内,您需要某种中心 - 因为对象是“几乎凸出”,质心 - 所有点的平均值 - 可能足够好)。通过-R转换对象以使其与坐标系对齐,缩放,然后通过+ R转换回来。
尝试一点练习可视化:简单的2D示例 - 绘制一个由坐标(2,2),(2,3),(3,3),(3,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)和平局 - 看到区别?