我正在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,以查看两个网格。在下面的图片中,您可以看到绿色的网格已完全移动,但是我要缩放以使绿色的网格完全在原始的黄色网格内。
答案 0 :(得分:1)
简单的答案(没有解释)可以在这里找到:Scaling 3D models, finding the origin
这是因为缩放变换的定义很简单,就是将坐标乘以给定的因子(例如,参见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)和平局-看到区别了吗?